案例一:

insert语句,然后获取这条语句的id值.

 <insert id="insertBook" parameterType="modle.Book" keyProperty="id">
<selectKey keyProperty="id" resultType="String" order="BEFORE">
select nextval('book')
</selectKey>
insert into book
(bookname,author,isbn,price,typeid,publishDate)
values
(#{bookname},#{author},#{isbn},#{price},#{typeid},#{publishDate})
</insert>

selectKey语句属性:

keyProperty selectKey 语句生成结果需要设置的属性。  
resultType 生成结果类型,MyBatis 允许使用基本的数据类型,包括String、int类型。  
order

1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert语句;

2:AFTER,就先运行insert语句再运行selectKey 语句。

BEFORE

AFTER

statementType MyBatis 支持STATEMENT,PREPARED和CALLABLE的语句形式, 对应Statement,PreparedStatement 和CallableStatement响应

STATEMENT

PREPARED

CALLABLE

if标签:

 <select id="limitBook" parameterType="Map" resultType="Book">
select * from book where
<if test="id !=null and id != '' "> id=#{id}</if>
<if test="bookname !=null and bookname !='' ">
and bookname like #{bookname}
</if>
</select>

当id不为空或''时, 就会出现这样的sql语句:select * from book where and bookname like #{bookname}

很明显多了个and,

where - if解决上面的问题

 <select id="limitBook" parameterType="Map" resultType="Book">
select * from book
<where>
<if test="id !=null and id != '' "> id=#{id}</if>
<if test="bookname !=null and bookname !='' ">
and bookname like #{bookname}
</if>
</where>
</select>

这样不论id判断如何,都不会出现多了一个and的情况

根据以上的情况引出  if-set

set标签可以将动态的配置SET关键字,和剔除追加到条件末尾的任何不相关的逗号

     <!-- 4 if/set(判断参数) - 将实体类不为空的属性更新 -->
<update id="updateBook" parameterType="Book">
update book
<set>
<if test="bookname != null and bookname!= '' ">
bookname = #{bookname},
</if>
<if test="author != null and author != '' ">
author = #{author },
</if>
<if test="isbn!= null ">
isbn= #{isbn},
</if>
</set>
WHERE id= #{id};
</update>

使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值

if + trim代替where/set标签

trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。

trim代替where

 <select id="limitBook" parameterType="Map" resultType="Book">
select * from book
<trim prefix="where" prefixOverrides="AND|OR">
<if test="id !=null and id != '' "> id=#{id}</if>
<if test="bookname !=null and bookname !='' ">
and bookname like #{bookname}
</if>
</trim>
</select>

trim代替set

 <!-- 4 if/set(判断参数) - 将实体类不为空的属性更新 -->
<update id="updateBook" parameterType="Book">
update book
<trim prefix="SET" suffixOverrides=",">
<if test="bookname != null and bookname!= '' ">
bookname = #{bookname},
</if>
<if test="author != null and author != '' ">
author = #{author },
</if>
<if test="isbn!= null ">
isbn= #{isbn},
</if>
</trim>
WHERE id= #{id};
</update>

choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。

 <select id="limitBook" parameterType="Map" resultType="Book">
select * from book
<where>
<choose>
<when test="id !=null">
id=#{id}
</when>
<when test="bookname != null and bookname!='' ">
and bookname like #{bookname}
</when>
<otherwise> </otherwise>
</choose> </where>
</select>

foreach

对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN条件。List 实例将使用“list”做为键,数组实例以“array”做为键。

foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。

注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。

这个部分是对关于XML配置文件和XML映射文件的而讨论的。下一部分将详细讨论Java API,所以你可以得到你已经创建的最有效的映射。

array参数

 <!— 7.1 foreach(循环array参数) - 作为where中in的条件 -->
<select id="limitBook" resultMap="resultMap_studentEntity">
select * from book
where id in
<foreach collection="array" item="classIds" open="(" separator="," close=")">
#{classIds}
</foreach>
</select>

list参数:

 <!-- 7.2 foreach(循环List<String>参数) - 作为where中in的条件 -->
<select id="limitBook" resultMap="resultMap_studentEntity">
select * from book
where id in
<foreach collection="list" item="idList" open="(" separator="," close=")">
#{idList}
</foreach>
</select>

mybatis的动态sql的更多相关文章

  1. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  2. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  3. mybatis 使用动态SQL

    RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...

  4. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  5. 使用Mybatis实现动态SQL(一)

    使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:        *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...

  6. MyBatis探究-----动态SQL详解

    1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...

  7. mybatis中的.xml文件总结——mybatis的动态sql

    resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...

  8. mybatis.5.动态SQL

    1.动态SQL,解决关联sql字符串的问题,mybatis的动态sql基于OGNL表达式 if语句,在DeptMapper.xml增加如下语句; <select id="selectB ...

  9. MyBatis的动态SQL详解-各种标签使用

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...

  10. 利用MyBatis的动态SQL特性抽象统一SQL查询接口

    1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...

随机推荐

  1. shell脚本实例-系统监控

    shell脚本监控网站并实现邮件.短信报警shell进程监控脚本(发送邮件报警)Shell脚本监控服务器在线状态和邮件报警的方法 http://www.jbxue.com/jb/shell/ 11. ...

  2. linux概念之用户,组及权限

    Linux 是一个多用户.多任务的操作系统:我们应该了解单用户多任务和多用户多任务的概念 单用户多任务一个beinan用户,为了完成工作,执行了几个任务:当然beinan这个用户,其它的人还能以远程登 ...

  3. 一步一步理解Paxos算法

    一步一步理解Paxos算法 背景 Paxos 算法是Lamport于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后重新发表到 TOCS ...

  4. html初学(三)

    <!-- 我就是我,不一样的烟花 piu piu piu 干啥子 如来神掌 -- --- ----- .======. ***********啊啊啊啊啊啊 | INRI | | | | | .= ...

  5. mysql ALTER COLUMN MODIFY COLUMN CHANGE COLUMN 区别及用法 (转)

    -- 设置或删除列的默认值.该操作会直接修改.frm文件而不涉及表数据.此操作很快 -- ALTER COLUMN ALTER TABLE  dsp_ad_center.XianDuan ALTER  ...

  6. Redis配制说明

    配置文件参数说明:  1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程     daemonize no 2. 当Redis以守护进程方式运行时,Redis默 ...

  7. SQL SERVER 组内排序

    取出每组的第一个 select *from (select * ,RANK ( ) OVER( PARTITION by org order by reportcode asc) PartionNum ...

  8. Neutron分析(1)——简介

    Neutron是OpenStack核心项目之一,提供云计算环境下的虚拟网络功能.Neutron的功能日益强大,并在Horizon面板中已经 集成该模块.作为Neutron的核心开发者之一,个人觉得Ne ...

  9. 像装软件一样装系统 Win8下怎么装Win7

    像装软件一样装系统 Win8下怎么装Win7 首先,你需要一个Windows7的ISO镜像文件,非ghost版本 一般选中ISO文件,点反键在弹出菜单中以“装载”或“window资源管理器”方式打开 ...

  10. IO操作 第一篇 学习(转载)

    问题8:如何使用通配符搜索指定目录内的所有文件: 解决方案: 使用DirectoryInfo.GetFiles方法的重载版本,它可以接受一个过滤表达式,返回FileInfo数组,另外它的参数还可以指定 ...