SSM框架之MyBatis 动态SQL使用

SSM 框架学习 (MyBatis篇)

二、MyBatis 动态SQL使用

在上一个项目的基础上修改,这里主要展示修改部分的内容

1、用户表查询操作-if

<!-- 查询用户列表 动态条件查询-if 
	 如果不使用if,当roleName为空或userName为空时会出现sql异常
	 查看日志可看到异常:select * from db where and userName=?
-->
<select id="getUserList" resultMap="userList">
	select u.*, r.roleName from smbms_user u, smbms_role r
	where u.userRole = r.id
	<if test="userRole != null">
		and u.userRole = #{userRole}
	</if>
	<if test="userName != null and userName != ''">
		and u.userName like CONCAT ('%',#{userName},'%')
	</if>
</select>

2、 动态条件查询-if-where

<!-- 查询用户列表 动态条件查询-if-where-->
<select id="getUserList" resultMap="userList">
	select u.*, r.roleName from smbms_user u, smbms_role r
	<where>
		u.userRole = r.id
		<if test="userName != null and userName != ''" >
			and u.userName like CONCAT ('%',#{userName},'%')
		</if>
		<if test="userRole != null">
			and r.userRole = #{userRole}
		</if>
	</where>
</select>

3、 动态条件更新数据-if-set

<!-- 修改用户信息-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">userPassword=#{userPassword},</if>
		<if test="gender != null">gender=#{gender},</if>
		<if test="birthday != null">birthday=#{birthday},</if>
		<if test="phone != null">phone=#{phone},</if>
		<if test="address != null">address=#{address},</if>
		<if test="userRole != null">userRole=#{userRole},</if>
		<if test="modifyBy != null">modifyBy=#{modifyBy},</if>
		<if test="modifyDate != null">modifyDate=#{modifyDate}</if>
	</set>
	where id=#{id}
</update>

4、 动态条件查找数据-if-trim-prefix-prefixOverrides

<!-- 查询用户列表 动态条件查询-if-trim-prefix-prefixOverrides -->
<select id="getUserList" resultMap="userList">
	select * from smbms_user
	<trim prefix="where" prefixOverrides="and|or">
		<!-- 
			如果满足条件,下面的语句会连接到上面的语句,trim会将第一个连上来的语句的and或or替换成where
			prefix:前缀  prefixOverrides:被替换的词,用 ’|‘分隔,不能有空格(我的测试是这样)
		 -->
		<if test="userName != null and userName != ''">
			and userName like CONCAT ('%',#{userName},'%')
		</if>
		<if test="userRole != null">
			and userRole = #{userRole}
		</if>
	</trim>
</select>

5、 动态条件修改数据-if-trim-prefix-suffixOverrides-suffix

<!-- 修改用户信息-if-trim-suffix-suffixOverrides -->
<update id="modify" parameterType="User">
	update smbms_user
	<trim prefix="set" suffixOverrides="," suffix="where id = #{id}">
		<!-- prefix:前缀,在将下面的句子连接前添加,这里添加为’set‘
			suffixOverrides:后缀覆盖,即将下面的句子连接后的最后一个’,‘,替换成’where id=#{id}‘
			suffix:要替换成的句子
			这里连接的句子为:update smbms_user set userCode = ?,...,modifyDate = ? where id = ?
		-->
		<if test="userCode != null">userCode=#{userCode},</if>
		<if test="userName != null">userName=#{userName},</if>
		<if test="userPassword != null">userPassword=#{userPassword},</if>
		<if test="gender != null">gender=#{gender},</if>
		<if test="birthday != null">birthday=#{birthday},</if>
		<if test="phone != null">phone=#{phone},</if>
		<if test="address != null">address=#{address},</if>
		<if test="userRole != null">userRole=#{userRole},</if>
		<if test="modifyBy != null">modifyBy=#{modifyBy},</if>
		<if test="modifyDate != null">modifyDate=#{modifyDate},</if>
	</trim>
</update>

6、 动态条件查找数据-foreach-array

<!-- 根据用户角色列表,获取该角色列表下用户列表信息-foreach_array -->	
<select id="getUserByRoleId_foreach_array" resultMap="userMapByRole">
	select * from smbms_user where userRole in
	<!-- 
		foreach:迭代一个集合,通常用于in查询
		collection:array|list|map-key(必须指定)
		item:迭代子项,与#{roleIds}对应,
		open:句子组合开始符
		separator:句子组合分隔符
		close:句子组合结束符
	 -->
	<foreach collection="array" item="roleIds" open="(" separator="," close=")">
		#{roleIds}
	</foreach>
</select>

7、 动态条件查找数据-foreach-list

<!-- 根据用户角色列表,获取该角色列表下用户列表信息-foreach_list -->	
<select id="getUserByRoleId_foreach_list" resultMap="userMapByRole">
	select * from smbms_user where userRole in
	<!-- 
		foreach:迭代一个集合,通常用于in查询
		collection:array|list|map-key(必须指定)
		item:迭代子项,与#{roleIds}对应,
		open:句子组合开始符
		separator:句子组合分隔符
		close:句子组合结束符
	 -->
	<foreach collection="list" item="roleIdList" open="(" separator="," close=")">
		#{roleIdList}
	</foreach>
</select>

8、 动态条件查找数据-foreach-map

<!-- 根据用户角色列表,获取该角色列表下用户列表信息-foreach_map -->	
<select id="getUserByRoleId_foreach_map" resultMap="userMapByRole">
	select * from smbms_user where userRole in
	<!-- 
		foreach:迭代一个集合,通常用于in查询
		collection:array|list|map-key(必须指定,map-key对应传入map的key值)
		item:迭代子项,与#{roleIds}对应,
		open:句子组合开始符
		separator:句子组合分隔符
		close:句子组合结束符
	 -->
	<foreach collection="mKey" item="roleIdMap" open="(" separator="," close=")">
		#{roleIdMap}
	</foreach>
</select>

9、 动态条件查找数据-trim-choose

<!-- 查询用户列表(choose) -->
<select id="getUserList_choose" resultType="User">
	select * from smbms_user
	<trim prefix="where" prefixOverrides="and|or">
		<!-- choose类似于switch,从上往下,当满足条件时break(最多连接一条语句),如果全都不满足条件则otherwise -->
		<choose>
			<when test="userName != null and userName != ''">
				and userName like CONCAT ('%',#{userName},'%')
			</when>
			<when test="userCode != null and userCode != ''">
				and userCode like CONCAT ('%',#{userCode},'%')
			</when>
			<when test="userRole != null">
				and userRole = #{userRole}
			</when>
			<otherwise>
				<!-- and YEAR(creationDate = YEAR(NOW()) -->
				and YEAR(creationDate) = YEAR(#{creationDate})
			</otherwise>
		</choose>
	</trim>		
</select>

10、动态条件查询用户列表-分页查询

<!-- 查询用户信息(分页显示) -->
<select id="getUserListByPaging" resultType="User">
	select u.*, r.roleName from smbms_user u, smbms_role r
	where u.userRole = r.id
	<if test="userRole != null">
		and u.userRole = #{userRole}
	</if>
	<if test="userName != null and userName != ''">
		and u.userName like CONCAT ('%',#{userName},'%')
	</if>
	<!-- 
		limit x,y
		y:显示条数,即每页显示条数
		x:显示起始位置
		如:limit 0,5 则从第0条开始显示接下来5条记录
		  limit 5,5 则从第5条开始,显示接下来的5条记录
		  ...
	 -->
	order by u.creationDate DESC limit #{from}, #{pageSize}
</select>

更多推荐
MybatisHelperPro <<<<自己开发的一个Mybatis反编译插件,能快速生成代码,有兴趣可以看看

@Author: 瞌睡虫
@mybatis-3.2.2
@Database: mysql 5.7.15
@Tool: MyEclipse

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值