java框架之mybatis(动态SQL)
Posted Lazy的笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java框架之mybatis(动态SQL)相关的知识,希望对你有一定的参考价值。
使用动态SQL完成多条件查询
使用动态SQL完成多条件查询等逻辑实现【解决参数为Null时,无法查询的问题】
用于实现动态SQL的元素主要有
if/trim/where/set/choose(when、otherwise)/foreach
<!-- 使用resultMap自定义查询结果 -->
<resultMap type="user" id="userList">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<result property="userRoleName" column="roleName" />
</resultMap>
<select id="getUserList2" resultMap="userList" >
select u.*,r.roleName from smbms_user u,smbms_role r
where u.userRole=r.id
<if test="userRole != null">
and userRole=#{userRole}
</if>
<if test="userName != null and userName !=''">
and userName like CONCAT ('%',#{userName},'%')
</if>
</select>
如果where后面没有u.userRole=r.id这样的语句
一定要这样写
<resultMap type="user" id="userList">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<result property="userRoleName" column="roleName" />
</resultMap>
<select id="getUserList2" resultMap="userList" >
select u.*,r.roleName from smbms_user u,smbms_role r
<where>
<if test="userRole != null">
and userRole=#{userRole}
</if>
<if test="userName != null and userName !=''">
and userName like CONCAT ('%',#{userName},'%')
</if>
</where>
</select>
不这样写,后面的语句if为true时,查询语句会变成
select u.*,r.roleName from smbms_user u,smbms_role r and userRole=?系统会报错
where
简化SQL语句中where条件判断
智能处理and和or
trim
属性
prefix 前者
suffix 后缀
prefixOverrides 前缀灵活剔除
suffixOverrides 后缀灵活剔除
更灵活的去除多余关键字
替代where
<select id="getUserList2" resultMap="userList" >
select u.*,r.roleName from smbms_user u,smbms_role r
<trim prefix="where" prefixOverrides="and|or">
<if test="userRole != null">
and userRole=#{userRole}
</if>
<if test="userName != null and userName !=''">
and userName like CONCAT ('%',#{userName},'%')
</if>
</trim>
</select>
使用动态SQL更新操作
if+set完成更新操作
if+trim完成更新操作
在SQL语句中全部写了列set更新,但是实际只是对某几个更新,而其他未写,这样会将其他的列值设为null。本意是将它们不动的。更新用户表数据时,若某个参数为null,会导致更新错误
如何处理
if+set
<update id="modify" parameterType="User">
update smbms_user
<set>
<if test="userCode!=null">userCode=#{userCode},</if>
<if test="userName!=null">userName=#{userName},</if>
<if test="userPassword!=null">userCode=#{userPassword},</if>
<if test="gender!=null">userCode=#{gender},</if>
<if test="birthday!=null">userCode=#{birthday},</if>
<if test="phone!=null">userCode=#{phone},</if>
</set> where id=#{id}
</update>
如果其中某个有Null,原先设置的值不会被修改
if+trim
<update id="modify" parameterType="User">
update smbms_user
<trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
<if test="userCode!=null">userCode=#{userCode},</if>
<if test="userName!=null">userName=#{userName},</if>
<if test="userPassword!=null">userCode=#{userPassword},</if>
<if test="gender!=null">userCode=#{gender},</if>
<if test="birthday!=null">userCode=#{birthday},</if>
<if test="phone!=null">userCode=#{phone},</if>
</trim>
</update>
foreach的使用
迭代一个集合,通常用于in条件
属性
item
index
collection:必须指定
list
array
map-key
open 一般以(开始
separator
close 一般以)关闭,与open对应
需求说明
指定用户角色,获取这些用户角色下的用户列表信息
查询SQL语句含有in条件
select * from smbms_user where userRole in(参数1,参数2,参数3...);
使用foreach实现
参数:用户角色列表
参数类型
数组
list
<!-- foreach-array -->
<resultMap type="User" id="userMapByRole">
<id property="id" column="id" />
<result property="userCode" column="userCode" />
<result property="userName" column="userName" />
<result property="userRole" column="userRole" />
</resultMap>
<select id="getUserRoleId_foreach_array" resultMap="userMapByRole">
select * from smbms_user where userRole in
<foreach collection="array" item="roleIds"
open="(" separator="," close=")">
#{roleIds}
</foreach>
</select>
<!-- foreach-list查询 -->
<select id="getUserRoleId_foreach_list" resultMap="userMapByRole">
select * from smbms_user where userRole in
<foreach collection="list" item="roleIds"
open="(" separator="," close=")">
#{roleIds}
</foreach>
</select>
上面是一个同种参数的多个
如果是多种不同参数入参呢
封装成MAP
<!-- foreach-map多种参数查询 -->
<select id="getUserCondition_foreach_map" resultMap="userMapByRole">
select * from smbms_user where gender=#{gender} and userRole in
foreach collection="rolelist" item="listRoleIds"
open="(" separator="," close=")">
#{listRoleIds}
</foreach>
</select>
单参数也可封装成Map吗
可以,实际上,MyBatis会把参数封装成Map进行入参
参数名:Map的key
参数值:Map的value
choose(when、otherwise)
相当于java中switch语句
当when有条件满足的时候,就跳出choose,只选其中一个
MyBatis分页功能实现
需求说明:
为用户管理之查询用户列表功能增加分页实现
列表结果按照创建时间降序排列
分页-DAO层实现
limit(起始位置,页面容量)
查询用户列表的方法增加2个参数
from
pageSize
以上是关于java框架之mybatis(动态SQL)的主要内容,如果未能解决你的问题,请参考以下文章