Mybatis-Plus的SQL语句组拼原理说明
记录查找自动组拼SQL语句的过程
首先在BaseMapper其中的一个方法下打个断点
在断点显示的值栏找到相关的SQL
发现SQL语句在MappedStatement对象中,而sqlSource存的就是相关的sql语句
然后在MappedStatement这个对象打断点,看看到底是哪个对象对它进行了操作
发现是AutoSqlInjector创建了MappedStatement
在AutoSqlInjector对象找到与selectById相关的一个方法,打断点
SqlSource果然在这里创建出来了,createSqlSource就是具体过程,然后添加到MappedStatement对象中,此SQL完成组拼
在createSqlSource方法打下断点,进入具体的组拼过程
方法sqlSelectColumns就是具体的组拼方法,一直在此方法进行递归
在此方法中,迭代器在不断迭代组拼
最后SQL全部完成组拼,存在集合对象中,就可以取出来了
学会从逆推到顺推,学会怎样打断点是关键。
mybatisPlus注解版动态拼接sql
前段时间不是在实习嘛,公司用的是注解开发不用xml的,特此记录注解版动态拼接sql,还有使用过程中踩坑集合。
先记录1.0版本,以后遇到别的在完善就是。
其实就是在xml那种格式下面最外面一层用< /script > 标签包住就行了,其余部分用英文双引号包住,表达式用单引号包住就ok了,@Param(“idMin”) Integer idMin与#{idMin}对应。
不过我这里如果idMin为null那么between null and 20是查不出数值的,< /script > 标签是重点,这种sql业务逻辑读者以后自己改。
/** * @author zzh * @since 2021-01-26 */ public interface GoodsMapper extends BaseMapper<Goods> { @Select("<script>" + "select * from goods where id between" + "<if test='#{idMin}!=null'>" + "#{idMin} and "+"</if>" + "<if test='#{idMax}!=null'>" + "#{idMax}" + "</if>" + "</script>") public List<Goods> select(@Param("idMin") Integer idMin, @Param("idMax") Integer idMax); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
Mybatis-Plus的应用场景描述及注入SQL原理分析
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P.2P,基友搭配,效率翻倍. 特性: 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 强大的 CRUD 操作:内置通用 Mapper.通用 Service,仅仅通过少量配置即可实现单表大部分 C
-
MyBatisPlus 自定义sql语句的实现
一.引言 Good Good Study,Day Day Up MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么那么今天说说MP怎么自定义sql语句吧. 二.配置 自定义的sql当然是写在XML文件中的啦,那么首先来定义xml文件的位置,在yml配置文件如下 mybatis-plus: # 如果是放在src/main/java目录下 classpath:/com/*/*/mapper/*Mapper.xml # 如果是放在resource目录 classpath:
-
在Mybatis @Select注解中实现拼写动态sql
现在随着mybatis plus的应用,越来越多的弱化了SQL语句,对于单表操作可以说几乎不需要进行自己编写SQL语句了,但对于多表查询操作目前mybatis plus还没有很好的支持,还需要自己编写SQL语句,如: import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.anno
-
Mybatis中的动态SQL语句解析
这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,一种是利用注解进行配置. Mybatis使用注解配置SQL,但是由于配置功能受限,而且对于复杂的SQL而言可读性很差,所以很少使用. Mybatis常用xml配置的方式,使用xml的几个简单的元素,便能完成动态SQL的功能,大量的判断都可以在mybaties的映射xml里面配
-
Mybatis-Plus的SQL语句组拼原理说明
记录查找自动组拼SQL语句的过程 首先在BaseMapper其中的一个方法下打个断点 在断点显示的值栏找到相关的SQL 发现SQL语句在MappedStatement对象中,而sqlSource存的就是相关的sql语句 然后在MappedStatement这个对象打断点,看看到底是哪个对象对它进行了操作 发现是AutoSqlInjector创建了MappedStatement 在AutoSqlInjector对象找到与selectById相关的一个方法,打断点 SqlSource果然在这里创建出
-
springmvc+mybatis 做分页sql 语句实例代码
废话不多说了,直接给大家贴代码了,具体代码如下所示: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="s
-
MyBatis 执行动态 SQL语句详解
大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled
-
Mybatis控制台打印Sql语句的实现代码
MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 下面看下Mybatis控制台打印Sql语句 1.首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语
-
Mybatis控制台打印SQL语句的两种方式实现
问题描述 在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们.但是也有一定的问题,当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中直接找出完整的sql就会非常的难,这个时候经常会需要把组合之后的完整sql调试出来比较好.下面来看两种调试出sql的两种方式 解决方案 方案1: 网上说的比较多的,之前也是这么用的一种方式 1:首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句 2:添加如下语句: ###
-
Mybatis 实现打印sql语句的代码
mybatis本身没有提供日志的实现,引入的是第三方组件.mybatis支持多个第三方日志插件,优先级由低到高为slf4J.commonsLoging.Log4J2.Log4J和JdkLog. mybatis中有一个LogFactory,获取log的工厂类,在工程类中可以回去对应的日志实现.分析工程类,可以发现mybatis如何来选择log public static Log getLog(String logger) { try { return logConstructor.newInsta
-
详解Java的MyBatis框架中SQL语句映射部分的编写
1.resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: <mappers> <mapper resource="com/liming/manager/data/mappers/UserMapper.xml" /> <mapper resource="com/liming/mana
-
MyBatis的动态SQL语句实现
1. 动态SQL之<if>标签 我们根据实体类的不同取值,使用不同的SQL语句来进行查询.比如在id如果不为空时可以根据id查询,如果username不为空时还要加入用户名作为条件,这种情况在我们的多条件组合查询中经常会碰到. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN&qu
-
mysql 查询指定日期时间内sql语句实现原理与代码
在数据库教程设计时必须注意时间字段为int(11)这样,保存在数据库的是一个数字型日期时间戳,我们可以用mktime函数求出当前日期的时间戳进行加减就OK了,下面看实例 //一个月 复制代码 代码如下: $lastMonth = mktime(date('h'),date('i'),date('s'),date('m')-1,date('d'),date('y')); $where .= " dtime > $lastMonth"; //三个月 复制代码 代码如下: $lastT
-
在mybatis执行SQL语句之前进行拦击处理实例
比较适用于在分页时候进行拦截.对分页的SQL语句通过封装处理,处理成不同的分页sql. 实用性比较强. import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Properties; import org.apache.ibatis.e
随机推荐
- 用Redis实现微博关注关系
- 利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题
- 解决Oracle删除重复数据只留一条的方法详解
- javaScript Array(数组)相关方法简述
- MVC4制作网站教程第四章 添加栏目4.1
- 隐藏ASP木马后门的两种方法
- 深入分析Android ViewStub的应用详解
- 详解js的事件处理函数和动态创建html标记方法
- python创建关联数组(字典)的方法
- 高危险ANI鼠标指针漏洞非官方免疫补丁
- 上网不用防火墙一招克死所有病毒
- C#汉字转拼音实例(支持多音字)
- 算法详解之分治法具体实现
- Android使用第三方服务器Bmob实现发送短信验证码
- 详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
- 使用Django开发简单接口实现文章增删改查
- 原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
- 如何在Go中使用切片容量和长度
- Docker容器中运行flume及启动不输出运行日志问题
- 详解Vue.js 作用域、slot用法(单个slot、具名slot)