spring jpa:
一、使用repository连接数据库,都是在dao的接口类中使用,用法统hibernate大同小异
1.直接继承JpaRepository接口,调用对应的save方法
2.dao层中实现import org.springframework.data.repository.Repository;方法(方法名须规范)
举例:
然后在controller中直接调用
对于多属性
举例:
对于like,加条件属性时加上%%
举例:
3.使用注解,继承同2那个情况,支持hql语句
举例:
@Query("from Users where name = ?1")//需要在后面加下标,低版本不需要
List<Users> queryByNameUserHQL(String name);
未加下标报错点,解决:在HQL的?号后面加上下标,从1开始
sql语句,举例:
@Query(value="select * from users where name = ?",nativeQuery = true)//navtive默认为false,即使用HQL,habernate需要转换为HQL语句
List<Users> queryByNameUserSQL(String name);
-使用query注解实行更新会出现下列错误
NOT SUPPORT DML:不支持更多的更新
小知识点:
dml:即增删改差操作
ddl:对数据库对象的操作,如表,表空间等
-使用hql实现修改:
@Query(value="update Users set name = ?1 where id =?2")//Users为对象对应的名字,而不是数据库表名
@Modifying //表示值需要执行更新操作
void updateNameById(String name,Integer id);
报错点:
对象定义成数据库错误,解决:名字改成对应的对象名
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: sers is not mapped
更新未放在事务当中,解决:添加@Transactional注解在测试类当中
Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
小知识点:
@Test
@Transactional//@Te st和@Transactional在一起是自动回滚的
@Rollback(false)//需要将回滚关闭
二、使用crudrepository接口
它是继承repository接口,即可使用父接口所有方法
更新与添加为一个方法,存在该对象进行修改,不存在执行刷新,评判标准为实体主键
三、使用PagingandSortingrepository接口,该接口实现了分页和排序处理,他继承自父对象CrudRepository
排序:
旧版本使用方法:
//定义排序规则
Order order=new Order(Direction.DESC, "id");
Sort sort=new Sort(order);
//sort对象封装了排序规则
List<Users> list=(List<Users>) this.userRepositoryPageDAO.findAll(sort);
for(Users user:list) {
System.out.println(user.toString());
}
2.3.2新版本使用:
//定义排序规则
Order order=new Order(Direction.DESC, "id");
//sort对象封装了排序规则
List<Users> list=(List<Users>) this.userRepositoryPageDAO.findAll(Sort.by(order));//这里Sort直接调用,因为封装来静态方法 。属性可为String、list<orders>、order
for(Users user:list) {
System.out.println(user.toString());
}
分页:
旧版本使用
Pageable pageable = new PageRequest(0,2);//下标从0开始,显示两条
Page<Users> page=this.userRepositoryPageDAO.findAll(pageable);
System.out.println("总套数:"+page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
List<Users> list=page.getContent();
for(Users user:list) {
System.out.println(user.toString());
}
2.3.2新版本使用
Pageable pageable = PageRequest.of(0,2);//下标从0开始,显示两条
//sort对象封装了排序规则
Page<Users> page=this.userRepositoryPageDAO.findAll(pageable);
System.out.println("总套数:"+page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
List<Users> list=page.getContent();
for(Users user:list) {
System.out.println(user.toString());
}
2.3.2排序加分页结合使用
@Test
public void testRepositoryPageAndSort() {
Page<Users> page=this.userRepositoryPageDAO.findAll(PageRequest.of(0,2,Sort.by(Direction.DESC, "id")));
System.out.println("总套数:"+page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
List<Users> list=page.getContent();
for(Users user:list) {
System.out.println(user.toString());
}
}
四、JpaRepository接口
该接口继承了PagingAndSortingRepository接口
使用类型返回不需要强制类型转换
@Test
public void testJpaRepositorySort() {
//直接使用jpareository的接口不需要强制类型转换
Page<Users> page= this.usersRepositoryDAO.findAll(PageRequest.of(0,2,Direction.DESC, "id"));
List<Users> list=page.getContent();
for(Users user:list) {
System.out.println(user.toString());
}
}
五、JPASpecificationExecutor接口
该接口主要是实现了多条件查询的支持,并且可以在查询中添加分页和排序(单独存在)
使用单查询
//root:查询对象的属性封装
//CriteriaQuery:封装了我们要查询的各个部分的信息
//CriteriaBuilder :查询条件的构造器
1:
@Test
public void testJpaSpecification1() {
//单条件查询
Specification<Users> spec=new Specification<Users>() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// TODO Auto-generated method stub
Predicate pre=criteriaBuilder.equal(root.get("name"),"张三");
return pre;
}
};
List<Users> list=this.usersRepositorySpecification.findAll(spec);
for(Users user:list) {
System.out.println(user.toString());
}
}
and多条件的叠加,2:
@Test
public void testJpaSpecification2() {
//但条件查询
Specification<Users> spec=new Specification<Users>() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// TODO Auto-generated method stub
List<Predicate> list=new ArrayList<Predicate>();
list.add(criteriaBuilder.equal(root.get("name"),"张三"));
list.add(criteriaBuilder.equal(root.get("age"),20));
Predicate[] arr=new Predicate[list.size()];
return criteriaBuilder.and(list.toArray(arr));
}
};
List<Users> list=this.usersRepositorySpecification.findAll(spec);
for(Users user:list) {
System.out.println(user.toString());
}
}
3:
@Test
public void testJpaSpecification2() {
//但条件查询
Specification<Users> spec=new Specification<Users>() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// TODO Auto-generated method stub
return criteriaBuilder.and(criteriaBuilder.equal(root.get("name"),"张三"),criteriaBuilder.equal(root.get("age"),20));
}
};
List<Users> list=this.usersRepositorySpecification.findAll(spec);
for(Users user:list) {
System.out.println(user.toString());
}