课程表

Spring Boot课程

工具箱
速查手册

Boot 使用JPA实现CURD

当前位置:免费教程 » Java相关 » Spring Boot
注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue  发布时间:2019/8/26 15:34:09

在上一节中,我们已经使用 JPA连接了数据库,那么数据库的其他操作该如何进行?本章节就来介绍数据库的全套CURD(创建、更新、查找、删除)。

一、数据添加的优化

首先,我们来优化上一章节中提到的添加数据的功能。我们在这里做2个优化,第一,是加上用户自定义的参数,第二,是增加session验证。我们利用一个接口“adminlogin”,进行简单的身份验证,利用接口“adminlogin”,设置键为“admin”的session,然后,jpatest对键为“admin”的session进行判断,如果不出错,则身份验证通过。这里,“adminlogin”接口的代码非常简单,只要在地址栏加上参数“pwd=mypassword”即可,后面我们还会对这个接口进行改进。这里我们只需要明白,session验证是一种基本的安全手段。

除此之外,我们还用到了@RequestParam这个注解,这个注解的作用,是取得地址栏的参数。比如,@RequestParam(value = "name",defaultValue = "") String pName 加在方法体的参数pName前,用来为该参数赋值,而其地址栏对应的参数字符是name,而这个参数的默认值为空。

MainRestController类添加如下代码

@RequestMapping(value="/adminlogin",method= RequestMethod.GET)
public String adminlogin(@RequestParam(value = "pwd",defaultValue = "") String pPwd, HttpSession session) {
    try {
        if (pPwd.equals("mypassword")) {
            session.setAttribute("admin", "管理员大大");
            return "管理员大大,登录成功";
        }
        else
        {
            return "登录失败";
        }
    }catch (Exception e) {
        return "登录失败";
    }
}

@RequestMapping(value="/jpatest",method= RequestMethod.GET)
public String jpaTest(@RequestParam(value = "name",defaultValue = "") String pName,@RequestParam(value = "age",defaultValue = "0") Integer pAge,@RequestParam(value = "grade",defaultValue = "") String pGrade,@RequestParam(value = "studentclass",defaultValue = "") String pStudentClass,@RequestParam(value = "parent_name",defaultValue = "") String pParent_name,@RequestParam(value = "parent_mobilephone",defaultValue = "") String pParent_mobilephone, HttpSession session) {
    MainBean mbStudent = new MainBean();
    mbStudent.setName(pName);
    mbStudent.setAge(pAge);
    mbStudent.setGrade(pGrade);
    mbStudent.setStudentClass(pStudentClass);
    mbStudent.setParent_name(pParent_name);
    mbStudent.setParent_mobilephone(pParent_mobilephone);
    try
    {
        if (session.getAttribute("admin").toString().length()>0) {
            mainServiceImpl.addMain(mbStudent);
            return "添加学生" + mbStudent.getName() + "成功";
        }
        else
        {
            return "添加失败,没有权限";
        }
    }
    catch (Exception e)
    {
        mainServiceImpl.addMain(mbStudent);
        return "添加学生"+mbStudent.getName()+"失败";
    }
}

然后,我们先访问如下地址:

http://localhost:8080/jiaocheng/adminlogin?pwd=mypassword

访问这个页面后,就获得一个键为“user”的session,然后访问添加数据的这个接口地址:

http://localhost:8080/jiaocheng/jpatest?name=李四&age=11&grade=五年级&studentclass=二班&parent_name=李寻欢&parent_mobilephone=17722338899

如果没有意外,就会返回“添加学生李四成功”的信息。否则,如果session为空,或有其他错误,则提示添加失败。


二、通过JPA获取数据

现在,我们来获取刚才添加的数据。JPA有现成的数据获取的方法名规范,具体我们将在下一章节中展开,这里不再详细叙述。本小节只介绍单独一条数据的获取。

我们之前在MainServiceImpl类中已经添加了获取单个数据的方法:

//单个查找
@Override
public MainBean getMainById(Integer id) {
    return mainDao.findById(id).get();
}

现在,我们直接使用它即可。在MainRestController类中添加下面的方法:

@RequestMapping(value="/jpaget/{id}",method= RequestMethod.GET)
public String jpaGet(@PathVariable(value = "id",required = true) Integer pId) {
    try
    {
        MainBean mbStudent = mainServiceImpl.getMainById(pId);
        Map mapStudent = new HashMap();
        mapStudent.put("ID", mbStudent.getId()); //添加键和值
        mapStudent.put("姓名", mbStudent.getName());
        mapStudent.put("年龄", mbStudent.getAge());
        mapStudent.put("年级", mbStudent.getGrade());
        mapStudent.put("班级",mbStudent.getStudentClass());
        mapStudent.put("父母姓名", mbStudent.getParent_name());
        mapStudent.put("父母电话", mbStudent.getParent_mobilephone());
        JSONObject jsonResult = (JSONObject) JSON.toJSON(mapStudent); //强制转换为JSON格式
        return jsonResult.toString();
    }
    catch (Exception e)
    {
        return "未查询到数据";
    }
}

我们看到,这里使用了一个@PathVariable 的注解,它和@RequestParam 注解不同,@RequestParam 注解获取的是在地址栏问号后的参数,而@PathVariable 注解,顾名思义,获取的是路径的值。在@RequestMapping 注解的value中,有一个申明的路径变量 {id},在方法体的参数中,我们可以使用@PathVariable 注解来获取该路径的值,并且可以通过 required = true 规定它是必须的参数。例如,这个例子中,我们可以通过访问如下地址获取id为2的学生的信息:

http://localhost:8080/jiaocheng/jpaget/2

如果不出意外,我们就会获得在上一小节中添加的李四的信息:

{"姓名":"李四","父母电话":"17722338899","班级":"二班","年级":"五年级","ID":2,"父母姓名":"李寻欢","年龄":11}

三、通过JPA更新数据

通过JPA更新数据也很方便,其方法和添加数据很相似。我们来在MainRestController类添加如下方法:

@RequestMapping(value="/jpaupdate",method= RequestMethod.GET)
public String jpaUpdate(@RequestParam(value = "id",defaultValue = "") Integer pId,@RequestParam(value = "item",defaultValue = "") String pItem,@RequestParam(value = "value",defaultValue = "") String pValue, HttpSession session) {
    try
    {
        MainBean mbStudent = mainServiceImpl.getMainById(pId);
        switch (pItem)
        {
            case "name":
                mbStudent.setName(pValue);
                break;
            case "age":
                mbStudent.setAge(Integer.valueOf(pValue));
                break;
            case "grade":
                mbStudent.setGrade(pValue);
                break;
            case "studentclass":
                mbStudent.setStudentClass(pValue);
                break;
            case "parent_name":
                mbStudent.setParent_name(pValue);
                break;
            case "parent_mobilephone":
                mbStudent.setParent_mobilephone(pValue);
                break;
        }
        if (session.getAttribute("admin").toString().length()>0) {
            mainServiceImpl.updateMain(mbStudent);
            return "更新ID为" + mbStudent.getId() + "的学生信息成功";
        }
        else
        {
            return "更新失败,没有权限";
        }
    }
    catch (Exception e)
    {
        return "更新失败";
    }
}

这里,我们每次只更新一个字段,根据“item”的地址栏参数,来选择要更新的数据库字段。并且,我们需要验证身份。如果需要登录,你可以登录之前的接口:

http://localhost:8080/jiaocheng/adminlogin?pwd=mypassword

获取权限后,我们访问如下地址:

http://localhost:8080/jiaocheng/jpaupdate?id=2&item=studentclass&value=%E5%85%AD%E7%8F%AD

这个地址,作用是更新id为2的学生记录,修改项为班级(grade),值是“六班”。访问该地址后,如果没有出错,李四的班级就被调整为了“六班”,且会提示修改成功。其他数据库字段的调整,参照这个方法的具体参数switch分支就可以了。比如,要更新姓名,就把item的值设置为“name”。


四、删除数据

我们已经实现了数据的增加、查询、更新,最后我们来看下数据的删除。其实,数据的删除相当的简单。我们来在MainRestController类添加如下方法:

@RequestMapping(value="/jpadel",method= RequestMethod.GET)
public String jpaDel(@RequestParam(value = "id",defaultValue = "") Integer pId, HttpSession session) {
    try
    {
        if (session.getAttribute("admin").toString().length()>0) {
            if (mainServiceImpl.delMain(pId))
                return "删除ID为" + pId + "的学生成功";
            else
                return "删除ID为" + pId + "的学生失败";
        }
        else
        {
            return "删除失败,没有权限";
        }
    }
    catch (Exception e)
    {
        return "删除失败";
    }
}

在这之前,我们先添加一条数据:

http://localhost:8080/jiaocheng/jpatest?name=将要删除的学生&grade=一年级&studentclass=一班&parent_name=无&parent_mobilephone=18888888888

添加之后,我们再登录获取权限(如果之前获取过就可以跳过这一步):

http://localhost:8080/jiaocheng/adminlogin?pwd=mypassword

最后,我们访问这个地址,就可以删除这条ID为3的数据了:

http://localhost:8080/jiaocheng/jpadel?id=3

浏览器中会提示:

删除ID为3的学生成功

五、实现跨域更新数据

现代主流的框架,都是默认不支持跨域提交表单数据的。但是某些情况下,我们需要对外开放接口。这时,我们就可以通过“CorsFilter”这个Spring内置的库来实现开放跨域操作。

新建一个配置类,或将某个实体类作为配置类,然后加上如下代码,配置相关设置,这里在注释里已经说明了各个配置项的作用:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("https://www.w3xue.com"); //允许进行跨域调用的网站,注意此处必须首先加上本应用的域名,否则就算是本应用内调用也会出现403错误。如果是允许任意网站,则设置为“*”,或者像本例一样设置特定的域,注意网址后不能有“/”和端口号。要设置多个域名则重复本语句即可。
        config.setAllowCredentials(true); //允许跨越发送cookie
        config.addAllowedHeader("*"); // 允许任何头
        config.addAllowedMethod("*"); // 允许任何方法(如GET, POST, PUT, DELETE等)
        source.registerCorsConfiguration("/**", config); //进行注册,无需更改
        return new CorsFilter(source);
    }
    
}

项目里有这个类后,就可以允许其他网站调用你的接口了!


本章节已经实现了数据库的添加、搜索、更新、删除,已经基本可以实现对数据库的操作,但是我们仍然不能实现一些复杂的查询和操作。接下来的一节,会介绍更加灵活和复杂的查询和操作方法。


注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue  发布时间:2019/8/26 15:34:09
 友情链接:直通硅谷  点职佳 mac软件下载