spring boot(8)-mybatis三种动态sql

2023-11-13

脚本sql

XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置
@Select("<script>select * from user <if test=\"id !=null \">where id = #{id} </if></script>")  
public List<User> findUserById(User user);  
很明显,在java中写xml可读性和维护性太差,尤其当SQL很长时,这样写是很痛苦的。

在方法中构建sql

dao接口中是不能写实现的,所以这里借用内部类来生成动态SQL。增改删也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider
@Mapper
public interface MybatisDao {
	//使用UserDaoProvider类的findUserById方法来生成sql
	@SelectProvider(type = UserDaoProvider.class, method = "findUserById")
	public List<User> findUserById(User user);
	
	class UserDaoProvider {
		public String findUserById(User user) {
			String sql = "SELECT * FROM user";
			if(user.getId()!=null){
				sql += " where id = #{id}";
			}
			return sql;
		}
	}
这比 <script>更加清晰,适用于查询语句不是很长、条件不多的场景,SQL很直观。但是在写很长的SQL时,这样拼接SQL同样会很痛苦

结构化SQL

public String findUserById(User user) {    
            return new SQL(){{    
                SELECT("id,name");    
                SELECT("other");    
                FROM("user");    
                if(user.getId()!=null){    
                    WHERE("id = #{id}");    
                }    
                if(user.getName()!=null){    
                    WHERE("name = #{name}");    
                }    
            //从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接    
            }}.toString();    
        }    
这是把前面的内部类改造一下
SELECT:表示要查询的字段,如果一行写不完,可以在第二行再写一个SELECT,这两个SELECT会智能的进行合并而不会重复
FROM和WHERE:跟SELECT一样,可以写多个参数,也可以在多行重复使用,最终会智能合并而不会报错
这样语句适用于写很长的SQL时,能够保证SQL结构清楚。便于维护,可读性高。但是这种自动生成的SQL和HIBERNATE一样,在实现一些复杂语句的SQL时会束手无策。所以需要根据现实场景,来考虑使用哪一种动态SQL
上面的例子只是最基本的用法:更多详细用法,可以参考mybatis中文网的专门介绍
http://www.mybatis.org/mybatis-3/zh/statement-builders.html

List传值错误

动态SQL中,有时要对批量数据进行处理,难免会使用list做为参数
@SelectProvider(type = UserDaoProvider.class, method = "find")
	public List<Map> find(List list);    
	
	class UserDaoProvider {
		public String find(List list) {
这是一个最简单的list传参,但是在运行时会报传参错误。这是mybatis内部机制造成的,其 参数需要是key/value结构,当遇到这里不是 key/value结构的list时,mybatis会自己把它转换成key/value结构,key就是他的名字"list",value就是他的值List,要正确传参需要使用key/value结构的map,如下
@SelectProvider(type = UserDaoProvider.class, method = "find")
	public List<Map> find(List list);    
	
	class UserDaoProvider {
		public String find(Map map) {
			List list = (List) map.get("list");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring boot(8)-mybatis三种动态sql 的相关文章

  • cadence OrCAD原理图输出-pdf文件和bom表

    软件版本 16 6 一 输出pdf文件 生成pdf文件前 需要首先安装好pdf虚拟打印机 在打印时选择pdf打印机即可 在项目管理中 选择dsn文件 主菜单file gt print 选项 出现打印机对话框 默认 scale to pape
  • R语言-ggplot2图形语法

    简介 在R里 主要有两大底层图层系统 一是base图形系统 二是gird图形系统 lattice包与ggplot2包正是基于gird图形系统构建的 他们都有自己独特的图形语法 ggplot2有着自己独特的图形语法 这套语法归纳起来包括 数据
  • 魅族满载诚意强势回归,重启全胜时代?

    3月30日魅族在上海梅赛德斯 奔驰文化中心举办了史上最大规模的新品发布会 吸引了众多媒体 行业人士和魅友的关注 在发布会上 魅族正式推出了魅族20系列旗舰手机 以及Flyme 10系统 Flyme Auto车机系统等全场景融合体验产品 全方

随机推荐

  • JS 随机生成十个带颜色的li

    html和css部分
  • 量化投资学习-37:底部涨停板操作

    涨停板选股 1 异动 主力的拉升前的筹码集中度和压力试盘 金针探底 拉升回落 2 时间 10 00之前涨停最佳 10 30之前凑合 下午不可 3 空间 底部第一个涨停 后续还有较大的涨幅空间 4 缺口 通过缺口 快速脱离主力的成本区和价格底
  • java注解开发

    用xml配置文件方式是Servlet2 5版本规范的 经过逐步演变注解来时流行 因为更方便了 Servlet3 0以后也支持注解开发了 自动注解实现步骤 创建JavaWeb工程 并移除web xml 编写Servlet 继承HttpServ
  • react学习笔记-从井字棋开始(3)

    函数函组件 如果你想写的组件只包含一个 render 方法 并且不包含 state 那么使用函数组件就会更简单 我们不需要定义一个继承于 React Component 的类 我们可以定义一个函数 这个函数接收 props 作为参数 然后返
  • 120种小狗图像傻傻分不清?用fastai训练一个分类器

    作者 一杯奶茶的功夫 链接 https www jianshu com p ab35ed21df87 程序员转行学什么语言 https edu csdn net topic ai30 utm source csdn bw 这篇文章会讲解如何
  • windows xp 驱动开发(四) USB开发技术概述

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 参考文章 http blog csdn net xxxluozhen article details 4882121 1 概
  • 远程桌面协议(RDP)介绍

    远程桌面协议 RDP 允许您远程访问计算机 多年来 它免除了许多系统管理操作 无疑是一项非常有用的技术 RDP 长期以来一直提供远程访问支持 而且越来越好 该协议于 1998 年在 Windows NT 4 0 Terminal Serve
  • Linux系统简介

    文章目录 1 UNIX与Linux发展史 1 1 UNIX发展史 1 2 Linux发展史 1 2 1 Linux内核版本 1 2 2 Linux主要发行版本 2 开源软件简介 2 1 典型的开源软件 2 2 开源软件的特点 2 3 支撑互
  • MATLAB实现多分类预测结果混淆矩阵(Confusion matrix)可视化

    对于多分类问题 如何对预测结果进行可视化分析是性能对比的关键 在实际多分类问题 除了简单展示模型预测精度外 如何理解不同类别之间的预测结果对于分析样本相关性和属性区别具有重要意义 在MATLAB中一般通过混淆矩阵confusion matr
  • Uber和它的规则&算法

    私以为 Uber这家公司的出现 标志着 科技重构资源的时代正式来临 这才是大数据真正的使命啊 enjoy 这个改变 以下信息来源 网络上流传的中文Uber解读 Uber的算法 均可以随着数据量的不断增加进行学习 所以只会越来越准 只会越来越
  • MySQL将一张表的数据copy到另一张表中

    1 复制旧表的数据到新表 假设两个表结构一样 INSERT INTO 新表 SELECT FROM 旧表 INSERT INTO tbl user copy SELECT FROM tbl user 2 复制表结构及数据到新表 CREATE
  • Keil不能正确生成.bin文件的解决办法

    1 打开keil IDE 然后打开help gt uVison Help 搜索fromelf关键字如下图1 然后再进入到右下角的索引找到fromelf命令行的语法和选项 找到 bin的说明如下 如红色标注所说 正是症结所在 即如果链接文件中
  • 安装ubuntu20.04(安装vim、gcc、VMtools、中文输入法、汉化、修改IP、无法连网问题)

    目录 ubuntu安装包获取 ubuntu的安装 安装网络配置命令ifconfig 连接网络 解决ubuntu无法连网问题 如何修改IP地址 安装VMtools 解决VMware Tools选项灰色 VMtools安装 安装中文 汉化 添加
  • 时间序列预测——GRU

    本文展示了使用GRU进行时间序列预测的全过程 包含详细的注释 整个过程主要包括 数据导入 数据清洗 结构转化 建立GRU模型 训练模型 包括动态调整学习率和earlystopping的设置 预测 结果展示 误差评估等完整的时间序列预测流程
  • 针对序列级和词元级应用微调BERT(需修改)

    对于序列级和词元级自然语言处理应用 BERT只需要最小的架构改变 额外的全连接层 如单个文本分类 例如 情感分析和测试语言可接受性 文本对分类或回归 例如 自然语言推断和语义文本相似性 文本标记 例如 词性标记 和问答 在下游应用的监督学习
  • 7-22龟兔赛跑/PTA基础编程题目集

    7 22 龟兔赛跑 20分 乌龟与兔子进行赛跑 跑场是一个矩型跑道 跑道边可以随地进行休息 乌龟每分钟可以前进3米 兔子每分钟前进9米 兔子嫌乌龟跑得慢 觉得肯定能跑赢乌龟 于是 每跑10分钟回头看一下乌龟 若发现自己超过乌龟 就在路边休息
  • 高效的学习方法

    背景 自己在复习自己专业课33页知识点时一筹莫展 死记硬背又记不住 背了上一个再背下一个上一个就忘记了 在复习的时候特别痛苦 而且定义性质的还是不能有错别字的 所以感觉自己背的特别痛苦 而且背完就忘 就像在做无用功 自己也想过用思维导图三遍
  • c++智能指针(一)

    C 智能指针 一 c 中的动态内存的管理是通过一对运算符来管理的 new 在动态内存中为对象分 配空间并返回一个指向该对象的指针 我们可以选择对对象进行初始化 delete 接受一个对象的指针 销毁对象 并且释放与之关联的内存 动态内存的使
  • oracle自动增加表空间指定分区

    Create table create table testTable tjsj DATE not null tablespace tablespace1 PARTITION BY RANGE TJSJ INTERVAL NUMTODSIN
  • spring boot(8)-mybatis三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了 有兴趣可以自己了解 下面是用