第三章-mybatis框架动态sql
2022-12-02 16:55:03 1283浏览
mybatis框架动态sql
1.动态sql处理简单的多参数查询
1.1if标签
需求:
1.查询roleId为2的并且realName里有赵这个字的用户
2.只查realName里有赵这个字的用户
也就是说roleId和realName都不是必传的参数时要封装成一个sql怎么写?
<select id="getList" resultMap="userRole" parameterType="cn.cvs.pojo.SysUser">
SELECT
a.*, b.id AS rid,
b.roleName,
b. CODE
FROM
t_sys_user a
LEFT JOIN t_sys_role b ON a.roleId = b.id
WHERE
1 = 1
<if test="roleId != null ">
and a.roleId = #{roleId }
</if>
<if test=" realName!= null and realName!= '' ">
and a.realName like CONCAT( '%', #{realName},'%')
</if>
</select>1.2where标签
<resultMap id="userRole" type="cn.cvs.pojo.SysUser">
<id column="id" property="id"></id>
<association property="sysRole" javaType="cn.cvs.pojo.SysRole">
<id property="id" column="rid"></id>
<result property="code" column="code"></result>
<result property="roleName" column="roleName"></result>
</association>
</resultMap>
<select id="getList" resultMap="userRole" parameterType="cn.cvs.pojo.SysUser">
SELECT
a.*, b.id AS rid,
b.roleName,
b. CODE
FROM
t_sys_user a
LEFT JOIN t_sys_role b ON a.roleId = b.id
<where>
<if test="roleId != null ">
a.roleId = #{roleId }
</if>
<if test=" realName!= null and realName!= '' ">
and a.realName like CONCAT( '%', #{realName},'%')
</if>
</where>
</select>1.3实战训练
使用if标签+where标签改造入库记录模块的列表查询功能
1.4choose(when,othervise)标签
choose标签是一个组合标签,通常与when,otherwise标签配合使用,实现了类似Java中switch语句的功能。
<select id="getListByChoose" resultType="cn.part3.pojo.SysUser" parameterType="cn.part3.pojo.SysUser">
select * from t_sys_user
<where>
<choose>
<when test=" roleId!= null ">
and roleId = #{roleId}
</when>
<when test=" realName!= null and realName!= '' ">
and realName like CONCAT( '%', #{realName},'%')
</when>
<when test=" account!= null and account != '' ">
and account = #{account}
</when>
<otherwise>
and YEAR (createdTime) = YEAR (#{createdTime})
</otherwise>
</choose>
</where>
</select>备注:
1.第一个when标签符合条件后,其他的when标签就不会被执行了
2.当所有条件都不满足时,才会执行otherwise标签内的代码。
2.动态sql处理集合参数
2.1foreach标签处理数组类型参数
<select id="getUserByRoleIdArray" resultType="cn.part3.pojo.SysUser">
select * from t_sys_user where roleId in
<foreach collection="array" item="item" open="(" separator="," close =")">
#{item}
</foreach>
</select>- collection:参数名称,当参数为数组类型时,默认参数名为array,当参数类型为list集合的时候,默认参数名为list,当参数类型为map时,参数名为map中集合元素所在键值对的key.
- item:遍历数组的时候,为数组或list集合中的元素起的别名
- open:起始位置的拼接字符,表示in语句以“(”左括号开始
- separator:元素之间的连接符,表示in语句中的元素之间以“,”逗号连接
- close:结束位置的拼接字符,表示in语句以“)”右括号结束
2.2foreach标签处理list类型参数
<select id="getUsersByRoleList" resultType="cn.part3.pojo.SysUser">
select * from t_sys_user where roleId in
<foreach collection="list" item="item" open="(" separator="," close =")">
#{item}
</foreach>
</select>2.3foreach标签处理map类型参数
<select id="getUsersByRoleMap" resultType="cn.part3.pojo.SysUser">
select * from t_sys_user where roleId in
<foreach collection="roleIdList" item="item" open="(" separator="," close =")">
#{item}
</foreach>
</select>sqlSession=MyBatisUtil.createSqlSession();
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
Map<String,Object> map = new HashMap<>();
map.put("roleIdList",ids);
List<SysUser> sysUserList = sqlSession.getMapper(SysUserMapper.class).getUsersByRoleMap(map);
sysUserList.forEach(u -> System.out.println(u));3.动态sql处理更新功能
mybatis框架动态更新数据的功能主要是通过set+if标签实现
set标签
<update id="update">
update t_sys_user
<set>
<if test="account != null ">account=#{account},</if>
<if test="password != null ">password=#{password},</if>
<if test="realName != null ">realName=#{realName},</if>
<if test="roleId != null ">roleId=#{roleId},</if>
<if test="phone != null ">phone=#{phone},</if>
<if test="address != null ">address=#{address},</if>
<if test="roleId != null ">roleId=#{roleId},</if>
<if test="sex != null ">sex=#{sex},</if>
<if test="birthday != null ">birthday=#{birthday},</if>
<if test="updatedUserId != null ">updatedUserId=#{updatedUserId},</if>
<if test="updatedTime != null ">updatedTime=#{updatedTime},</if>
</set>
where id = #{id}
</update>4.动态sql知识扩展
4.1tirm标签
语法:
<trim prefix="前缀" suffix="后缀" prefixOverrides="忽略前缀" suffixOverrides="忽略后缀">
</trim>
改造set标签
<update id="update">
update t_sys_user
<trim prefix="set" suffixOverrides=",">
<if test="account != null ">account=#{account},</if>
<if test="password != null ">password=#{password},</if>
<if test="realName != null ">realName=#{realName},</if>
<if test="roleId != null ">roleId=#{roleId},</if>
<if test="phone != null ">phone=#{phone},</if>
<if test="address != null ">address=#{address},</if>
<if test="roleId != null ">roleId=#{roleId},</if>
<if test="sex != null ">sex=#{sex},</if>
<if test="birthday != null ">birthday=#{birthday},</if>
<if test="updatedUserId != null ">updatedUserId=#{updatedUserId},</if>
<if test="updatedTime != null ">updatedTime=#{updatedTime},</if>
</trim>
where id = #{id}
</update>改造where标签
<select id="getList" resultMap="userRole" parameterType="cn.part3.pojo.SysUser">
SELECT
a.*, b.id AS rid,
b.roleName,
b. CODE
FROM
t_sys_user a
LEFT JOIN t_sys_role b ON a.roleId = b.id
<trim prefix="where" prefixOverrides="and|or">
<if test="roleId != null ">
and a.roleId = #{roleId }
</if>
<if test=" realName!= null and realName!= '' ">
and a.realName like CONCAT( '%', #{realName},'%')
</if>
</trim>
</select>5.mybatis框架的分页功能
mybatis框架并没有对分页功能做过多的处理,而是使用数据库自带的分页功能。
重点:分页参数和实体参数(条件查询)同时传过来的处理方式
//分页查询
public List<SysUser> page(@Param("user")SysUser user, @Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize);<select id="page" resultType="cn.part3.pojo.SysUser">
select * from t_sys_user
<trim prefix="where" prefixOverrides="and|or">
<if test="user.realName != null and user.realName != '' ">
and realName like CONCAT ('%',#{user.realName},'%')
</if>
<if test="user.roleId != null ">
and roleId = #{user.roleId}
</if>
</trim>
order by createdTime desc
limit #{pageIndex}, #{pageSize}
</select>重点注意这个@Param("user")和sql映射文件中的 <if test="user.xxx>绑定。
6.讲课视频
好博客就要一起分享哦!分享海报
此处可发布评论
评论(2)展开评论
您可能感兴趣的博客
他的专栏
他感兴趣的技术

新业务
springboot学习
ssm框架课
vue学习
【带小白】java基础速成