mybatis的动态sql

案例一:

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

1 <insert id="insertBook" parameterType="modle.Book" keyProperty="id">  
2     <selectKey keyProperty="id" resultType="String" order="BEFORE">  
3         select nextval('book')  
4     </selectKey>  
5    insert into book
6 (bookname,author,isbn,price,typeid,publishDate)
7 values
8 (#{bookname},#{author},#{isbn},#{price},#{typeid},#{publishDate})
9 </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标签:

1 <select id="limitBook" parameterType="Map" resultType="Book">
2     select * from book where         
3     <if test="id !=null and id != ''  "> id=#{id}</if>
4     <if test="bookname !=null and bookname !='' ">
5         and bookname like #{bookname}
6     </if>            
7 </select>

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

不行明白多了只and,

where – if解决者的题材

1 <select id="limitBook" parameterType="Map" resultType="Book">
2     select * from book 
3     <where>
4         <if test="id !=null and id != ''  "> id=#{id}</if>
5         <if test="bookname !=null and bookname !='' ">
6             and bookname like #{bookname}
7         </if>
8     </where>        
9 </select>

如此不管id判断哪些,都非会见冒出多了一个and的景

因上述之状况引出  if-set

set标签可以用动态的部署SET关键字,和去追加至规则末尾的另不相干的逗号

 1     <!-- 4 if/set(判断参数) - 将实体类不为空的属性更新 -->  
 2     <update id="updateBook" parameterType="Book">  
 3         update book  
 4         <set>  
 5             <if test="bookname != null and bookname!= '' ">  
 6                 bookname = #{bookname},  
 7             </if>  
 8             <if test="author != null and author != '' ">  
 9                 author  = #{author },  
10             </if>  
11             <if test="isbn!= null ">  
12                 isbn= #{isbn},  
13             </if>  
14         </set>  
15         WHERE id= #{id};      
16     </update>  

  使用if+set标签修改后,如果某起也null则非开展创新,而是保持数据库原值

if + trim代替where/set标签

trim是更活的去处多余关键字的竹签,他可以实施where和set的功能。

 

trim代替where

 

1 <select id="limitBook" parameterType="Map" resultType="Book">
2         select * from book 
3         <trim prefix="where" prefixOverrides="AND|OR">
4             <if test="id !=null and id != ''  "> id=#{id}</if>
5             <if test="bookname !=null and bookname !='' ">
6                 and bookname like #{bookname}
7             </if>
8         </trim>        
9     </select>

 

trim代替set

 

 1 <!-- 4 if/set(判断参数) - 将实体类不为空的属性更新 -->  
 2     <update id="updateBook" parameterType="Book">  
 3         update book  
 4         <trim prefix="SET" suffixOverrides=",">  
 5             <if test="bookname != null and bookname!= '' ">  
 6                 bookname = #{bookname},  
 7             </if>  
 8             <if test="author != null and author != '' ">  
 9                 author  = #{author },  
10             </if>  
11             <if test="isbn!= null ">  
12                 isbn= #{isbn},  
13             </if>  
14         </trim>  
15         WHERE id= #{id};      
16     </update>

choose标签是随梯次判断该里面when标签中的test条件出否成立,如果有一个建,则choose结束。当choose中具备when的原则都无括则不时,则实施otherwise中的sql。

 1 <select id="limitBook" parameterType="Map" resultType="Book">
 2         select * from book 
 3         <where>
 4             <choose>
 5                 <when test="id !=null">
 6                     id=#{id}
 7                 </when>
 8                 <when test="bookname != null and bookname!='' ">
 9                     and bookname like #{bookname}
10                 </when>
11                 <otherwise>  
12                 
13                 </otherwise> 
14             </choose>
15                         
16         </where>        
17     </select>

 

foreach

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

foreach元素是深强劲的,它同意你指定一个集合,声明集合项和目录变量,它们可就此在要素体内。它呢允许而指定开放与关闭的字符串,在迭代中放置分隔符。这个因素是杀智能的,它不见面偶尔地附加多余的分隔符。

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

这个部分是针对有关XML配置文件以及XML映射文件的设讨论的。下一部分以详细讨论Java
API,所以你得抱你已创办的无比有效之映照。

 

array参数

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

 

list参数:

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

 

网站地图xml地图