分页
controller:
//分页
@RequestMapping("findPage")
public List<TbUser> findPage(){
return userService.findPage();
}
service:
public List<TbUser> findPage() {
Pageable pageable = PageRequest.of(0,3);
Page<TbUser> all = userDao.findAll(pageable);
all.getTotalPages();
System.out.println("总页数" + all.getTotalPages());
System.out.println("总条数" + all.getTotalElements());
System.out.println("起始页" + all.getNumber());
System.out.println("每页条数" + all.getSize());
//内容
List<TbUser> content = all.getContent();
return content;
}
查询结果?


?排序

controller:

dao:

service:

查询结果:

模糊查询,自定义接口,注意命名不能冲突
自定义查询的注意事项:
? ? ?方法名称必须以findBy或者findAllBy开头
?????findBy或者findAllBy后面紧跟domain实体类中的字段值名称
?????遵守驼峰命名法
?????属性后面紧跟sql语句中的条件符号:like equals in ?between 。。。。
?????参数的类型必须和字段的类型对应
?????多个条件可以用and或者or来连接:例如findByNameLikeAndIdGreaterThanEqual
?????参数个数要匹配。顺序要匹配,类型要匹配
?????缺陷::使用方法名称的规则太复杂,稍不注意就写错,方法名称会写很长
1.查询名字带5的
dao层:
public interface UserDao extends JpaRepository<TbUser,Integer> {
//必须让他弹出来,自己写回报错
List<TbUser> findAllByNameLike(String name);
}
controller:
//根据名称查询
@RequestMapping("findNameLike")
public List<TbUser> findNameLike(){
return userService.findNameLike();
}
service:
public List<TbUser> findNameLike() {
List<TbUser> allByNameLike = userDao.findAllByNameLike("5%");
return allByNameLike;
}
查询结果

2.查询所有含5的
修改了一下数据库

controller:
//Containing 查询多个
@RequestMapping("Containing")
public List<TbUser> Containing(){
return userService.Containing();
}
dao:
//模糊查询,Containing包含那些字
List<TbUser> findAllByNameContaining(String name);
service:?
public List<TbUser> Containing() {
List<TbUser> allByNameContaining = userDao.findAllByNameContaining("5");
return allByNameContaining;
}
测试结果:

?3.查询名称包含5且id为7的
controller:
//查询名称包含5且id为7的
@RequestMapping("findAllByNameAndId")
public List<TbUser> findAllByNameAndId(){
return userService.findAllByNameAndId();
}
dao:
//查询名称包含5且id为7的
List<TbUser> findAllByNameContainingAndIdEquals(String name,Integer id);
service:
public List<TbUser> findAllByNameAndId() {
List<TbUser> allByNameContainingAndIdEquals = userDao.findAllByNameContainingAndIdEquals("5", 7);
return allByNameContainingAndIdEquals;
}
测试结果:

?有个弊端,查询的字段越多,命名也会越来越长,比较麻烦,其他的都是一个道理
第二种查询方式(基于@Query注解的查询 两种查询方式)
@Query注解中有6个参数,
????????value参数是我们需要填入的JPQL/SQL查询语句;
????????nativeQuery参数是标识该查询是否为原生SQL查询,默认为false;
????????countQuery参数为当你需要使用到分页查询时,可以自己定义(count查询)计数查询的语句,如果该项为空但是如果要用到分页,那么就使用默认的主sql条件来进行计数查询;name参数为命名查询需要使用到的参数,一般配配合
????????@NamedQuery一起使用,这个在后面会说到;
????????countName参数作用与countQuery相似,但是使用的是命名查询的(count查询)计数查询语句;
????????countProjection为涉及到投影部分字段查询时的计数查询(count查询);关于投影查询
1.第一种Jpql
JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。 JPQL语言的语句可以是 select 语句、update 语句或delete语句,它们都通过 Query 接口封装执行。
总结示例:select 实体别名.属性名, 实体别名.属性名 from 实体名 as 实体别名 where 实体别名.实体属性 op 比较值
在写语句的时候我们可能需要使用到参数,如果是位置参数使用“?” ,如果是参数则使用 “:XX “
1.查询所有
controller:
//JpaRepository,查询所有
@RequestMapping("jpaSelectAll")
public List<TbUser> jpaSelectAll(){
return userService.jpaSelectAll();
}
dao:
//JpaRepository,查询所有
@Query(value = "from TbUser")
List<TbUser> jpaSelectAll();
service:
public List<TbUser> jpaSelectAll() {
List<TbUser> list = userDao.jpaSelectAll();
return list;
}
查询结果:

2.如果想分页的话加pageable
dao:

service:

查询结果:

3. 查询名字为555的
controller:
//查询name为555的
@RequestMapping("jpaSelectByName")
public List<TbUser> jpaSelectByName(){
return userService.jpaSelectByName();
}
dao:? ? ?1是占位符,如果有两个字段就?2有多个逐个累加
//查询name为555的
@Query(value = "from TbUser where name = ?1")
List<TbUser> jpaSelectByName(String name);
service:
public List<TbUser> jpaSelectByName() {
List<TbUser> list = userDao.jpaSelectByName("555");
return list;
}
查询结果:

?4.修改id为7的姓名
controller:
//修改 updateInfo 修改id为7的姓名
@RequestMapping("updateInfo")
public Integer updateInfo(){
return userService.updateInfo();
}
dao:
//修改 增加修改删除都要加一个注解‘
@Modifying
@Query(value = "update TbUser set name = ?1 where id = ?2 ")
Integer updateInfo(String name,Integer id);
service:
public Integer updateInfo() {
return userDao.updateInfo("张三",7);
}
测试结果:
这样的话会报错,是因为我忘记加事务了,增删改的时候都需要加

?
加一个注解,成功查询结果


?2. 第二种:sql
自定义SQL:
sql语句查询,需要加上nativeQuery = true
nativeQuery 是否使用本地查询
true为使用本地配置,即使用sql
false不开启本地配置,即使用的是jpql语句
1. sqlSelecrAll 查询所有
controller:

dao:

service:

查询结果:
?(模糊查询的话和jpql一样,用?1的这种形式,这里就不演示了)
|