1.JPA

  JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品。

2.项目搭建

  本文采用IDEA搭建Spring Boot的JPA应用,Demo结构图如下:

3.具体实现

(1)配置文件

  • pom.xml里加入spring-boot-starter-data-jpa以及mysql-connector-java的依赖,如下所示。
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
  5.  
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>6.0.6</version>
  10. </dependency>
  • application.yml里加入hibernate、jpa的配置,以及返回json对日期字段的特殊处理配置,注意time-zone的设置,须与mysql的url配置一致,否则会引起时间相差8小时的问题。jpa里的show-sql作用,如果设置为true,执行程序后可以看在控制台里看到sql语句,如下所示。
  1. spring:
  2. profiles:
  3. active: product
  4. datasource:
  5. driver-class-name: com.mysql.cj.jdbc.Driver
  6. url: jdbc:mysql://localhost:3306/saascrm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
  7. username: root
  8. password: snail123
  9. jpa:
  10. hibernate:
  11. ddl-auto: update
  12. show-sql: true
  13. jackson:
  14. date-format: yyyy-MM-dd HH:mm:ss
  15. time-zone: UTC

(2)分层

  为了区别各个模块,为项目建立几个包:controller、Entity、respository、service,这是典型的MVC架构,各个层次的代表意义在此不再赘述。

(3)Respository层

   spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,需要实现JpaRepository接口

  1. public interface UserRepository extends JpaRepository<UserInfo,Long> {
  2. }

(4)Entity层

  定义了用户信息表实体UserInfo,通过Hibernate与数据库形成映射关系,如下:

  1. @Entity
  2. @Component
  3. public class UserInfo {
  4. public UserInfo() {
  5. }
  6.  
  7. @Id
  8. @GeneratedValue
  9. public Long getId() {
  10. return id;
  11. }
  12.  
  13. public void setId(Long id) {
  14. this.id = id;
  15. }
  16.  
  17. public String getName() {
  18. return name;
  19. }
  20.  
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24.  
  25. public String getJobNumber() {
  26. return jobNumber;
  27. }
  28.  
  29. public void setJobNumber(String jobNumber) {
  30. this.jobNumber = jobNumber;
  31. }
  32.  
  33. public Date getCreateTime() {
  34. return createTime;
  35. }
  36.  
  37. public void setCreateTime(Date createTime) {
  38. this.createTime = createTime;
  39. }
  40.  
  41. private Long id; //ID
  42. private String name; //姓名
  43. private String jobNumber; //工号
  44. private Date createTime; //创建时间
  45.  
  46. }

(5)service层

  定义了服务层接口以及服务层接口实现类,如下:

  • UserService.java
  1. public interface UserService {
  2. List<UserInfo> getUserList();
  3. UserInfo getUserByName(String name);
  4. UserInfo addUserInfo(UserInfo userInfo);
  5. UserInfo updateUserInfoById(UserInfo userInfo);
  6. void deleteUserInfoById(Long Id);
  7. List<UserInfo>getCurrentUserList();
  8. Page<UserInfo> getPageUserList();
  9. }
  • UserServiceImpl.java

  其中涉及单表的增删改查,还有分页查询等

  1. @Service
  2. public class UserServiceImpl implements UserService{
  3. @Autowired
  4. private UserRepository userRepository;
  5.  
  6. /**
  7. * 获取所有用户列表
  8. * @return
  9. */
  10. public List<UserInfo> getUserList(){
  11. List<UserInfo> userList=new ArrayList<UserInfo>();
  12. userList=userRepository.findAll();
  13. return userList;
  14. }
  15.  
  16. /**
  17. * 通过姓名获取用户信息
  18. * @param name 用户姓名
  19. * @return
  20. */
  21. public UserInfo getUserByName(String name) {
  22. return userRepository.findByName(name);
  23. }
  24.  
  25. /**
  26. * 新增用户信息
  27. * @param userInfo 用户信息
  28. * @return
  29. */
  30. public UserInfo addUserInfo(UserInfo userInfo) {
  31. return userRepository.save(userInfo);
  32. }
  33.  
  34. /**
  35. * 更新用户信息
  36. * @param userInfo 用户信息
  37. * @return
  38. */
  39. public UserInfo updateUserInfoById(UserInfo userInfo) {
  40. return userRepository.save(userInfo);
  41. }
  42.  
  43. /**
  44. * 删除用户信息
  45. * @param id 主键Id
  46. */
  47. public void deleteUserInfoById(Long id) {
  48. userRepository.delete(id);
  49. }
  50.  
  51. /**
  52. * 获取最新的用户
  53. * @return
  54. */
  55. public List<UserInfo> getCurrentUserList() {
  56. Sort sort=new Sort(Sort.Direction.DESC,"createTime");
  57. return userRepository.findAll(sort);
  58.  
  59. }
  60.  
  61. /**
  62. * 获取分页的用户
  63. * @return
  64. */
  65. public Page<UserInfo> getPageUserList() {
  66. Sort sort=new Sort(Sort.Direction.DESC,"createTime");
  67. Pageable pageable=new PageRequest(0,5,sort);
  68. return userRepository.findAll(pageable);
  69. }
  70.  
  71. }

(6)Controller层

  其中,日期格式需要做转换,在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。

  1. @RestController
  2. @RequestMapping(value = "/test")
  3. public class TestController {
  4.  
  5. @Autowired
  6. private UserInfo userInfo;
  7.  
  8. @Resource
  9. private UserService userService;
  10.  
  11. /**
  12. * 获取所有用户
  13. * @return
  14. */
  15. @GetMapping(value = "/getUserList")
  16. public List<UserInfo> getUserList() {
  17. return userService.getUserList();
  18. }
  19.  
  20. @GetMapping(value = "/getUserInfo")
  21. public UserInfo getUserInfoByName(@RequestParam("name") String name) {
  22. return userService.getUserByName(name);
  23. }
  24.  
  25. @GetMapping(value = "/getCurrentUserList")
  26. public List<UserInfo> getCurrentUserList(){
  27. return userService.getCurrentUserList();
  28. }
  29.  
  30. @GetMapping(value="/getPageUserList")
  31. public Page<UserInfo> getPageUserList(){
  32. return userService.getPageUserList();
  33. }
  34.  
  35. @PutMapping(value = "/addUserInfo")
  36. public UserInfo addUserInfo(UserInfo userInfo) {
  37. return userService.addUserInfo(userInfo);
  38. }
  39.  
  40. @PostMapping(value ="/updateUserInfo")
  41. public UserInfo updateUserInfo(UserInfo userInfo){
  42. return userService.updateUserInfoById(userInfo);
  43. }
  44.  
  45. @PostMapping(value="/deleteUserInfo")
  46. public void deleteUserInfo(@RequestParam("id") Long id){
  47. userService.deleteUserInfoById(id);
  48. }
  49.  
  50. @InitBinder
  51. protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
  52. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  53. dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));/*TimeZone时区,解决差8小时的问题*/
  54. binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
  55. }

4.测试

  Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。

  本文借助PostMan工具进行测试,如下图所示。(注意事项,如果选择PUT请求,那么只能选x-www-form-urlencoded)

Spring Data JPA在Spring Boot中的应用的更多相关文章

  1. 使用Spring Data JPA的Spring Boot

    本文教你开始使用Spring Data JPA.来自优锐课JAVA架构专业讲师精心整理. 欢迎使用带有Spring Data JPA的Spring Boot教程!在本教程中,我们将看到Spring D ...

  2. Spring Data JPA 整合Spring

    1.1   Spring Data JPA 与 JPA和hibernate之间的关系 JPA是一套规范,内部是有接口和抽象类组成的.hibernate是一套成熟的ORM框架,而且Hibernate实现 ...

  3. Spring Data JPA简介 Spring Data JPA特点

    Spring Data JPA 是Spring基于ORM框架.JPA规范的基础上封装的一套JPA 应用框架,底层使用了Hibernate 的JPA技术实现,可使开发者用极简的代码即可实现对数据的访问和 ...

  4. 整合Spring Data JPA与Spring MVC: 分页和排序

    之前我们学习了如何使用Jpa访问关系型数据库.比较完整Spring MVC和JPA教程请见Spring Data JPA实战入门,Spring MVC实战入门. 通过Jpa大大简化了我们对数据库的开发 ...

  5. 整合Spring Data JPA与Spring MVC: 分页和排序pageable

    https://www.tianmaying.com/tutorial/spring-jpa-page-sort Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学 ...

  6. <Spring Data JPA>二 Spring Data Jpa

    1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  7. Spring Data JPA 整合Spring 第二篇

    主要是在CustomerDao中去写一些代码,在调用Query中去用SQL 例如 public interface CustomerDao extends JpaRepository<Custo ...

  8. spring data jpa和spring data redis同时配置时,出现Multiple Spring Data modules found, entering strict repository configuration mode错误

    问题说明 data jpa和data redis同时配置时,出现Spring modules spring Spring Data Release Train <dependencyManage ...

  9. 【spring data jpa】spring data jpa 中的update 更新字段,如果原字段值为null不处理,不为null则在原来的值上加一段字符串

    示例代码: /** * 如果barCode字段值为null则不处理 * 如果barCode字段值不为null则在原本值的前面拼接 del: * @param dealer * @return */ @ ...

随机推荐

  1. js对手机软键盘的监听

    js还没有办法对手机软键盘直接进行监听的,但是可以有其他角度来判断软键盘是否弹起.比如输入框是否获取焦点等.focusin和focusout支持冒泡,对应focus和blur, 使用focusin和f ...

  2. Webpack 代码分离

    Webpack 代码分离 代码分离是 webpack 中最引人注目的特性之一. 你可以把你的代码分离到不同的 bundle 中,然后你就可以去按需加载这些文件. 总的来说, webpack 分离可以分 ...

  3. 用javascript实现java的Map

    function Map(){ var obj={}; //空的容器 //put方法 this.put=function(key,value){ obj[key]=value; //把键值绑定到obj ...

  4. JS事件及其兼容用法

    JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 1.事件流:描述的是从页面中接收事件的顺序. IE提出的事件冒泡流:事件开始由最具体的 ...

  5. springmvc 之 helloworld

    构建SPRINGMVC主要分为几个部分(大体方式为创建并配置2个XML文件.一个JAVA文件及一个JSP文件). 一.创建动态JAVA WEB项目  //创建项目并导入JAR包. 二.创建并配置ser ...

  6. vmware克隆虚拟机后网卡名称及网络地址xiuf

    使用vmware克隆虚拟机后,若原主机网卡名称为eth0,那么克隆后的主机使用ifconfig查看仅能看到一个名称为eth1的网卡 并且在/etc/sysconfig/network-scripts/ ...

  7. mac+phpstorm增加xdebug调试

    一.版本信息 mac 10.10.5 phpstorm 10.0.3 xdebug   版本需要与phpstorm匹配,匹配地址 点我匹配  点我查看所有版本 提示:不确定xdebug版本的,把php ...

  8. 在React中使用Redux

    这是Webpack+React系列配置过程记录的第六篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  9. DOM 和 BOM 的 对象 和方法

    DOM   对象 有 documet  event element  attlibute 方法  getElementById   getElementsBytagname  getElementsB ...

  10. phpstorm显示行号

    在Windows上. 其View->Active Editor->Show Line Numbers (仅适用于当前和变化File->Settings->Editor-> ...