mybatis的动态sql
2015-05-09 16:59
309 查看
案例一:
insert语句,然后获取这条语句的id值.
selectKey语句属性:
if标签:
当id不为空或''时, 就会出现这样的sql语句:select * from book where and bookname like #{bookname}
很明显多了个and,
where - if解决上面的问题
这样不论id判断如何,都不会出现多了一个and的情况
根据以上的情况引出 if-set
set标签可以将动态的配置SET关键字,和剔除追加到条件末尾的任何不相关的逗号
使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值
trim代替where
choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。
foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。
注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。
这个部分是对关于XML配置文件和XML映射文件的而讨论的。下一部分将详细讨论Java API,所以你可以得到你已经创建的最有效的映射。
array参数
list参数:
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 |
<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>
相关文章推荐
- mybatis14 动态sql
- mybatis 动态sql
- mybatis学习笔记3 - 动态sql
- mybatis之动态SQL
- Mybatis之动态SQL揭秘
- mybatis(11)--动态sql
- MyBatis SQL注解 动态SQL语句
- mybatis的动态sql标签
- mybatis的动态sql
- mybatis入门基础(五)----动态SQL
- Mybatis动态sql
- mybatis动态SQL标签的用法
- MyBatis之动态sql语句和Mapper
- MyBatis的动态SQL详解
- MyBatis动态SQL语句
- MyBatis的动态SQL详解
- 【Spring+SpringMVC+MyBatis深入学习及搭建】05.动态sql
- Mybatis 学习笔记 动态sql语句
- MyBatis之动态SQL
- mybatis 动态 SQL