Sql构建

Sql构建

SQL 构建对象介绍

  • 之前通过注解开发时,相关 SQL 语句都是直接拼写的,一些关键字写起来比较麻烦、而且容易出错

  • MyBatis 提供了 org.apache.ibatis.jdbc.SQL 功能类,专门用于构建 SQL 语句

在这里插入图片描述

sql拼接测试:

public class SqlTest {public static void main(String[] args) {String sql = getSql();System.out.println(sql);}public static String getSql(){String sql =new SQL(){{SELECT("*");FROM("student");}}.toString();return sql;}
}

1. 查询功能的实现

  • 定义功能类并提供获取查询的 SQL 语句的方法

  • @SelectProvider:生成查询用的 SQL 语句注解

  • type 属性:生成 SQL 语句功能类对象

  • method 属性:指定调用方法

1.1 构建成SQL语句功能类对象

public class ReturnSql {//定义方法,返回查询的sql语句public String getSelectAll(){return new SQL(){{SELECT("*");FROM("t_user");}}.toString();}
}

更改mapper接口方法:

public interface UserMapper {// @Select("select * from t_user")@SelectProvider(type = ReturnSql.class,method = "getSelectAll")public List<User> selectAll();
}

1.2 实现动态SQL查询

根据id和名字查询用户信息:

public String getFindUser(User user){return new SQL() {{SELECT("*");FROM("t_user");if(user.getId()!=0){WHERE("id=#{id}");}if (user.getUsername()!=null && user.getUsername()!=""){AND().WHERE("username =#{username}");}}}.toString();}

mapper文件:

@SelectProvider(type = ReturnSql.class,method = "getFindUser")public List<User> findColl(User user);

测试代码:

 @Testpublic  void test02(){SqlSession sqlSession = MybatisUtils.getSqlSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user=new User();user.setId(4);user.setUsername("小马");List<User> coll = mapper.findColl(user);for (User user1 : coll) {System.out.println(user1);}}

根据名字和地址模糊查询

功能类对象里面编写方法:

 public String getLikeUser(User user){return new SQL() {{SELECT("*");FROM("t_user").WHERE("1=1");if (user.getUsername()!=null && user.getUsername()!=""){AND().WHERE("username like concat('%',#{username},'%')");}if(user.getAddress()!=null && user.getAddress()!=""){AND().WHERE("address like concat('%',#{address},'%')");}}}.toString();}

mapper接口里面编写:

 @SelectProvider(type = ReturnSql.class,method = "getLikeUser")public List<User> findLike(User user);

测试类编写:

 @Testpublic  void test02(){SqlSession sqlSession = MybatisUtils.getSqlSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user=new User();user.setUsername("小");user.setAddress("郑");List<User> coll = mapper.findLike(user);for (User user1 : coll) {System.out.println(user1);}}

2. 新增功能的实现

  • 定义功能类并提供获取新增的 SQL 语句的方法

  • @InsertProvider:生成新增用的 SQL 语句注解

  • type 属性:生成 SQL 语句功能类对象

  • method 属性:指定调用方法

2.1 编写功能类对象

 //定义方法,返回新增的sql语句public String getInsert(User user) {return new SQL() {{INSERT_INTO("t_user");INTO_VALUES("#{id},#{username},#{sex},#{address},#{birthday}");}}.toString();}

2.2 编写mapper接口方法

 //@Insert("INSERT INTO user VALUES (#{id},#{username},#{sex},#{address},#{birthday})")@InsertProvider(type = ReturnSql.class,method = "getInsert")public Integer insert(User user);

2.3 编写测试类

 @Testpublic void test03(){SqlSession sqlSession = MybatisUtils.getSqlSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user=new User();// user.setId();user.setUsername("李名");user.setAddress("新乡");user.setSex("男");user.setBirthday(Date.valueOf("2022-09-08"));Integer insert = mapper.insert(user);System.out.println(insert);}

3. 修改功能的实现

  • 定义功能类并提供获取修改的 SQL 语句的方法

  • @UpdateProvider:生成修改用的 SQL 语句注解

  • type 属性:生成 SQL 语句功能类对象

  • method 属性:指定调用方法

代码实现:

3.1 编写功能类对象

 //定义方法,返回修改的sql语句public String getUpdate(User user) {return new SQL() {{UPDATE("t_user");SET("username=#{username}","sex=#{sex}");WHERE("id=#{id}");}}.toString();}

3.2 编写mapper接口类

  //修改功能
//@Update("UPDATE student SET  username=#{username},sex=#{sex} where id=#{id}")@UpdateProvider(type = ReturnSql.class , method = "getUpdate")public abstract Integer update(User user);

3.3 测试运行

   @Testpublic void test03(){SqlSession sqlSession = MybatisUtils.getSqlSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user=new User();user.setId(9);user.setUsername("李明");user.setAddress("新乡");user.setSex("男");user.setBirthday(Date.valueOf("2022-09-08"));Integer update = mapper.update(user);System.out.println(update);}

4. 动态sql实现修改模式

4.1 编写功能类

 //动态sql实现修改public String doUpdate(User user){return  new SQL(){{UPDATE("t_user");if(user.getUsername()!=null){SET("username=#{username}");}if (user.getSex()!=null){SET("sex=#{sex}");}if(user.getAddress()!=null){SET("address=#{address}");}if (user.getId()!=null){WHERE("id=#{id}");}}}.toString();}

4.2 编写mapper接口方法

@UpdateProvider(type = ReturnSql.class , method = "doUpdate")public abstract Integer update(User user);

5. 删除功能的实现

  • 定义功能类并提供获取删除的 SQL 语句的方法

  • @DeleteProvider:生成删除用的 SQL 语句注解

  • type 属性:生成 SQL 语句功能类对象

  • method 属性:指定调用方法

定义功能类:

 //定义方法,返回删除的sql语句public String getDelete(Integer id) {return new SQL() {{DELETE_FROM("t_user");WHERE("id=#{id}");}}.toString();}

定义mapper接口方法:

 //删除功能//@Delete("DELETE FROM t_user WHERE id=#{id}")@DeleteProvider(type = ReturnSql.class , method = "getDelete")public abstract Integer delete(Integer id);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请问如何用oracle触发器实现不允许新增/删除表/增加/减少/修改字段类型

请问如何用oracle触发器实现不允许新增/删除表/增加/减少/修改字段类型 给本帖投票 56211打赏收藏 分享 转发到动态举报 写回复 性能测试中发现oracle11g数据库每天22点,oralce进程CPU占用率突增>> 11 条回复 切换为时间正序 请发表友善的回复… 发表回复 microsof…

最新版本的OpenLens,有两个隐藏技能

最新版本的OpenLens v6.4.15&#xff0c;有两个隐藏技能 1、需要添加扩展插件alebcay/openlens-node-pod-menu&#xff0c;查看pod时才会出现进入命令行的按钮 2、测试环境查看pod、node时可能会出现监控数据未显示&#xff0c;点击集群的Setting&#xff0c;在Metrics里选…

软件测试用例的八大步骤你都知道吗?

目录 第一步、UI体验测试 第二步、功能完整性测试 第三步、业务流程测试 第四步、容错机制测试 第五步、常规性测试 第六步、性能测试 第七步、交互体验测试 第八步、兼容性测试 总结&#xff1a; 第一步、UI体验测试 1.风格、样式、颜色是否协调 2. 界面布局是否整齐、…

【C++】开源:cpp-tbox百宝箱组件库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍cpp-tbox百宝箱组件库。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;…

Jenkins (一)

Jenkins (一) Docker Jenkins 部署 一. 安装 jenkins $ mkdir -p /home/tester/data/docker/jenkins $ vim jenkins:lts-jdk11.sh./jenkins:lts-jdk11.sh 内容 #! /bin/bash mkdir -p /home/tester/data/docker/jenkins/jenkins_homesudo chown -R 1000:1000 /home/tester/da…

后端查询出的数据库数字自动补零和不补零

select CAST(YTD_CHANGE*100 as decimal(18,1)), round(YTD_CHANGE*100,1) from RP where data_date 20211231补零 round(PYTD_CHANGE_PER*100,1)不补零 CAST(PYTD_CHANGE_PER*100 as decimal(18,1))

PageHelper分页失效,只能查出第一页

PageHelper分页失效&#xff0c;只能查出第一页 1. 现象2. 原因3. PageHelper工作原理 1. 现象 分页代码如下&#xff1a; int pageId Constants.ONE;boolean isHasNextPage;do {PageHelper.startPage(pageId, Constants.DEFAULT_PAGE_SIZE);List<String> projectIdLi…

【SCI一区】【电动车】基于ADMM双层凸优化的燃料电池混合动力汽车研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 1.2 电动车动力学方程 1.3 电池模型 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、数据、文章讲解 &#x1f4a5;1 概述 文献来源&#xff1a; 随着车辆互联性的出现&#xff0c;互联汽车 (CVs) 在增强道路安全、改…

数学建模-图论 最短路径

作图 %% 注意&#xff1a;以下代码需要较新版本的matlab才能运行&#xff08;最好是2016版本及以上哦&#xff09; % 如果运行出错请下载新版的matlab代码再运行%% Matlab作无向图 % &#xff08;1&#xff09;无权重&#xff08;每条边的权重默认为1&#xff09; % 函数graph(…

SQL进阶(2)——SQL语句类型 增删改查CRUD 事务初步 表关联关系 视图 +索引

目录 引出SQL语句类型1.DML数据操纵语言&#xff08;重点&#xff09;2.DQL数据查询语言&#xff08;重点&#xff09;3.DDL(Data Definition Language了解)4.DCL(Data Control Language了解)5.TCL 事务控制语言 运算符和其他函数1.运算符2.其它函数增删改查CRUD 视图索引事务1…

如何克服Leetcode做题的困境

文章目录 如何克服Leetcode做题的困境问题背景克服困境的建议实践与理论结合切忌死记硬背分析解题思路不要过早看答案迭代式学习寻求帮助坚持与耐心查漏补缺 结论 如何克服Leetcode做题的困境 问题背景 明明自觉学会了不少知识&#xff0c;可真正开始做Leetcode题目时&#x…

内存参数问题导致内存溢出

问题&#xff1a;内存参数问题导致内存溢出 1、文件过大&#xff0c;进行分块 2、 运行参数&#xff0c;使用最大内存配置2时&#xff0c;导致空指针异常。 3、获取详细报错信息-内存溢出 多线程捕获Throwable异常 修改代码&#xff0c;捕获Throwable&#xff0c;获取异常 异…

vue中预览pdf

情况一 如果后端返回的pdf地址&#xff0c;粘贴到浏览器的url框中&#xff0c;可以在浏览器中直接进行预览的&#xff0c;那么我们就用window.open&#xff0c;或 a标签&#xff0c;或iframe标签通过设置src进行预览即可 法1&#xff1a;可以直接使用window.open&#xff08;…

leetcode100.相同的树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;相同的树 1️⃣ 代码&#xff1a; bool isSameTree(struct TreeNode* p, struct TreeNode* q){// 判断两棵树当前结点是否为空if (p NULL && q NULL) {// 说明是相同的return true;}// 来到这里有几种情况// …

【实战篇】docker-compose部署go项目

一、场景&#xff1a; 二、需求 三、实操 Stage 1&#xff1a;GoLand 中 build 生成二进制文件 Stage 2&#xff1a;编写 Dockerfile Stage 3&#xff1a;编写 docker-compose.yaml Stage 4&#xff1a;文件上传到 ubuntu 服务器上&#xff0c;并设置文件读写权限 Stage…

前端 | (二)各种各样的常用标签 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;HTML排版标签&#x1f4da;HTML语义化标签&#x1f4da;块级元素与行内元素&#x1f4da;文本标签&#x1f407;常用的文本标签&#x1f407;不常用的文本标…

Kubernetes Service的过程

文章目录 Kubernetes Service的实现基础内容1. 命令 ip route show table all2. DNAT3. IPVS和iptables4. Service Service的实现简述 Kubernetes Service的实现 基础内容 在了解Service之前,需要先了解一些额外的知识: 命令: ip route show table allDNATIPVS和iptables基础…

idea不小心push的文件夹怎么处理?

第一种方式&#xff0c;把不小心push上去的人解决掉。 第二种方式&#xff0c;以我自身为例&#xff0c;同事不小心push了.idea文件夹 首先打开git bash git rm --cached .idea/ -r 然后查看一下状态 git status 接着提交修改 git commit -m "cancel track .idea file&q…

【Redis】高可用之三:集群(cluster)

本文是Redis系列第6篇&#xff0c;前5篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xf…

Linux基础(三)端口、进程及主机状态管理、环境变量、文件管理

目录 端口 nmap netstat 进程管理 查看进程 关闭进程 主机状态监控 系统资源top命令 磁盘信息监控 网络状态监控 环境变量 $符号 自己设置环境变量 自定义环境变量PATH Linux的文件和下载 压缩和解压 tar命令 zip和unzip命令 端口 每个电脑有一个ip地址&#xff…