spring data:其实就是spring提供了一个操作数据的框架。而spring data jpa只是spring data框架下的一个基于JPA标准操作数据的模块。jpa编写接口就行
开启正向工程:spring.jpa.hibernate.ddl-auto=update
后台打印sql:spring.jpa.show-sql=true
Spring Data JPA 提供的核心接口
- Repository接口
- CrudRepository接口
- PagingAndSortingRepository接口、
- JpaRepository接口
- JPASpecificationExecutor接口
User实体类
-
@Table(name="t_users")
两层含义:与数据库表映射,正向工程即将的生成表 -
@GeneratedValue(strategy=GenerationType.IDENTITY)
主键生成策略
@Entity
@Table(name="t_users")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@Column(name="age")
private Integer age;
}
一、Repository接口
- 提供了方法名称命名查询方式
- 提供了基于@Query注解查询与更新
public interface UsersRepositoryByName extends Repository<User, Integer>{//integer主键类型
/*
* 方法名称
*/
//方法的名称必须要遵循驼峰式命名规则。findBy(关键字)+属性名称(首字母要大写)
//+查询条件(首字母大写)
List<User> findByName(String name);
List<User> findByNameAndAge(String name, Integer age);
List<User> findByNameLike(String name);
/*
* 使用@Query
*/
//HQL语句
@Query("from Users where name = ?")
List<User> queryByNameUseHQL(String name);
//SQL语句
@Query(value="select * from t_user where name= ?", nativeQuery=true)
List<User> queryByNameUseSQL(String name);
@Query("update Users set name = ? where id = ?")
@Modifying //需要执行一个更新操作,@query更多的是用来查询
//注意,在测试方法中要加@Transactional @Rollback(false),取消自动回滚
void updateUsersNameById(String name, Integer id);
}
二、CrudRepository接口
主要是完成一些增删改查的操作,注意:
CrudRepository接口继承Repository接口
三、PagingAndSortingRepository接口
该接口提供了分页与排序的操作。注意:该接口集成了CrudRepository接口
@Test
public void testPagingAndSortingRepositorySort() {
//Order 定义排序规则
Order order = new Order(Direction.DESC, "id");
//Sort对象封装了配排序规则
Sort sort = new Sort(order);
List<User> list = (List<User>)this.usersRepositoryPagingAndSorting.findAll(sort);
for(User users : list) {
System.out.println(users);
}
}
@Test
public void testPagingAndSortingRepositoryPaging() {
//Pageable:封装了分页的参数,当前页,每页显示的条数。注意:他的当前页是从0开始
//PageRequest(page,size) page:当前页。size:每页显示的条数
Pageable pageable = new PageRequest(0,2);
Page<User> page = this.usersRepositoryPagingAndSorting.findAll(pageable);
System.out.println("总条数"+page.getTotalElements());
System.out.println("总页数"+page.getTotalPages());
List<User> list = page.getContent();
for(User users : list) {
System.out.println(users);
}
}
还可以对分页进行排序
四、JpaRepository接口
1.该接口继承了PagingAndSortingRepository接口。对继承的父接口中的方法的返回值进行适配。(不用去转换类型了)
五、JPASpecificationExecutor接口
该接口主要是提供了多条件查询的支持,并且可以在查询中添加分页与排序。
注意:JPASpecificationExecutor是单独存在。完全独立。
@Test
public void testJpaSpecificationExecutor1() {
/**
* Specification<User>:用于封装查询条件
*/
Specification<User> spec = new Specification<User>() {
//Predicate:封装了单个的查询条件
/**
* Root<User> root:查询对象的属性的封装
* CriteriaQuery<?> query:封装了执行查询中的各个部分的信息
* CriteriaBuilder cb:查询条件的构造器。定义不同的查询条件
*/
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query,
CriteriaBuilder cb) {
// where name = '张三三' and age =20
ArrayList<Predicate> list = new ArrayList<Predicate>();
list.add(cb.equal(root.get("name"), "张三三"));
list.add(cb.equal(root.get("age"), 20));
Predicate[] arr = new Predicate[list.size()];
return cb.and(list.toArray(arr));
}
};
List<User> list = usersRepositorySpecification.findAll(spec);
}
OneToMany
@Entity
@Table(name="t_roles")
public class Roles {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="roleid")
private Integer roleid;
@Column(name="rolename")
private String rolename;
@OneToMany(mappedBy="roles")
private Set<User> users = new HashSet<User>();
}
@Entity
@Table(name="t_users")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@Column(name="age")
private Integer age;
@ManyToOne(cascade=CascadeType.PERSIST)
//CascadeType.PERSIST,连级添加
//@JoinColum:维护外检
@JoinColumn(name="roles_id")
private Roles roles;
}
关联
roles.getUsers().add(users);
users.setRoles(roles);
ManyToMany
@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
//FetchType.EAGER立即加载,连表查询用到
//@JoinTable:映射中间表
//joinColumns:当前表中的主键所关联的中间表中的外键字段
//inverseJoinColumn对面表对应的外键名字
@JoinTable(name="t_roles_menus",joinColumns=@JoinColumn(name="role_id"),inverseJoinColumn(name="memu_id"))