mybatis入门篇:mybatis动态SQL
1、if用法
<select id="selectUser" resultType="com.forest.owl.entity.User">
select * from user
where 1=1
<if test="userName != null and userName != '' ">
and user_name like concat('%', #{userName}, '%')
</if>
<if test="userPhone != null and userPhone !='' ">
and user_phone=#{userPhone}
</if>
</select>
2、choose
<select id="selectUser" resultType="com.forest.owl.entity.User">
select * from user
where 1=1 /*此处不可忽略*/
<choose>
<when test="id != null">
and id=#{id}
</when>
<when test="userName != null and userName !='' ">
and user_name=#{userName}
</when>
<otherwise>
and 1=2 /*此处不可忽略*/
</otherwise>
</choose>
</select>
3、where
where标签内如果没有符合条件的选项,则最后生成的sql语句不含where;如果有符合条件的,则生成的sql语句会自动去除两端的and
<select id="selectUser" resultType="com.forest.owl.entity.User">
select * from user
<where>
<if test="userName != null and userName != '' ">
and user_name like concat('%', #{userName}, '%')
</if>
<if test="userEmail != null and userEmail != '' ">
and user_email = #{userEmail}
</if>
</where>
</select>
4、set
<update id="updateUserById">
update user
<set>
<if test="userName != null and userName != '' ">
user_name=#{userName},
</if>
id=#{id} /*此处不可忽略*/
</set>
where id=#{id}
</update>
5、foreach
collection:必填,值为要迭代循环的属性名。
item:变量名,值为要从迭代对象中取出的每一个值
index:索引的属性名。在集合数组下为索引值,在Map对象下为Map的key值。
参数为List的情况
<select id="selectByIdList" resultType="com.forest.owl.entity.User">
select * from user
where id in
<foreach collection="list" open="(" close=")" separator="," item="id" index="i">
#{id}
</foreach>
</select>
参数为Map的情况
<update id="updateByMap">
update user
set
<foreach collection="_parameter" item="val" index="key" separator=",">
${key}=#{val}
</foreach>
where id=#{id}
</update>
6、bind
bind标签可以使用OGML表达式创建一个变量病绑定到上下文中。
如
<if test="userName != null and userName != '' ">
and user_name like concat('%', #{userName}, '%')
</if>
可以通过bind改写成
<if test="userName != null and userName != '' ">
<bind name="userNameLike" value=" '%' + userName + '%' "/>
and user_name #{userNameLike}
</if>
7、如果测试的时候想知道映射XML中方法执行的参数 可以这么做:
public class StringUtil{
public static void print(Object parameter){
System.out.println(parameter);
}
}
<bind name="print" value="@com.forest.owl.util.StringUtil@print(_parameter)" />
8、鉴别器映射(discriminator)
有时单独一个映射会需要返回不同数据类型的结果集,discriminator就是为了用来处理这种情况。
因为感觉这个标签不会很常用,所以不做进一步了解,暂时给出简单的代码,后续有需要再回来翻阅:
<resultMap id="UserAndRole" extends="BaseResultMap" type="com.forest.owl.entity.User">
<discriminator javaType="int" column="enabled">
<" resultMap="resultMap1"/>
<" resultMap="resultMap2"/>
</discriminator>
</resultMap>
mybatis入门篇:mybatis动态SQL的更多相关文章
- Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider(8)
1)动态语言注解(2)@Provider使用思路(3)@SelectProvider小试牛刀(4)@SelectProvider初露锋芒(5)@SelectProvider过关斩将(6)@Insert ...
- 持久层之 MyBatis: 第二篇 :动态SQL And多表查询
MyBatis入门到精通 完整CRUD UserDaoImpl 编写UserDao对应的UserDaoMapper.xml 添加UserDao的测试用例 编写UserDao的测试用例 解决数据库字段名 ...
- mybatis入门基础(五)----动态SQL
一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...
- Mybatis第三篇【动态SQL】
动态SQL 何为动态SQL??回顾一下我们之前写的SSH项目中,有多条件查询的情况,如下图 我们当时刚开始做的时候,是需要在Controller中判断SQL是否已经有条件了,因为SQL语句需要拼接起来 ...
- MyBatis学习总结_11_MyBatis动态Sql语句
MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...
- MyBatis:学习笔记(4)——动态SQL
MyBatis:学习笔记(4)——动态SQL
- SSM框架之Mybatis(6)动态SQL
Mybatis(6)动态SQL 1.动态SQL 出现原因:有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了 1.1.if标签 我们根据实体类的不 ...
- Spring mybatis源码篇章-动态SQL节点源码深入
通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-动态SQL基础语法以及原理 前话 前文描述到通过mybatis默认的解析驱动类org.apache.ibat ...
- SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL
前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...
- Mybatis分页查询与动态SQL
一.Mybatis的分页查询 由于第一二节较为详细讲述了Mybatis的环境搭建,文件配置,SQL编写和Java代码实现,所以接下来的讲述都将只抽取关键代码和mapper文件中的关键sql,详细的流程 ...
随机推荐
- sync.Pool的使用
一定要搞明白sync.Pool的正确用法,避免出现以下问题: kline := this.pool.Get() defer this.pool.Put(kline) kline.UnMarshal(d ...
- Python学习之路基础篇--10Python基础,函数进阶
1 命名空间 对于Python 来说命名空间一共有三种 1 内置命名空间 —— Python 解释器 就是Python 解释器一启动就可以使用的名字,储存在内置命名空间中.内置的名字在启动解释器的时候 ...
- JavaScript创建对象的方式
一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程. 考虑到在 ECMAScript 中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的 ...
- 微信小程序测试策略
一.测试前准备(环境搭建) 1.前端页面 微信Web开发者工具安装.授权测试用的微信号可预览和调试小程序... 可参考此文: 微信Web开发者工具-下载.安装和使用图解 2.管理后台 配置内网测试服务 ...
- NABCD(团队项目)
N (Need 需求) 随着时代的进步和手机迅速发展,各种软件充斥这我们的生活,在学校里,我们总为一些各种各样的群所困扰,我们需要一件工具整合信息,让我们的生活更加便利. A (Approach 做法 ...
- 第三次Scrum冲刺————Life in CCSU
# 第三次Scrum冲刺————Life in CCSU # 一.第三次Scrum任务 小组GitHub地址链接:https://github.com/LoneylittleTeam/Team 个人G ...
- 一个mysqldump的报错
1.MySQL版本 5.7.14-log 2.问题分析 mysqldump -uxxx -pxxx db_nale 一般来讲上述命令主要是用于MySQL的逻辑备份,用来备份某个数据的全部表,但是我在执 ...
- 【简书】在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目
在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目 作者 DonnieZero 关注 2017.07.29 22:02* 字数 2218 阅读 5556评论 3喜欢 1赞赏 1 ...
- cpp实验二
1.函数重载编程练习 编写重载函数add(),实现对int型,double型,Complex型数据的加法.在main()函数中定义不同类型 数据,调用测试. #include<iostream& ...
- ubuntu18.04 配置chrome ss
为了FQ 不FQ不行啊 安装shaowsocks 1. 用实验室的服务器 sslocal -c xxx.json 2. 下载SwitchyOmega插件 链接: https://pan.baidu.c ...