MyBatis 的强大特性之一便是它的动态 SQL。动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

1.if标签

映射文件配置:

  	<select id="query" resultMap="baseMap" parameterType="user">
select * from t_user
<!-- 这里的1=1方便测试 -->
where 1=1
<!-- 条件if标签通过判断name参数是否为空决定是否使用这个SQL语句 -->
<if test="name!=null" >
and name=#{name}
</if>
</select>

测试代码name=null的情况下:

@Test
public void test() {
List<User> list = mapper.query(new User());
for (User user : list) {
System.err.println("在name=null的情况下"+user);
}
}

测试结果:



测试代码name!=null的情况下:

@Test
public void test() {
User testUser = new User();
testUser.setName("zhangsan");
List<User> list = mapper.query(testUser);
for (User user : list) {
System.err.println("在name=null的情况下"+user);
}
}

2. choose,when,otherwise

choose选择语句,差不多等同于java语句中的switch语句。通过创建多个标签元素来选择符合要求的元素。when表示在满足某种情况下调用该内容,otherwise表示在所有情况都不满足的情况下调用的内容。

配置标签代码使用方式:

<select id="query" resultMap="baseMap" parameterType="user">
select * from t_user
where 1=1
<!-- 如果满足其中的条件就调用其中的SQL语句 -->
<choose>
<when test="no!=null">
and no=#{no}
</when>
<when test="name!=null">
and name=#{name}
</when>
<otherwise>
<if test="age!=null" >
and age=#{age}
</if>
</otherwise>
</choose>
</select>

3.where

上述配置代码中为了方便测试我都在where后面添加1=1来方便测试,但是有时候我们对where是否使用也需要动态决定。这个时候就可以使用where标签来解决这个问题。

<select id="queryById" resultType="user" parameterType="int">
select *
from t_user
<where>
<if test="no!=null" >
no=#{no}
</if>
</where>
</select>

这里满足条件就会自动添加where并调用其中的SQL代码。

4.set

set标签主要用于SQL更新UPDATE代码中,用法如下代码:

<update id="update" parameterType="user">
update t_user
<!-- 通过set来动态设置更新的参数 -->
<set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set>
where no = #{no}
</update>

5.trim

trim标签是一个格式化标签,可以用来代替set或者where标签的功能。具体用法如下代码:

<update id="update" parameterType="user">
update t_user
<!-- <set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set> -->
<!-- prefix表示调用SQL语句时在最前面添加的前缀
prefixOverrides表示调用SQL语句时去掉的第一个指定内容
suffix表示调用SQL语句时在最后面添加的后缀
suffixOverride表示调用SQL语句时去掉的最后一个指定内容
-->
<trim prefix="set" prefixOverrides="and | or">
<if test="name!=null"> and name=#{name}</if>
<if test="age!=null"> or age=#{age}</if>
</trim>
where no = #{no}
</update>

通过这个trim获得了跟set一样的效果,不过更具有灵活性。

最新文章

  1. 使用 AngularJS 和 Electron 构建桌面应用
  2. Haskell List相关操作
  3. 修正 XE5 Android 键盘三个问题
  4. hdu1520
  5. 【Android】线程池原理及Java简单实现
  6. Gao Big 深圳行
  7. Python 的列表解析和生成表达式的异同
  8. spring aop配置及用例说明(4)
  9. yii YII小部件 创建登录表单表单 Login表单
  10. WPF 多线程
  11. Android 应用框架 —— 组件
  12. Boost.Asio c++ 网络编程翻译(14)
  13. 为什么EXE文件出现了不该出现的“盾牌”
  14. Python日期时间Date/Time
  15. Vue源码后记-vFor列表渲染(3)
  16. iozone测试磁盘性能
  17. 文件访问时间简记(Modify time 和 Change time)
  18. h5面试题
  19. python class和class(object)用法区别
  20. RPM 包的构建 - 实例

热门文章

  1. Vue设置element的dialog
  2. C++11的for循环的新用法
  3. Leetcode429.N-ary Tree Level Order TraversalN叉树的层序遍历
  4. Leetcode563.Binary Tree Tilt二叉树的坡度
  5. import schedule ImportError: No module named schedule
  6. angular1.0 $http jsonp callback
  7. git bash 常用操作文件命令行
  8. 【maven】maven pom文件详解
  9. 解决底部Button遮挡ListView最后一项内容的bug
  10. java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.copyInputStreamToFile(Ljava/io/InputStream;Ljava/io/File;)V