@org.junit.TestpublicvoidtestFindOne(){// Optional<User> user = userDao.findById(2);// System.out.println(user.get());User user = userDao.getOne(2);System.out.println(user);}@org.junit.TestpublicvoidtestApi(){long count = userDao.count();boolean b = userDao.existsById(2);}
语句操作
除了调用spring data jpa内置的api,我们也可以在dao接口中定义我们自己的方法,通过@Query声明jpql或sql语句。
@Query
value:数据库操作语句
nativeQuery:是否是原生查询,默认false,即默认使用jpql查询
@Modifying:声明当前是一个更新操作,需要修改数据库数据。
只能用于void或int/Integer的返回类型
因为需要修改数据库数据,未防止修改失败造成未知后果,需要搭配事务管理来是使用
@Transactional:添加事务管理支持
一般需要设置rollbackFor或者noRollbackFor,来表示什么情况下进行事务回滚
@Rollback:是否可以回滚,默认true
jpql查询
publicinterfaceUserDaoextendsJpaRepository<User,Integer>,JpaSpecificationExecutor<User>{@Query(value ="from User where name = :name and age = :age")publicUserfindUserByName(@Param("name")String userName,@Param("age")int age);}
jpql更新
@Query(value ="update User set name = :name where id = :id")@ModifyingpublicIntegerupdateNameById(@Param("id")int id,@Param("name")String userName);@org.junit.Test@Transactional(rollbackFor =Exception.class)//@Rollback(value = false)//如果设置为fasle,即使发生异常也不会回滚publicvoidtestJpql(){User user = userDao.findUserByName("lili",18);System.out.println(user);
userDao.updateNameById(user.getId(),"lili_2");}
原生sql语句查询
publicinterfaceUserDaoextendsJpaRepository<User,Integer>,JpaSpecificationExecutor<User>{@Query(value ="select * from user where name = :name and age = :age",nativeQuery =true)publicUserfindUserByName(@Param("name")String userName,@Param("age")int age);}
约定规则查询
spring data jpa制定了一些约定,如果按照这些约定来定义方法名,则会自动解析出sql语句。
Hibernate: select user0_.id as id1_0_, user0_.address as address2_0_, user0_.age as age3_0_, user0_.name as name4_0_, user0_.phone as phone5_0_, user0_.sex as sex6_0_ from user user0_ where user0_.name=?
User{id=3, name='tom', age=18, sex=1, address='null', phone='null'}
Hibernate: select user0_.id as id1_0_, user0_.address as address2_0_, user0_.age as age3_0_, user0_.name as name4_0_, user0_.phone as phone5_0_, user0_.sex as sex6_0_ from user user0_ where user0_.name like ? escape ?
User{id=3, name='tom', age=18, sex=1, address='null', phone='null'}
Hibernate: select user0_.id as id1_0_, user0_.address as address2_0_, user0_.age as age3_0_, user0_.name as name4_0_, user0_.phone as phone5_0_, user0_.sex as sex6_0_ from user user0_ where (user0_.name like ? escape ?) and user0_.age=?
User{id=3, name='tom', age=18, sex=1, address='null', phone='null'}
Hibernate: select user0_.id as id1_0_, user0_.address as address2_0_, user0_.age as age3_0_, user0_.name as name4_0_, user0_.phone as phone5_0_, user0_.sex as sex6_0_ from user user0_ where user0_.id between ? and ?
User{id=2, name='lili2', age=18, sex=1, address='null', phone='null'}
User{id=3, name='tom', age=18, sex=1, address='null', phone='null'}