findOne
- 示例代码
@Test
public void testFindOne(){
Person person = personDao.findOne(1);
System.out.println(person);
}
findAll
- 示例代码
@Test
public void testFindAll(){
List<Person> personList = personDao.findAll();
for (Person person : personList) {
System.out.println(person);
}
}
增 删 改
新增
底层就是调用了JPA的merge方法,当主键有值的时候就修改,没有值的时候就新增
- 示例代码
@Test
public void testInsert(){
Person person = new Person();
person.setName("赵之人");
person.setGender(1);
person.setBirthday(new Date());
person.setPersonAddr("元大都");
Person save = personDao.save(person);
System.out.println(save);
}
删除
- 示例代码
@Test
public void testDelete(){
personDao.delete(11);
}
更改
- 示例代码
@Test
public void testUpdate(){
Person person = new Person();
person.setPersonId(10);
person.setName("小昭");
person.setPersonAddr("明教");
personDao.save(person);
}
分页查询
测试分页查询
在hibernate中
setFirstResult 设置从第几行开始提取数据(索引从0开始)
setMaxResults 设置提取多少行数据(每页显示多少行)
personPage.forEach(person -> System.out.println(person));新学的for循环
- 示例代码
/*
* 测试分页查询
* 在hibernate中
* setFirstResult 设置从第几行开始提取数据(索引从0开始)
* setMaxResults 设置提取多少行数据(每页显示多少行)
* */
@Test
public void testPage(){
//两个参数page:页数(从0开始),size:每页条数
Pageable pageable=new PageRequest(0,5);
Page<Person> personPage = personDao.findAll(pageable);
System.out.println(personPage.getTotalElements());//总条数
System.out.println(personPage.getTotalPages());//总页数
System.out.println(personPage.getSize());//每页显示的行数
System.out.println(personPage.getNumberOfElements());//当前页有多少条数据
System.out.println(personPage.getNumber());//当前页码
List<Person> content = personPage.getContent();//当前页的数据集合
personPage.forEach(person -> System.out.println(person));
}
分页查询加排序
- 示例代码
@Test
public void testPageOrder(){
//三个参数page:页数,size:每页条数 sort:排序规则
/*
* 如果不做排序,默认会以主键id升序排序
* Sort.Direction direction 这个一个枚举,表示升序或者降序
* Sting property 排序的字段名称
* 生成 order by id desc
* */
Sort.Order order=new Sort.Order(Sort.Direction.DESC,"personId");
Sort sort=new Sort(order);
//上述代码也可以简化成这样的
//Sort sort = new Sort(Sort.Direction.DESC,"name");
Pageable pageable=new PageRequest(0,5,sort);
Page<Person> personPage = personDao.findAll(pageable);
personPage.forEach(person -> System.out.println(person));
}
简单高级查询
简单高级查询的时候只需要在dao层在定义我们需要的抽象方法即可
①抽象方法名称规则如下:方法名称必须以findBy或者findAllBy开头
②findBy或者findAllBy后面紧跟domain实体类中的字段名称
③遵从驼峰命名
④属性名称后面紧跟SQL语句中的条件符号:
⑤多个条件可以用And或者Or来连接
⑥方法的参数个数必须和条件的个数匹配
-
条件符号说明
-
示例代码
public interface PersonDao extends JpaRepository<Person,Integer> {
Person findAllByNameLike(String name);
List<Person> findAllByNameLikeAndPersonIdEquals(String name,Integer personId);
}
- 测试类
@Test
public void testSelectByNameAndPersonAddr(){
Person person = personDao.findAllByNameLike("%周%");
System.out.println(person);
}
使用@Query注解来完成高级查询
通过接口中的方法名称来指定高级查询条件的方式其实很明显
①方法名称的规则复杂
②方法名称太长,不太方便
- 示例1
@Query(" from Person")写成这样的方式,那么只能写成HQL语句
public interface PersonDao extends JpaRepository<Person,Integer> {
@Query(" from Person")
List<Person> findAll();
}
- 示例2
@Query(value = “select *from person”,nativeQuery = true)写成这样的方式,就可以使用原生的SQL进行查询了
nativeQuery = true 表示是原生SQL,默认是false
value里面是SQL语句
public interface PersonDao extends JpaRepository<Person,Integer> {
@Query(value = "select *from person",nativeQuery = true)
List<Person> findAll();
}