MyBatis学习17-动态sql

1.mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

2.问题来源

<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user where sex= #{userCustom.sex} and username like ‘%${userCustom.username}%‘
</select>

上述的查询条件可能都为空,所以需要对查询条件进行判断,然后拼接。修改为:

<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user
<where>
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=‘‘">
and user.sex = #{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=‘‘">
username like ‘%${userCustom.username}%‘
</if>
</if>
</where>
</select>

where可以自动去掉条件中的第一个and

3.sql片断

将上边的动态sql的判断代码块抽取出来,组成一个sql片断。那么其他的statement可以引用这个sql片断。

定义一个sql片断,去掉上述黑体字中的<where></where>

<sql id="query_user_where">
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=‘‘">
and sex = #{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=‘‘">
and username like ‘%${userCustom.username}%‘
</if>
</if>
</sql>

引用sql片断

<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user
<where>
<include refid="query_user_where"></include>
</where>
</select>

4.for-each

向sql传递数组或List,mybatis使用foreach解析

需求:public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;

a.在输入参数类型UserQueryVo 添加List<Integer> ids以用于传入多个id

public class UserQueryVo {

//传入多个id
private List<Integer> ids;

。。。

b.修改mapper.xml

<sql id="query_user_where">

<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=‘‘">
and sex = #{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=‘‘">
and username like ‘%${userCustom.username}%‘
</if>
<if test="ids!=null">
<foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
id=#{user_id}
</foreach>
</if>
</if>

</sql>

c.测试,测试成功

@Test
public void testFindUserList() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
//userCustom.setSex("1");
userCustom.setUsername("小明");
userQueryVo.setUserCustom(userCustom);

List<Integer> ids = new ArrayList<Integer>();
ids.add(16);
ids.add(22);
ids.add(27);
userQueryVo.setIds(ids);

List<UserCustom> list = userMapper.findUserList(userQueryVo);
System.out.println(list);
}

时间: 2024-10-11 00:08:33

MyBatis学习17-动态sql的相关文章

Mybatis学习笔记-动态SQL与模糊查询

需求:实现多条件查询用户(姓名模糊匹配, 年龄在指定的最小值到最大值之间) User.java实体类 public class User { private int id; private String name; private int age; //... } ConditionUser.java public class ConditionUser { private String name; private int minAge; private int maxAge; //... }

Mybatis学习之动态sql语句(7)

Mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的

mybatis学习之动态sql

mybatis的动态sql语句很强大,在mapper映射文件中使用简单的标签即可实现该效果,下面一个个记录: 1.select查询 简单的select类似如下: <select id="findById" resultMap="StudentResult" parameterType="Integer"> select * from t_student where id = #{id} </select> 1)if(常用于

Mybatis使用之动态SQL语句

Mybatis使用之动态SQL语句 一:简介 Mybatis动态SQL语句可帮助我们根据需要动态拼接SQL语句.主要在配置文件中使用<where> <if><choose><when><otherwise> <set> <trim><foreach>标签来实现. 二:具体使用方式 2.1 where 2.1.1 功能 语句的作用主要是简化SQL语句中where中的条件判断,where元素的作用是会在写入wher

mybatis入门基础----动态SQL

原文:http://www.cnblogs.com/selene/p/4613035.html 阅读目录 一:动态SQL 二:SQL片段 三:foreach 回到顶部 一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态sql,对查询条件进行判断,如果输入参数不为空才进行查询拼接. 1.3.UserMapper.xml 1 <!-- 用户信息综合查询

mybatis 详解------动态SQL

目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,otherwise) 语句 5.动态SQL:trim 语句 6.动态SQL: SQL 片段 7.动态SQL: foreach 语句 8.总结 前面几篇博客我们通过实例讲解了用mybatis对一张表进行的CRUD操作,但是我们发现写的 SQL 语句都比较简单,如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ,稍微不

MyBatis进阶使用——动态SQL

MyBatis的强大特性之一就是它的动态SQL.如果你有使用JDBC或者其他类似框架的经验,你一定会体会到根据不同条件拼接SQL语句的痛苦.然而利用动态SQL这一特性可以彻底摆脱这一痛苦 MyBatis精简了元素种类,在MyBatis3中,我们只需要学习以下4种元素: if choose(when,otherwise) trim(where,set) foreach if 动态SQL通常要做的事情就是根据条件包含where子句的一部分,比如: <select id="findActiveB

MyBatis中的动态SQL

动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形. 动态 SQL 元素和 JSTL 或基于类似 XML 的文本处

Mybatis框架之动态SQL书写方式小结

动态SQL简介 动态SQL是Mybatis框架中强大特性之一.在一些组合查询页面,需要根据用户输入的查询条件生成不同的查询SQL,这在JDBC或其他相似框架中需要在代码中拼写SQL,经常容易出错,在Mybatis框架中可以解决这种问题. 使用动态SQL元素与JSTL相似,它允许我们在XML中构建不同的SQL语句.常用元素为: 判断元素:if,choose 关键字元素:where,set,trim 循环元素:foreach if元素 if元素是简单的条件判断逻辑,满足指定条件时追加if元素内的SQ