美文网首页
SpringBoot系列:6、整合JPA

SpringBoot系列:6、整合JPA

作者: 程序员小H | 来源:发表于2019-10-22 08:58 被阅读0次

    1、Spring Data JPA介绍

    1.1 Spring Data JPA介绍

    Spring Data JPA(Java Persistence API),是Spring框架的主要构建块之一。如果您想使用持久数据,它也是一个强大的工具。包括以下三方面的内容:

    • 一套API标准。在javax.persistence的包下面,用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从烦琐的JDBC和SQL代码中解脱出来
    • 面向对象的查询语言:Java Persistence QueryLanguage(JPQL)。这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合
    • ORM(object/relational metadata)元数据的映射。JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中

    2、核心接口Reposity

    最底层的接口是Repository,是一个空类。Repository的子类有:

    • CrudRepository:提供了基本的增删改查等接口
    • PagingAndSortingRepository:提供了基本的分页和排序等接口
    • JpaRepository:是CrudRepository、PagingAndSortingRepository的子类,继承了它们的所有接口
    package org.springframework.data.repository;
    
    @org.springframework.stereotype.Indexed
    public interface Repository <T, ID> {
    }
    
    package org.springframework.data.jpa.repository;
    
    @org.springframework.data.repository.NoRepositoryBean
    public interface JpaRepository <T, ID> extends org.springframework.data.repository.PagingAndSortingRepository<T,ID>, org.springframework.data.repository.query.QueryByExampleExecutor<T> {
        java.util.List<T> findAll();
    
        java.util.List<T> findAll(org.springframework.data.domain.Sort sort);
    
        java.util.List<T> findAllById(java.lang.Iterable<ID> iterable);
    
        <S extends T> java.util.List<S> saveAll(java.lang.Iterable<S> iterable);
    
        void flush();
    
        <S extends T> S saveAndFlush(S s);
    
        void deleteInBatch(java.lang.Iterable<T> iterable);
    
        void deleteAllInBatch();
    
        T getOne(ID id);
    
        <S extends T> java.util.List<S> findAll(org.springframework.data.domain.Example<S> example);
    
        <S extends T> java.util.List<S> findAll(org.springframework.data.domain.Example<S> example, org.springframework.data.domain.Sort sort);
    }
    

    JPA语法特性可以参考官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

    3、集成Spring Data JPA

    3.1 新建工程

    基于上一章节springboot-mysql做修改,引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    

    3.2 核心代码

    UserRepository.java

    public interface UserRepository extends JpaRepository<User, Long> {
    
        /**
         * 根据id集合查询
         * @param ids
         * @return
         */
        List<User> findByIdIn(Collection<Long> ids);
    
    }
    

    User.java

    @Entity
    @Table(name = "t_user")
    public class User {
    
        @Id
        private Long id;
    
        @Column(name = "name")
        private String name;
    
        @Column(name = "password")
        private String password;
            //省略getter、setter、toString方法
    }
    
    • @Entity:持久化POJO类都是一个实体Bean,通过在类的定义中使用@Entity注解来进行申明
    • @Table:将此对象映射到数据库的数据库表,该注释不是必需的,如果没有,系统会使用默认值(实体的短类名)
    • @Id:指定表的主键
    • @Column:指定表的字段

    UserService.java

    public interface UserService {
    
        User findById(long id);
    
        List<User> findAll();
    
        User save(User user);
    
        void delete(Long id);
    
        Page<User> findAll(Pageable pageable);
    
        /**
         * 根据id集合查询
         * @param ids
         * @return
         */
        List<User> findByIdIn(Collection<Long> ids);
    }
    

    UserServiceImpl.java

    @Service
    public class UserServiceImpl implements UserService {
    
        @Resource
        UserRepository userRepository;
    
        @Override
        public User findById(long id) {
            return userRepository.getOne(id);
        }
    
        @Override
        public List<User> findAll() {
            return userRepository.findAll();
        }
    
        @Override
        public User save(User user) {
            return userRepository.save(user);
        }
    
        @Override
        public void delete(Long id) {
            userRepository.deleteById(id);
        }
    
        @Override
        public Page<User> findAll(Pageable pageable) {
            return userRepository.findAll(pageable);
        }
    
        @Override
        public List<User> findByIdIn(Collection<Long> ids) {
            return userRepository.findByIdIn(ids);
        }
    }
    
    • @Resource:默认按照名称进行装配,名称可以通过name属性进行指定
      • 如果没有指定name属性,当注释写在字段上时,就默认取字段名进行查找
      • 如果写在setter方法上,就默认取属性名进行装配
      • 当找不到与名称匹配的bean时,才按照类型进行装配
      • name属性一旦确定,就只会按照名称进行装配
      @Resource(name = "userRepository")
      UserRepository userRepository;
      
    • @Autowired:默认按照类型进行装配
      • 默认情况下要求依赖对象必须存在,如果要允许null值,那么可以设置required=false
      • 如果想使用名称装配,可以结合@Qualifier注解使用
      @Autowired
      @Qualifier("userRepository")
      UserRepository userRepository;
      

    4、单元测试

    @Resource
        UserService userService;
    
        @Test
        public void contextLoads() {
    
            // 查询所有数据
            List<User> users = userService.findAll();
            System.out.println("findAll():" + users);
    
            // 通过ID列表查询
            List<Long> ids = new ArrayList<>();
            ids.add(1L);
            ids.add(2L);
            List<User> users1 = userService.findByIdIn(ids);
            System.out.println("findByIdIn():" + users1);
    
            // 分页查询
            PageRequest pageRequest = new PageRequest(0, 10);
            Page<User> users2 = userService.findAll(pageRequest);
            System.out.println("page findAll():" + users2 + ", totlaPages:" + users2.getTotalPages() + ", pageSize:" + users2.getSize());
    
            // 新增数据
            User user = new User();
            user.setId(3l);
            user.setName("lindong");
            user.setPassword("123456");
            userService.save(user);
            System.out.println("save():" + userService.findAll());
    
            // 删除数据
            userService.delete(3l);
            System.out.println("delete():" + userService.findAll());
    
        }
    

    运行单元测试,结果如下:


    file

    5、源码

    GitHub:https://github.com/chenjiecg/SpringBoot.git

    本文由博客一文多发平台 OpenWrite 发布!

    相关文章

      网友评论

          本文标题:SpringBoot系列:6、整合JPA

          本文链接:https://www.haomeiwen.com/subject/kevfvctx.html