zoukankan      html  css  js  c++  java
  • Spring Data JPA在Spring Boot中的应用

    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的依赖,如下所示。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>
    • 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<UserInfo,Long> {
    }

    (4)Entity层

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

    @Entity
    @Component
    public 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<UserInfo> getUserList();
        UserInfo getUserByName(String name);
        UserInfo addUserInfo(UserInfo userInfo);
        UserInfo updateUserInfoById(UserInfo userInfo);
        void deleteUserInfoById(Long Id);
        List<UserInfo>getCurrentUserList();
        Page<UserInfo> getPageUserList();
    }
    • UserServiceImpl.java

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

    @Service
    public class UserServiceImpl implements UserService{
        @Autowired
        private UserRepository userRepository;
    
        /**
         * 获取所有用户列表
         * @return
         */
        public List<UserInfo> getUserList(){
            List<UserInfo> userList=new ArrayList<UserInfo>();
            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<UserInfo> getCurrentUserList() {
            Sort sort=new Sort(Sort.Direction.DESC,"createTime");
            return userRepository.findAll(sort);
    
        }
    
        /**
         * 获取分页的用户
         * @return
         */
        public Page<UserInfo> 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<UserInfo> getUserList() {
            return userService.getUserList();
        }
    
        @GetMapping(value = "/getUserInfo")
        public UserInfo getUserInfoByName(@RequestParam("name") String name) {
            return userService.getUserByName(name);
        }
    
        @GetMapping(value = "/getCurrentUserList")
        public List<UserInfo> getCurrentUserList(){
            return userService.getCurrentUserList();
        }
    
        @GetMapping(value="/getPageUserList")
        public Page<UserInfo> 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)

  • 相关阅读:
    计算 sql查询语句所花时间
    iframe自适应高度,以及一个页面加载多个iframe
    窗体移动API和窗体阴影API
    js复习:
    web组合查询:
    web登陆,增删改加分页。
    cookie和Session传值
    控件及其数据传输
    ASP.NET WebForm
    三月总结
  • 原文地址:https://www.cnblogs.com/TechSnail/p/7242777.html
Copyright © 2011-2022 走看看