SpringData Jpa 入门(接口)
主要来看看Spring Data JPA提供的接口,也是Spring Data JPA的核心概念:
1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。
2:CrudRepository :是Repository的子接口,提供CRUD的功能
3:PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能
4:JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。
5:JpaSpecificationExecutor:用来做负责查询的接口
6:Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可。
1.首先创建实体类,如果数据库中没有这张表的就会自动创建(通过<prop key="hibernate.hbm2ddl.auto">update</prop>)
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="users")(表的名字)
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)(主键id添加@id注解,自增序列)
@Column
private Long id;
@Column(length=20)
private String uname;
@Column(length=20)
private String sex;
@Column(length=20)
private Integer age;
@Column(length=20)
private String hobas;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="users")(表的名字)
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)(主键id添加@id注解,自增序列)
@Column
private Long id;
@Column(length=20)
private String uname;
@Column(length=20)
private String sex;
@Column(length=20)
private Integer age;
@Column(length=20)
private String hobas;
省略getterandsetter.......
2.创建接口继承Repositor
/*有两种继承方式:
(1) 通过extends Repository 继承
(2)通过注解@RepositoryDefinition(domainClass=User.class,idClass=Long.class)
两者的效果完全相同
*/
以下使用第一种方式展示:使用springdata需要省去了写sql语句的麻烦,但多了一些命名规则必须遵守。图片有总结。
public interface UserCrudDao extends CrudRepository<User, Long>{
public List<User> findByAge(Integer age);
public List<User> findByUname(String uname); //特别注意:getBy/findBy+属性名称!!!
public List<User> findByAge(Integer age);
public List<User> findByUname(String uname); //特别注意:getBy/findBy+属性名称!!!
3.写接口进行Junit测试
/**
* 测试保存对象 ,需要注意两点:1. 发送的sql语句 2. 主键返回
* 1. 如果保存的实体,有主键id,那么会执行两条sql 语句, 实体id 为原有id,非数据库自增id
* Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
* Hibernate: insert into spj_student (age, birth, create_time, name, sex) values (?, ?, ?, ?, ?)
* 2. 如果保存的实体,主键设置为null,那么只会执行一条sql 语句,实体id 为数据库中自增id
* Hibernate: insert into spj_student (age, birth, create_time, name, sex) values (?, ?, ?, ?, ?)
*/
* 测试保存对象 ,需要注意两点:1. 发送的sql语句 2. 主键返回
* 1. 如果保存的实体,有主键id,那么会执行两条sql 语句, 实体id 为原有id,非数据库自增id
* Hibernate: select studentpo0_.id as id1_0_0_, studentpo0_.age as age2_0_0_, studentpo0_.birth as birth3_0_0_, studentpo0_.create_time as create_t4_0_0_, studentpo0_.name as name5_0_0_, studentpo0_.sex as sex6_0_0_ from spj_student studentpo0_ where studentpo0_.id=?
* Hibernate: insert into spj_student (age, birth, create_time, name, sex) values (?, ?, ?, ?, ?)
* 2. 如果保存的实体,主键设置为null,那么只会执行一条sql 语句,实体id 为数据库中自增id
* Hibernate: insert into spj_student (age, birth, create_time, name, sex) values (?, ?, ?, ?, ?)
*/
结果:testfindByUnameOrHobas
忘了加上数据库了:在此处添加
testuname:(是根据uname查询的并不是模糊查询)
测试结果:testfindByAgeBetween
其他的就方法对照规则自行测试。
3.如果有些复杂的语句这个规则满足不了怎么办?
这个时候可以用到自定义语句:
图中有命名法的用法以及用法,注意:使用update和delete的时候一定要加上@Modifying这个注解,在这里使用到事务所有必须加上事务如果不加则会出现:
说明要加上事务。
在做项目的过程中这些东西都是写在业务层的可以对整体的业务层进行业务处理 @Transactional
结果不在进行演示:只要按照上面的步骤,肯定会成功的。
下面主演演示一下分页和排序的功能:
springdata jpa 功能很强大,进行分页和排序不用写大量的代码,在springdata里面已经有封装好的接口,只需要继承这个接口就可以实现:
这是DAO层的接口 :只需要继承不用定义任何方法。
下面进行测试:
这里只截图了分页部分的方法,排序加分页 ,先排序在分页。
这里给的条件是的id的倒叙age的升序,看结果
测试正确。
有的同学就会问了 如果是进行多条件的复杂的分页排序查询怎么办呢?
在这里springdata提供了一个JpaSpecificationExecutor:用来做负责查询的接口
测试:
这里Specificaion可以创建查询的条件;
完整的意思是:查询年龄大于50岁的人并且按照id的降序和年龄的升序进行排序,每页显示五条记录,从第一页开始(注意pageindex是从0开始的,
这里我进行了+1)
下面是结果:
结果正确。
相关推荐
- SpringData核心数据访问接口--CrudRepository示例
- JPA系列四:相关接口和类
- SpringBoot+JPA+cache入门
- JMeter做压力测试,先调用第一接口,拿到返回值后去调用第二个接口(小白级入门)
- spring cloud 入门(六)【容错机制二(通过方法容错),这个方法是面向接口编程,我觉得更好一些】
- 菜鸟入门帖:笔记本常见接口功能解析
- Springboot中使用多线程,无法注入Service以及Jpa接口服务
- 快速入门脑机接口:BCI基础(二)
- 快速入门脑机接口:BCI基础(一)
- 【jpa】简介和项目生成、API-初级入门
- SpringBoot-JPA入门
- PS入门小技巧18