MyBatis框架动态SQL处理简单的多参数查询
if标签:
用法类似Java中的if语句,选择性拼接指定SQL片段.
格式:
if test=“条件”
SQL片段
/if
说明:
1.当条件为true时,将SQL片段拼接到该标签所在位置
示例:
<select id="getUser" resultType="user">
select * from user where 1=1
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="sex!=null">
and sex=#{sex}
</if>
<if test="age!=null">
and age=#{age}
</if>
<if test="address!=null">
and address=#{address}
</if>
</select>
where标签:

示例:
<select id="getUser" resultType="user">
select * from user
<where>
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="sex!=null">
and sex=#{sex}
</if>
<if test="age!=null">
and age=#{age}
</if>
<if test="address!=null">
and address=#{address}
</if>
</where>
</select>
choose标签:

示例:
<select id="getUserches" resultType="user" parameterType="user">
select * from user
<where>
<choose>
<when test="name!=null">
and name=#{name}
</when>
<when test="sex!=null and sex!=' '">
and sex=#{sex}
</when>
<when test="address!=null">
and address=#{address}
</when>
<otherwise>
</otherwise>
</choose>
</where>
</select>
执行到choose标签时,只会进入test属性判断为true的第一个when标签,执行之后便跳出choose标签。如果所有when标签的test属性都为false,则进入otherwise标签。与JSTL中的choose标签非常相似。
forEach标签:
用于遍历集合,通常用于构建in语句中.
格式:
select 字段列 from 表名 where 字段名 in
#{变量A}
说明:
1.collection属性值为集合类型的属性名.当参数为数组时,默认参数的名为array,当参数为List集合时,默认的参数名为list,当参数为Map集合时,参数名为map中集合元素所在的键值key
2.item属性值为变量名,名称任意.该变量存放当前元素/键值
3.index属性值为变量名,名称任意.该变量存放当前元素索引/键名
4.open,separator,close属性值为符号,表示遍历开始/中间/结束时拼接的符号
示例:foreach标签处理数组类型参数
<select id="getUserArray" resultType="user">
select * from user where id in
<foreach collection="array" open="(" close=")" separator="," item="eml">
${eml}
</foreach>
</select>
添加测试方法:
public void getuserarray(){
SqlSession session = MyBatisUtils.getSqlSession();
int[] ids={1,2};
List<User> list = session.getMapper(UserMapper.class).getUserArray(ids);
logger.info("当前查出的记录数"+list.size());
logger.info("查询结果"+list);
session.commit();
MyBatisUtils.close(session);
}
foreach标签处理List类型参数:
<select id="getUserList" resultType="user">
select * from user where id in
<foreach collection="list" open="(" close=")" separator="," item="listitem">
${listitem}
</foreach>
</select>
添加测试方法:
public void getuserlist(){
SqlSession session = MyBatisUtils.getSqlSession();
List<Integer> intlist =new ArrayList<Integer>();
intlist.add(1);
intlist.add(2);
List<User> list = session.getMapper(UserMapper.class).getUserList(intlist);
logger.info("当前查出的记录数"+list.size());
logger.info("查询结果"+list);
session.commit();
MyBatisUtils.close(session);
}
foreach标签处理Map类型参数:
<select id="getUserMap" resultType="user">
select * from user where id in
<foreach collection="mapuser" open="(" close=")" separator="," item="listmap">
${listmap}
</foreach>
</select>
添加测试方法:
public void getusermap(){
SqlSession session = MyBatisUtils.getSqlSession();
List<Integer> intlist =new ArrayList<Integer>();
intlist.add(1);
intlist.add(2);
Map<String,Object> map = new HashMap<String, Object>();
map.put("mapuser",intlist);
List<User> list = session.getMapper(UserMapper.class).getUserMap(map);
logger.info("当前查出的记录数"+list.size());
logger.info("查询结果"+list);
session.commit();
MyBatisUtils.close(session);
}
动态SQL处理更新功能
更新数据功能主要通过set+if标签来实现
set标签:

示例:
<update id="editUser" parameterType="user">
update user
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="sex!=null and sex!=''">
sex=#{sex},
</if>
<if test="age!=null">
age=#{age},
</if>
<if test="address!=null and address!=''">
address=#{address},
</if>
</set>
where id=#{id}
</update>
添加测试方法“:
public void updateuser(){
SqlSession session = MyBatisUtils.getSqlSession();
User user = new User();
user.setId(1);
user.setAddress("上海上海");
int re = session.getMapper(UserMapper.class).editUser(user);
logger.info(re!=-1?"操作成功":"操作失败");
session.commit();
MyBatisUtils.close(session);
}
trim标签
语法:
<trim prefix="前缀" suffix="后缀" perfixOverrides="忽略前缀" suffixOverrides="忽略后缀">
.....
</trim>
属性介绍如下:
- perfix:前缀,可以自动对trim标签所包含的语句是否有返回值进行判断。如果有返回值,则为SQL语句拼接相应的前缀。
- suffix:后缀,在trim标签包含的语句末尾拼接后缀。
- perfixOverrides:忽略的前缀,忽略trim标签内部首部指定的内容。
- suffixOverrides:忽略的后缀,忽略trim标签包含内容尾部指定的内容。
示例:
<select id="getUser" resultType="user">
select * from user
<trim prefix="where" prefixOverrides="and|or">
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null and name!=''">
and name like CONCAT('%', #{name}, '%')
</if>
</trim>
</select>
添加测试方法:
public void getuser(){
SqlSession session = MyBatisUtils.getSqlSession();
Integer id=null;
String name=null;
List<User> list = session.getMapper(UserMapper.class).getUser(id,name);
logger.info("当前查出的记录数"+list.size());
logger.info("查询结果"+list);
session.commit();
MyBatisUtils.close(session);
}
分页查询思路:
limit #{pageBegin},#{pageSize}
#{pageBegin}表示查询开始位置,#{pageSize}表示要查询的数据量。
#{pageBegin}的计算方法为Integer pageBengin=(Pageindex-1) * pageSize;
pageIndex为当前的页数 当前页数-1在乘以每页要显示的数据量。
本文介绍了MyBatis框架中动态SQL的使用,包括if、where、choose(when/otherwise)、forEach标签的用法,以及在多参数查询和更新操作中的应用。示例代码展示了如何处理数组、List和Map类型的参数,并解释了set和trim标签在更新语句中的作用。此外,还提及了分页查询的基本思路。
5224

被折叠的 条评论
为什么被折叠?



