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)的主要内容,如果未能解决你的问题,请参考以下文章

Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件

Java框架之Mybatis

java框架之mybatis

java面试之Mybatis篇

java框架之mybatis(SQL映射文件)

深入理解java:4.3.1. 框架编程之MyBatis---SQL语句执行的完整流程