博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Data JPA在Spring Boot中的应用
阅读量:7064 次
发布时间:2019-06-28

本文共 6391 字,大约阅读时间需要 21 分钟。

转自:https://www.cnblogs.com/TechSnail/p/7242777.html

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

(2)分层

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

(3)Respository层

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

public interface UserRepository extends JpaRepository
{}

(4)Entity层

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

@Entity@Componentpublic class UserInfo {    public UserInfo() {    }    @Id    @GeneratedValue    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getJobNumber() {        return jobNumber;    }    public void setJobNumber(String jobNumber) {        this.jobNumber = jobNumber;    }    public Date getCreateTime() {        return createTime;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    private  Long id; //ID    private  String name; //姓名    private  String jobNumber; //工号    private Date createTime; //创建时间}

(5)service层

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

  • UserService.java
public interface UserService {    List
getUserList(); UserInfo getUserByName(String name); UserInfo addUserInfo(UserInfo userInfo); UserInfo updateUserInfoById(UserInfo userInfo); void deleteUserInfoById(Long Id); List
getCurrentUserList(); Page
getPageUserList();}
  • UserServiceImpl.java

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

@Servicepublic class UserServiceImpl implements UserService{    @Autowired    private UserRepository userRepository;    /**     * 获取所有用户列表     * @return     */    public List
getUserList(){ List
userList=new ArrayList
(); userList=userRepository.findAll(); return userList; } /** * 通过姓名获取用户信息 * @param name 用户姓名 * @return */ public UserInfo getUserByName(String name) { return userRepository.findByName(name); } /** * 新增用户信息 * @param userInfo 用户信息 * @return */ public UserInfo addUserInfo(UserInfo userInfo) { return userRepository.save(userInfo); } /** * 更新用户信息 * @param userInfo 用户信息 * @return */ public UserInfo updateUserInfoById(UserInfo userInfo) { return userRepository.save(userInfo); } /** * 删除用户信息 * @param id 主键Id */ public void deleteUserInfoById(Long id) { userRepository.delete(id); } /** * 获取最新的用户 * @return */ public List
getCurrentUserList() { Sort sort=new Sort(Sort.Direction.DESC,"createTime"); return userRepository.findAll(sort); } /** * 获取分页的用户 * @return */ public Page
getPageUserList() { Sort sort=new Sort(Sort.Direction.DESC,"createTime"); Pageable pageable=new PageRequest(0,5,sort); return userRepository.findAll(pageable); }}

(6)Controller层

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

@RestController@RequestMapping(value = "/test")public class TestController {    @Autowired    private UserInfo userInfo;    @Resource    private UserService userService;    /**     * 获取所有用户     * @return     */    @GetMapping(value = "/getUserList")    public List
getUserList() { return userService.getUserList(); } @GetMapping(value = "/getUserInfo") public UserInfo getUserInfoByName(@RequestParam("name") String name) { return userService.getUserByName(name); } @GetMapping(value = "/getCurrentUserList") public List
getCurrentUserList(){ return userService.getCurrentUserList(); } @GetMapping(value="/getPageUserList") public Page
getPageUserList(){ return userService.getPageUserList(); } @PutMapping(value = "/addUserInfo") public UserInfo addUserInfo(UserInfo userInfo) { return userService.addUserInfo(userInfo); } @PostMapping(value ="/updateUserInfo") public UserInfo updateUserInfo(UserInfo userInfo){ return userService.updateUserInfoById(userInfo); } @PostMapping(value="/deleteUserInfo") public void deleteUserInfo(@RequestParam("id") Long id){ userService.deleteUserInfoById(id); } @InitBinder protected void init(HttpServletRequest request, ServletRequestDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));/*TimeZone时区,解决差8小时的问题*/ binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); }

4.测试

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

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

转载于:https://www.cnblogs.com/sharpest/p/8616548.html

你可能感兴趣的文章
关于对于CSS的字体单位
查看>>
TCP协议学习总结(上)
查看>>
敏捷 扑克上的时间估算(转)
查看>>
从JDBC程序看为什么需要Mybatis
查看>>
jQuery Ajax
查看>>
压缩感知中的数学知识:稀疏、范数、符号arg min
查看>>
《JavaScript高级程序设计》笔记
查看>>
刚刚在园里看到的一个简单的做连接字符串的方法.
查看>>
JQ_简单瀑布流
查看>>
测试管理-测试问题监控
查看>>
thinkphp的taglib的使用方法
查看>>
tecplot批量导出图片_Fluent 后处理软件Tecplot宏批量处理cas,dat为图片
查看>>
锂电池放空后充不进电_充电锂电池,只几个月不用,为什么就再也充不进电了?...
查看>>
golang mutex 初始化_Golang连接池的几种实现案例
查看>>
docker可以把应用及其相关的_等离子表面处理机相关应用及其特点
查看>>
发电厂电气部分第三版pdf_喜讯、大唐锡林浩特发电厂660mw机组投产运行
查看>>
java语言新特性_Java语言的新特性
查看>>
java try finally_Java中try、finally语句中有return时的执行情况 [转]
查看>>
java io nio nio2_Java 对象序列化 NIO NIO2详细介绍及解析
查看>>
java截取字符串第二次字母_java截取字符串中出现次数最多的字母
查看>>