首先动态sql简单来讲就是可以根据传入参数的不同来动态的生成sql语句,拼接where语句,这样你就不用写很多个sql语句了,并且它里面有一些特性也可以帮助你避免sql语句的拼接错误,主要分为4个:

if,chooose,trim,foreach

IF:

对参数进行判断,拼接不同的sql语句,看一个例子

    <select id="selectByIf" parameterType="person" resultType="person">
select *from person where sex !=
<if test="name != null">
AND name = #{name}
</if>
</select>

很简单,test=".."里面的是条件,当传入的name属性不为空时,就将if标签体当中的sql语句拼接到其后,当然你后面也可以写很多个if,满足条件的都会拼接。另外test里面的条件也是可以进行复合判断的,比如:

    <select id="selectByIf" parameterType="person" resultType="person">
select *from person where sex !=
<if test="name != null and name!='温鸿飞'">
AND name = #{name}
</if>
</select>

这时候如果传入对象的name为温鸿飞,那就不会拼接sql语句了。

Choose:

这个语句其实即使if,else,从第一个开始向下找,找到满足条件的就停止,比如;

    <select id="selectByIf" parameterType="person" resultType="person">
select *from person where sex !=
<choose>
<when test="name!=null">
and name = #{name}
</when>
<when test="name=='温鸿飞'">
and name = ''
</when>
<otherwise></otherwise>
</choose>
</select>

很容易理解,不过说明一点,比如你传入的name值为温鸿飞,那么拼接的sql语句是and name = #{name},而不是第二个条件,即多个条件都满足时,拼接第一个。

,where,

是为了解决出现sql语法错误的情况:比如将上面if语句后面的sex!=0去掉,

  <select id="selectByIf" parameterType="person" resultType="person">       
select *from person where
    <if test="sex!=null">
      sex != #{sex}
    </if>
<if test="name != null">
AND name = #{name}
</if>
</select>

这时如果满足条件,很明显拼接出来的sql语句是不正确的,这时候只要给if外面加上<where>标签就可以了,加上之后会自动去除and,并且会加上where(如果满足其中一个if条件的话),如下:

    <select id="selectByIf" parameterType="person" resultType="person">
select *from person
<where>
<if test="sex!=null">
sex != #{sex}
</if>
<if test="name!=null">
and name = #{name}
</if>
</where>
</select>

set,

这个标签是在动态更新的时候用的,可以帮助我们加上set,并去除无关的逗号,如下

    <update id="updateByIf" parameterType="person">
update person
<set>
<if test="name!=null">name=#{name },</if>
<if test="sex!=null">sex=#{sex}</if>
</set>
where id =#{id}
</update>

如果只传入了name,那么name=#{name},  后面的这个逗号也会帮我们去掉,这个意思

Foreach

一般用于in标识符后面,如下:

    <select id="selectByForeach" parameterType="list" resultType="person">
select * from person where id in
<foreach collection="list" item="id" close=")" open="(" separator=",">
#{id}
</foreach>
</select>

item是别名,collection是类型,list和array一般,后面三个是拼接时候的开始结尾分隔符,接口这样写:

List<Person> selectByForeach(List list);

传入的是List类型,

例,插入多条数据,传入list,每一项都是Person对象,构建sql语句即可

    <insert id="insertAll" parameterType="list">
insert into person (`name`,`loves`,`sex`) values
<foreach collection="list" separator="," open="" close="" item="person">
(#{person.name},#{person.loves},#{person.sex})
</foreach>
</insert>

规则就这些,用的时候肯定会很复杂

(二)Mybatis动态sql的更多相关文章

  1. 二 mybatis 动态sql

    动态sql应用  一 .什么是动态sql 1.where条件  动态查询 根据姓名或年龄或地址查询 UserMapper.xml 1 <select id="findUser" ...

  2. MyBatis 动态SQL(十二)

    动态条件查询 以下是我们数据库表 tb_user 的记录: 假设现在有一个需求,就是根据输入的用户年龄和性别,查询用户的记录信息.你可能会说,这太简单了,脑袋里立马蹦出如下的 SQL 语句: SELE ...

  3. MyBatis动态SQL之一使用 if 标签和 choose标签

    bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...

  4. Mybatis动态sql及分页、特殊符号

    目的: mybatis动态sql(案例:万能查询) 查询返回结果集的处理 mybatis的分页运用 mybatis的特殊符号 mybatis动态sql(案例:万能查询) 根据id查询 模糊查询 (参数 ...

  5. Mybatis 动态sql(转载)

    原文地址:http://www.cnblogs.com/dongying/p/4092662.html 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个 ...

  6. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  7. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  8. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  9. Mybatis动态SQL单一基础类型参数用if标签

    Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...

  10. 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...

随机推荐

  1. Tomcat的性能优化及JVM内存工作原理

    JVM性能优化原则:代码运算性能.内存回收.应用配置(影响Java程序主要原因是垃圾回收机制)代码层优化:避免过多循环嵌套.调用和复杂逻辑. Tomcat调优主要内容 1.增加最大连接数 2.调整工作 ...

  2. 重拾c++第四天(7):函数相关

    1.引用变量: int a; int &b = a; //引用变量 指向同一地址,必须在初始化时定义,且一直对原变量献上忠诚,主要针对类对象 2.函数重载最好用在功能相同,但数据类型不同的情况 ...

  3. 浏览器应用集成嵌入WPS指南

    因为该WPS插件使用NPAPI机制来和浏览器交互,故要求使用插件的浏览器必须支持NPAPI机制且必须开启NPAPI机制. 以下是支持的常见的浏览器及其版本: FireFox浏览器52及小于52的版本( ...

  4. Spark读写ES

    本文主要介绍spark sql读写es.structured streaming写入es以及一些参数的配置 ES官方提供了对spark的支持,可以直接通过spark读写es,具体可以参考ES Spar ...

  5. Akka Java 文档 -- 容错

    [转自: http://blog.csdn.net/zjw10wei321/article/details/46911825] 容错 实际中的故障处理 容错案例图解 容错案例所有源码 创建新的监管策略 ...

  6. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  7. python 面向对象的内置方法

    要求:了解即可,能用最好 """ 1.print(obj), str(obj), %s % (obj), 都调用obj.__str__()方法,若类中没有找__repr_ ...

  8. ii

    char a[10], b[10], c[10], d[10],e[10],f[10],g[10],h[10]; scanf("%s %s %s %s", a, b, c, d); ...

  9. HCNA网络技术学习指南

    网络通信基础 网络与通信 OSI模型和TCP/IP模型 网络类型 传输介质及通信方式 2 VRP基础 VRP简介 VRP命令行 登录设备 基本配置 配置文件管理 通过Telnet登录设备 文件管理 基 ...

  10. 运用路由约束 使用属性路由 精通ASP-NET-MVC-5-弗瑞曼