sping Data jpa 的使用
一.调用封装好了的接口
1.1方法定义规范
1.2 封装接口案例
此案例写在了测试类中
@Test
void test06() {
List<User> list = userDao.findUserByUsernameStartingWith("赵");
for (User user : list) {
System.out.println("user = " + user);
}
System.out.println("================================");
List<User> user = userDao.findUserByUsernameStartingWithAndAddressEquals("赵", "广州");
System.out.println("user = " + user);
}
@Test
void test05() {
//页码从 0 开始计
Pageable pageable = PageRequest.of(1, 2);
Page<User> page = userDao.findAll(pageable);
System.out.println("总记录数= " + page.getTotalElements());
System.out.println("总页数 = " + page.getTotalPages());
System.out.println("查询结果 = " + page.getContent());
System.out.println("当前页的记录数 = " + page.getNumberOfElements());
System.out.println("页码 = " + page.getNumber());
System.out.println("是否是最后一页 = " + page.isLast());
System.out.println("是否第一页 = " + page.isFirst());
}
@Test
void test04() {
//按照 id 倒序查询
List<User> list = userDao.findAll(Sort.by(Sort.Direction.DESC, "id"));
for (User user : list) {
System.out.println("user = " + user);
}
}
@Test
void test03() {
//根据 id 查询用户
Optional<User> optional = userDao.findById(2);
User user = optional.get();
System.out.println("user = " + user);
}
@Test
void test02() {
userDao.deleteById(1);
}
@Test
void test01() {
User u = new User();
u.setId(1);
u.setAddress("深圳");
//如果id存在,则更新,否则添加
//默认是更新所有字段,建议更新的时候,先查询,再更新
userDao.saveAndFlush(u);
}
@Test
void contextLoads() {
User u = new User();
u.setUsername("张三");
u.setAddress("广州");
userDao.save(u);
}
1.3 自定义sql语句—使用 @Query 注解
1.3.1 自定义查询
例子一:Id最大的用户的信息
UserDao层
@Query(value = "select * from t_user where id=(select max(id) from t_user)"
,nativeQuery = true)
User maxIdUser();
Test
@Test
void maxIdUser(){
System.out.println("userDao.maxIdUser() = " + userDao.maxIdUser());
}
注意:
nativeQuery = true,以执行原生sql语句,所谓原生sql,也就是说这段sql拷贝到数据库中,然后把参数值给一下就能运行了
nativeQuery = false时,就不是原生sql,而其中的select * from xxx中xxx也不是数据库对应的真正的表名,而是对应的实体名,并且sql中的字段名也不是数据库中真正的字段名,而是实体的字段名(少去用,Hql的东西)
1.4 自定义数据修改sql(增、删除、改)语句-- @Query+@Modifying注解
1.如果自定义的SQL,涉及到数据修改,那么需要这个注解@Modifying
2.数据修改都是update语句
3.涉及到增删改的操作必须在事务内执行,用@Transactional开启事务
4.测试类如果添加了事务会默认回滚事务(底层原理,避免太多脏数据),用@Rollback(false)让事务不回滚
例子一:
Dao层
//原生的sql查询
// @Query(value = "update t_user set address=?1 where id=?2",nativeQuery = true)
@Query(value = "update t_user set address=:address where id=:id",nativeQuery = true)
//如果自定义的SQL,涉及到数据修改,那么需要这个注解
@Modifying
int updateAddressById(@Param("address") String address, @Param("id") Integer id);
Test
//原生的sql查询
// @Query(value = "update t_user set address=?1 where id=?2",nativeQuery = true)
@Query(value = "update t_user set address=:address where id=:id",nativeQuery = true)
//如果自定义的SQL,涉及到数据修改,那么需要这个注解
@Modifying
int updateAddressById(@Param("address") String address, @Param("id") Integer id);