IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring-Data-JPA--增删改查2——自定义接口查询 -> 正文阅读

[Java知识库]Spring-Data-JPA--增删改查2——自定义接口查询

分页

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的这种形式,这里就不演示了)

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:29:41  更:2021-08-06 09:31:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 20:26:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码