Boot 使用JPA实现CURD
注意:本页面内容为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