MyBatis动态SQL(一)
2024-09-06 15:48:11
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一样的效果,不过更具有灵活性。
最新文章
- 使用 AngularJS 和 Electron 构建桌面应用
- Haskell List相关操作
- 修正 XE5 Android 键盘三个问题
- hdu1520
- 【Android】线程池原理及Java简单实现
- Gao Big 深圳行
- Python 的列表解析和生成表达式的异同
- spring aop配置及用例说明(4)
- yii YII小部件 创建登录表单表单 Login表单
- WPF 多线程
- Android 应用框架 —— 组件
- Boost.Asio c++ 网络编程翻译(14)
- 为什么EXE文件出现了不该出现的“盾牌”
- Python日期时间Date/Time
- Vue源码后记-vFor列表渲染(3)
- iozone测试磁盘性能
- 文件访问时间简记(Modify time 和 Change time)
- h5面试题
- python class和class(object)用法区别
- RPM 包的构建 - 实例
热门文章
- Vue设置element的dialog
- C++11的for循环的新用法
- Leetcode429.N-ary Tree Level Order TraversalN叉树的层序遍历
- Leetcode563.Binary Tree Tilt二叉树的坡度
- import schedule ImportError: No module named schedule
- angular1.0 $http jsonp callback
- git bash 常用操作文件命令行
- 【maven】maven pom文件详解
- 解决底部Button遮挡ListView最后一项内容的bug
- java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.copyInputStreamToFile(Ljava/io/InputStream;Ljava/io/File;)V