课程表

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类添加如下代码

  1. @RequestMapping(value="/adminlogin",method= RequestMethod.GET)
  2. public String adminlogin(@RequestParam(value = "pwd",defaultValue = "") String pPwd, HttpSession session) {
  3.     try {
  4.         if (pPwd.equals("mypassword")) {
  5.             session.setAttribute("admin", "管理员大大");
  6.             return "管理员大大,登录成功";
  7.         }
  8.         else
  9.         {
  10.             return "登录失败";
  11.         }
  12.     }catch (Exception e) {
  13.         return "登录失败";
  14.     }
  15. }
  16.  
  17. @RequestMapping(value="/jpatest",method= RequestMethod.GET)
  18. 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) {
  19.     MainBean mbStudent = new MainBean();
  20.     mbStudent.setName(pName);
  21.     mbStudent.setAge(pAge);
  22.     mbStudent.setGrade(pGrade);
  23.     mbStudent.setStudentClass(pStudentClass);
  24.     mbStudent.setParent_name(pParent_name);
  25.     mbStudent.setParent_mobilephone(pParent_mobilephone);
  26.     try
  27.     {
  28.         if (session.getAttribute("admin").toString().length()>0) {
  29.             mainServiceImpl.addMain(mbStudent);
  30.             return "添加学生" + mbStudent.getName() + "成功";
  31.         }
  32.         else
  33.         {
  34.             return "添加失败,没有权限";
  35.         }
  36.     }
  37.     catch (Exception e)
  38.     {
  39.         mainServiceImpl.addMain(mbStudent);
  40.         return "添加学生"+mbStudent.getName()+"失败";
  41.     }
  42. }

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

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

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

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

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


二、通过JPA获取数据

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

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

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

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

  1. @RequestMapping(value="/jpaget/{id}",method= RequestMethod.GET)
  2. public String jpaGet(@PathVariable(value = "id",required = true) Integer pId) {
  3.     try
  4.     {
  5.         MainBean mbStudent = mainServiceImpl.getMainById(pId);
  6.         Map mapStudent = new HashMap();
  7.         mapStudent.put("ID", mbStudent.getId()); //添加键和值
  8.         mapStudent.put("姓名", mbStudent.getName());
  9.         mapStudent.put("年龄", mbStudent.getAge());
  10.         mapStudent.put("年级", mbStudent.getGrade());
  11.         mapStudent.put("班级",mbStudent.getStudentClass());
  12.         mapStudent.put("父母姓名", mbStudent.getParent_name());
  13.         mapStudent.put("父母电话", mbStudent.getParent_mobilephone());
  14.         JSONObject jsonResult = (JSONObject) JSON.toJSON(mapStudent); //强制转换为JSON格式
  15.         return jsonResult.toString();
  16.     }
  17.     catch (Exception e)
  18.     {
  19.         return "未查询到数据";
  20.     }
  21. }

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

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

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

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

三、通过JPA更新数据

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

  1. @RequestMapping(value="/jpaupdate",method= RequestMethod.GET)
  2. public String jpaUpdate(@RequestParam(value = "id",defaultValue = "") Integer pId,@RequestParam(value = "item",defaultValue = "") String pItem,@RequestParam(value = "value",defaultValue = "") String pValue, HttpSession session) {
  3.     try
  4.     {
  5.         MainBean mbStudent = mainServiceImpl.getMainById(pId);
  6.         switch (pItem)
  7.         {
  8.             case "name":
  9.                 mbStudent.setName(pValue);
  10.                 break;
  11.             case "age":
  12.                 mbStudent.setAge(Integer.valueOf(pValue));
  13.                 break;
  14.             case "grade":
  15.                 mbStudent.setGrade(pValue);
  16.                 break;
  17.             case "studentclass":
  18.                 mbStudent.setStudentClass(pValue);
  19.                 break;
  20.             case "parent_name":
  21.                 mbStudent.setParent_name(pValue);
  22.                 break;
  23.             case "parent_mobilephone":
  24.                 mbStudent.setParent_mobilephone(pValue);
  25.                 break;
  26.         }
  27.         if (session.getAttribute("admin").toString().length()>0) {
  28.             mainServiceImpl.updateMain(mbStudent);
  29.             return "更新ID为" + mbStudent.getId() + "的学生信息成功";
  30.         }
  31.         else
  32.         {
  33.             return "更新失败,没有权限";
  34.         }
  35.     }
  36.     catch (Exception e)
  37.     {
  38.         return "更新失败";
  39.     }
  40. }

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

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

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

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

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


四、删除数据

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

  1. @RequestMapping(value="/jpadel",method= RequestMethod.GET)
  2. public String jpaDel(@RequestParam(value = "id",defaultValue = "") Integer pId, HttpSession session) {
  3.     try
  4.     {
  5.         if (session.getAttribute("admin").toString().length()>0) {
  6.             if (mainServiceImpl.delMain(pId))
  7.                 return "删除ID为" + pId + "的学生成功";
  8.             else
  9.                 return "删除ID为" + pId + "的学生失败";
  10.         }
  11.         else
  12.         {
  13.             return "删除失败,没有权限";
  14.         }
  15.     }
  16.     catch (Exception e)
  17.     {
  18.         return "删除失败";
  19.     }
  20. }

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

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

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

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

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

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

浏览器中会提示:

  1. 删除ID3的学生成功

五、实现跨域更新数据

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

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

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.cors.CorsConfiguration;
  4. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  5. import org.springframework.web.filter.CorsFilter;
  6.  
  7. @Configuration
  8. public class CorsConfig {
  9.  
  10.     @Bean
  11.     public CorsFilter corsFilter() {
  12.         UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  13.         CorsConfiguration config = new CorsConfiguration();
  14.         config.setAllowCredentials(true);
  15.         config.addAllowedOrigin("https://www.w3xue.com"); //允许进行跨域调用的网站,注意此处必须首先加上本应用的域名,否则就算是本应用内调用也会出现403错误。如果是允许任意网站,则设置为“*”,或者像本例一样设置特定的域,注意网址后不能有“/”和端口号。要设置多个域名则重复本语句即可。
  16.         config.setAllowCredentials(true); //允许跨越发送cookie
  17.         config.addAllowedHeader("*"); // 允许任何头
  18.         config.addAllowedMethod("*"); // 允许任何方法(如GET, POST, PUT, DELETE等)
  19.         source.registerCorsConfiguration("/**", config); //进行注册,无需更改
  20.         return new CorsFilter(source);
  21.     }
  22.     
  23. }

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


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


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

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号