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

更新时间:2023-07-13 12:56:01 阅读: 评论:0

mybatis中的.xml⽂件总结——mybatis的动态sql resultMap
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名⼀致⽅可映射成功。
如果sql查询字段名和pojo的属性名不⼀致,可以通过resultMap将字段名和属性名作⼀个对应关系,能将查询结果映射到pojo对象中。ResultMap可以将查询结果映射为复杂类型的pojo,⽐如在查询结果中包括pojo和list实现⼀对⼀查询和⼀对多查询。
动态sql
If
注意要做不等于空字符串校验。
Sql⽚段
将重复的sql提取出来,包括重复的where条件,使⽤include引⽤。
如果引⽤其它l的sql⽚段,则在引⽤时需要加上namespa
mybatis 的动态sql语句是基于OGNL表达式的。可以⽅便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下⼏类:
1. if 语句 (简单的条件判断)
2. choo (when,otherwize) ,相当于java 语⾔中的 switch ,与 jstl 中的choo 很类似.
3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
4. where (主要是⽤来简化sql语句中where条件判断的,能智能的处理 and or ,不必担⼼多余导致语法错误)
5. t (主要⽤于更新时)
6. foreach (在实现 mybatis in 语句查询时特别有⽤)
下⾯分别介绍这⼏种处理⽅式被人遗忘的角落
1、mybatis if语句处理
<lect id="dynamicIfTest" parameterType="Blog" resultType="Blog">
lect*from t_blog where1=1
<if test="title !=null">
and title = #{title}
</if>
<if test="content !=null">
and content = #{content}
</if>
<if test="owner !=null">
and owner = #{owner}
</if>
</lect>
解析:
如果你提供了title参数,那么就要满⾜title=#{title},同样如果你提供了Content和Owner的时候,它们也需要满⾜相应的条件,之后就是返回满⾜这些条件的所有Blog,这是⾮常有⽤的⼀个功能。
以往我们使⽤其他类型框架或者直接使⽤JDBC的时候,如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其⿇烦的,⽐起来,上述的动态SQL就要简单多了。
2、choo (when,otherwize) ,相当于java 语⾔中的 switch ,与 jstl 中的choo 很类似
<lect id="dynamicChooTest" parameterType="Blog" resultType="Blog">
lect*from t_blog where1=1
<choo>
<when test="title !=null">
and title = #{title}
</when>
<when test="content !=null">
and content = #{content}
</when>
<otherwi>
and owner = "owner1"
</otherwi>
</choo>
</lect>
when元素表⽰当when中的条件满⾜的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件满⾜的时候,就会跳出choo,即所有的when和otherwi条件中,只有⼀个会输出,当所有的我很条件都不满⾜的时候就输出otherwi中的内容。所以上述语句的意思⾮常简单,当title!=null的时候就输出and titlte = #{title},不再往下判断条件,当title为空且content!=null的时候就输出and content = #{content},当所有条件都不满⾜的时候就输出otherwi中的内容。
3、trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
<lect id="dynamicTrimTest" parameterType="Blog" resultType="Blog">
lect*from t_blog
<trim prefix="where" prefixOverrides="and|or">
<if test="title !=null">
title = #{title}
</if>
<if test="content !=null">
and content = #{content}
</if>
<if test="owner !=null">
or owner = #{owner}
</if>
</trim>
</lect>
trim元素的主要功能是可以在⾃⼰包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的⾸部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为trim有这样的功能,所以我们也可以⾮常简单的利⽤trim来代替where元素的功能。
trim标记是⼀个格式化的标记,可以完成t或者是where标记的功能,如下代码:
lect*from ur
<trim prefix="WHERE" prefixoverride="AND|OR">
<if test="name !=null and name.length()>0">
AND name=#{name}
</if>
<if test="gender !=null and gender.length()>0">
AND gender=#{gender}
</if>
</trim>
假如说name和gender的值都不为null的话打印的SQL为:lect * from ur where name = 'xx' and gender = 'xx'
在红⾊标记的地⽅是不存在第⼀个and的,上⾯两个属性的意思如下:
prefix:前缀
prefixoverride:去掉第⼀个and或者是or
update ur
<trim prefix="t" suffixoverride="," suffix=" where id = #{id} ">
<if test="name !=null and name.length()>0">
name=#{name} ,
</if>
<if test="gender !=null and gender.length()>0">
gender=#{gender} ,
</if>
</trim>
假如说name和gender的值都不为null的话打印的SQL为:update ur t name='xx' , gender='xx' where id='x'
双手互搏术在红⾊标记的地⽅不存在逗号,⽽且⾃动加了⼀个t前缀和where后缀,上⾯三个属性的意义如下,其中prefix意义如上:suffixoverride:去掉最后⼀个逗号(也可以是其他的标记,就像是上⾯前缀中的and⼀样)
suffix:后缀
4、where (主要是⽤来简化sql语句中where条件判断的,能智能的处理 and or 条件)
<lect id="dynamicWhereTest" parameterType="Blog" resultType="Blog">
lect*from t_blog
<where>
<if test="title !=null">
title = #{title}
</if>
<if test="content !=null">
and content = #{content}
</if>
<if test="owner !=null">
and owner = #{owner}
</if>
</where>
</lect>
where元素的作⽤是会在写⼊where元素的地⽅输出⼀个where,另外⼀个好处是你不需要考虑where元素⾥⾯的条件输出是什么样⼦
的,MyBatis会智能的帮你处理,如果所有的条件都不满⾜那么MyBatis就会查出所有的记录,如果输出后是and 开头的,MyBatis会把第⼀个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。像上述例⼦中,如果title=null,⽽content != null,那么输出的整个语句会是lect * from t_blog where content = #{content},⽽不是lect * from t_blog where and content = #{content},因为MyBatis会智能的把⾸个and 或 or 给忽略。
女孩做家务5、t (主要⽤于更新时)
<update id="dynamicSetTest" parameterType="Blog">
update t_blog
<t>
<if test="title !=null">
title = #{title},
</if>
<if test="content !=null">
content = #{content},
</if>
<if test="owner !=null">
owner = #{owner}
</if>
</t>
where id = #{id}
</update>
t元素主要是⽤在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出⼀个t,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果t包含的内容为空的话则会出错。有了t元素我们就可以动态的更新那些修改了的字段。6、foreach (在实现 mybatis in 语句查询时特别有⽤)
foreach的主要⽤在构建in条件中,它可以在SQL语句中进⾏迭代⼀个集合。foreach元素的属性主要有
item,index,collection,open,parator,clo。
郑板桥的画
(1)item表⽰集合中每⼀个元素进⾏迭代时的别名。
(2)index指定⼀个名字,⽤于表⽰在迭代过程中,每次迭代到的位置。
(3)open表⽰该语句以什么开始。
(4)parator表⽰在每次进⾏迭代之间以什么符号作为分隔符。
五月丁香(5)clo表⽰以什么结束。
在使⽤foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不⼀样的,主要有⼀下3种情况:
(1)如果传⼊的是单参数且参数类型是⼀个List的时候,collection属性值为list
(2)如果传⼊的是单参数且参数类型是⼀个array数组的时候,collection的属性值为array
雅舍谈吃(3)如果传⼊的参数是多个的时候,我们就需要把它们封装成⼀个Map了,当然单参数也可以封装成map,实际上如果你在传⼊参数的时候,在MyBatis⾥⾯也是会把它封装成⼀个Map的,map的key就是参数名,所以这个时候collection属性值就是传⼊的List或array对象在⾃⼰封装的map⾥⾯的key。
6.1、单参数List的类型
<lect id="dynamicForeachTest" resultType="ity.Ur">
lect*from t_ur where id in
<foreach collection="list" index="index" item="item" open="(" parator="," clo=")">
#{item}
</foreach>秋天开花
</lect>
上述collection的值为list,对应的Mapper是这样的:
/**mybatis Foreach测试 */
public List<Ur> dynamicForeachTest(List<Integer> ids);
测试代码:
@Test
public void dynamicForeachTest() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UrMapper mapper = Mapper(UrMapper.class);
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(6);
List<Ur> urList = mapper.dynamicForeachTest(ids);
for (Ur ur : urList){
System.out.println(ur);
}
sqlSession.clo();
}
6.2、数组类型的参数
<lect id="dynamicForeach2Test" resultType="ity.Ur">
lect * from t_ur where id in
<foreach collection="array" index="index" item="item" open="(" parator="," clo=")">
#{item}
</foreach>
</lect>
对应mapper:
public List<Ur> dynamicForeach2Test(int[] ids);
测试代码:
@Test
public void dynamicForeach2Test() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UrMapper mapper = Mapper(UrMapper.class);
int[] ids = {1,2,6};
List<Ur> urList = mapper.dynamicForeach2Test(ids);语文手抄报简单又漂亮
for (Ur ur : urList){
System.out.println(ur);
}
sqlSession.clo();
}
6.3、Map类型的参数
<lect id="dynamicForeach3Test" resultType="ity.Ur">
lect * from t_ur where urname like '%${urname}%' and id in
<foreach collection="ids" index="index" item="item" open="(" parator="," clo=")"> #{item}
</foreach>
</lect>
mapper 应该是这样的接⼝:
/**mybatis Foreach测试 */
public List<Ur> dynamicForeach3Test(Map<String, Object> params);
测试⽅法:
@Test
public void dynamicForeach3Test() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UrMapper mapper = Mapper(UrMapper.class);
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(6);
Map map =new HashMap();
map.put("urname", "⼩");
map.put("ids", ids);
List<Ur> urList = mapper.dynamicForeach3Test(map);
System.out.println("------------------------");
for (Ur ur : urList){
System.out.println(ur);
}
sqlSession.clo();
}
⼀对多查询
本⽂转⾃:

本文发布于:2023-07-13 12:56:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1094332.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:语句   属性   时候   条件   查询
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图