SpringData技术

SpringData技术

Scroll Down

SpringData入门以及一些简单的操作:

  1. SpringData是操作dao层也就是持久层框架,它实现的JPA编程规范,使用户操作数据库更加的简便。
  2. 使用SpringData给出的对DAO层的方法名的规范可以不用写sql语句,就能对数据库进行crud操作。
  3. 当在SpringBoot启动类中配置了@EnableJpaRepositories和@EntityScan,SpringData会自动的扫描到DAO层接口,以及pojo层的java Bean对象,使数据库中的表映射到实体类对象上。方便了数据的封装。
@SpringBootApplication
//扫描dao层接口
@EnableJpaRepositories(basePackages = "com.neuedu.repositroy")
//扫描Java Bean对象
@EntityScan("com.neuedu.pojo")
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Application.class, args);
    }
}

  1. 在dao层接口中,继承SpringData中的不同的接口,操作数据库的方式也不用
  • Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
  • CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
  • PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
  • JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
  • JpaSpecificationExecutor: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法
  • 他们之间存在如下关系: image.png
  1. 在SpringBoot核心配置文件中,需要对SpringData进行相关配置
spring:
  jpa:
    generate-ddl: false
    show-sql: true
    hibernate:
    ddl-auto: none

  1. 在pom文件中需要导入SpringData的依赖
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
     <version>2.1.6.RELEASE</version>
</dependency>

  1. 使用SpringData也可以在dao层写自己需要的sql语句
  • 需要使用@Query,@Modifying注解
@Modifying
@Query("update users set username =:name where id = :id")
public Integer updateUserName(@Param("name") String name , @Param("id") Integer id);

  • 需要使用?x,或者:属性名,作为占位符,第一个占位符为?1,第二个为?2,以次类推,当使用:属性名的时候需要使用在方法参数上使用@param注解声明占位符的名称

  • 表名需要使用数据库中对应的Java Bean实体类的类名,并且使用别名

  • 当进行增删改操作的时候需要在service层使用@Transactional对方法上声明事务

  1. dao层继承PagingAndSortingRepository接口可以对查询的数据进行分页
public interface UserRepository2 extends PagingAndSortingRepository<User,Integer> {
//这里的Pageable在service层需要使用of方法封装当前是第几页,每一页查询多少条数据,两个参数
    public Page<User> findAll(Pageable pageable);
}

//在service层可以通过Page<User>中的方法获取到查询的数据,总查询数
public PageResult<User> findAll(Integer sizes, Integer pages) {
        //将前端获取到的页数,每页显示数封装到Pageable上
	Pageable pageable = PageRequest.of(pages,sizes);
	//获取到返回的Page对象
        Page<User> all = repository2.findAll(pageable);
	//自定义PageResult类对数据进行封装
        PageResult<User> pageResult = new PageResult<>();
        pageResult.setDatas(all.getContent());
        pageResult.setPages(all.getTotalPages());
        pageResult.setTotal(all.getTotalElements());
        return pageResult;
    }

  1. 一对一查询,一对多查询,多对多查询
  • 一对一查询,假设,当前有一个订单表,和一个用户表,那么订单表和用户表之间存在的关系就是一个订单对应着一个用户,在查询的时候就可以通过在订单表的实体类中添加用户表的实体类对象
//在主查询的一方这里就是订单类中添加@OneToOne注解在用户属性上
/*
涉及到两个表之间的查询,需要使用@JoinColumn声明另一个表的主键以及另一个表的主键在自己表中的作为外键的列名,分别使用referencedColumnName和name属性来表明。
*/
	@OneToOne
    	@JoinColumn(referencedColumnName = "id" , name = "user_id")
    	private User user;

  • 一对多查询,假设当前有一个订单表和一个订单明细表,那么订单表和订单明细表之间就是一个一对多的关系,一个订单对应着多个明细,在订单表中添加订单明细的集合
//在主查询的一方,这里就是订单类中添加@OneToMany注解在订单明细集合上
	@OneToMany
	//同样也需要使用@JoinColumn注解声明订单明细表的主键以及在订单表中对应的外键
    	@JoinColumn(referencedColumnName = "id" , name = "order_id")
   	private List<OrderDetail> orderDetails;

  • 多对多查询,假设现在有一个订单表、商品表、订单明细表,因为一个订单可能会存在多个商品,一个商品也可能存在多个订单中,那么他们之间的关系就是多对多的关系,这时就需要一个中间表这里就是订单明细表,在这个中间表中有订单的ID,和商品的ID。在进行查询的时候只需要拿着订单表的ID去订单明细表中查询,就能查出当前订单对应的所有的商品ID,在通过商品的ID就可以直接到商品表中去查询当前订单对应的商品
//在主查询的一方,这里也就是订单类中添加@ManyToMany注解在商品集合上
    @ManyToMany
    //使用@JoinTable注解声明当前三个表之间的联系
    @JoinTable(
            //  中间表的名称
            name = "tb_orderdetail",
            //  主查询和中间表的关系,声明订单表的主键以及在订单明细表中的外键的列名
            joinColumns = {@JoinColumn(name="order_id",referencedColumnName ="id" )},
            //  次查询和中间表的关系,声明商品表的主键以及在订单明细表中的外键的列名
            inverseJoinColumns = { @JoinColumn(name="item_id",referencedColumnName ="id" ) }
        )
    private List<Item> items;