SpringBoot系列:6、整合JPA

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  {
}

package org.springframework.data.jpa.repository;

@org.springframework.data.repository.NoRepositoryBean
public interface JpaRepository  extends org.springframework.data.repository.PagingAndSortingRepository, org.springframework.data.repository.query.QueryByExampleExecutor {
    java.util.List findAll();

    java.util.List findAll(org.springframework.data.domain.Sort sort);

    java.util.List findAllById(java.lang.Iterable iterable);

     java.util.List saveAll(java.lang.Iterable iterable);

    void flush();

     S saveAndFlush(S s);

    void deleteInBatch(java.lang.Iterable iterable);

    void deleteAllInBatch();

    T getOne(ID id);

     java.util.List findAll(org.springframework.data.domain.Example example);

     java.util.List findAll(org.springframework.data.domain.Example 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做修改,引入依赖


    org.springframework.boot
    spring-boot-starter-data-jpa

3.2 核心代码

UserRepository.java

public interface UserRepository extends JpaRepository {

    /**
     * 根据id集合查询
     * @param ids
     * @return
     */
    List findByIdIn(Collection 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 findAll();

    User save(User user);

    void delete(Long id);

    Page findAll(Pageable pageable);

    /**
     * 根据id集合查询
     * @param ids
     * @return
     */
    List findByIdIn(Collection 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 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 findAll(Pageable pageable) {
        return userRepository.findAll(pageable);
    }

    @Override
    public List findByIdIn(Collection 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 users = userService.findAll();
        System.out.println("findAll():"   users);

        // 通过ID列表查询
        List ids = new ArrayList<>();
        ids.add(1L);
        ids.add(2L);
        List users1 = userService.findByIdIn(ids);
        System.out.println("findByIdIn():"   users1);

        // 分页查询
        PageRequest pageRequest = new PageRequest(0, 10);
        Page 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());

    }

运行单元测试,结果如下:SpringBoot系列:6、整合JPA_第1张图片

5、源码

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

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

你可能感兴趣的:(SpringBoot,2.x)