MyBatis探究-----动态SQL详解
1.if标签
接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);
XML中:where 1=1必不可少
<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
select * from t_employee where 1=1
<if test="empId!=null">
and empId=#{empId}
</if>
<if test="empName!=null && empName.trim()!=""">
and empName like #{empName}
</if>
<if test="empSex==0 or empSex==1">
and empSex=#{empSex}
</if>
<if test="empAge!=null">
and empAge=#{empAge}
</if>
</select>
2.where标签
接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);
XML中:
mybatis就会将where标签中拼装的sql,多出来的and或者or去掉,只会去掉第一个多出来的and或者or
<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
select * from t_employee
<where>
<if test="empId!=null">
empId=#{empId}
</if>
<if test="empName!=null && empName.trim()!=""">
and empName like concat('%',#{empName},'%')
</if>
<if test="empSex==0 or empSex==1">
and empSex=#{empSex}
</if>
<if test="empAge!=null">
and empAge=#{empAge}
</if>
</where>
</select>
3.set标签
接口中方法:public Integer updateEmp(Employee emp);
XML中:
<update id="updateEmp">
<!-- Set标签的使用 推荐 -->
<!-- update t_employee
<set>
<if test="empName!=null">
empName=#{empName},
</if>
<if test="empSex==0 or empSex==1">
empSex=#{empSex},
</if>
<if test="empAge!=null">
empAge=#{empAge}
</if>
</set>
where empId=#{empId} --> <!-- Trim:更新拼串 -->
update t_employee
<trim prefix="set" suffixOverrides=",">
<if test="empName!=null">
empName=#{empName},
</if>
<if test="empSex==0 or empSex==1">
empSex=#{empSex},
</if>
<if test="empAge!=null">
empAge=#{empAge}
</if>
</trim>
where empId=#{empId}
</update>
4.trim标签
接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);
XML中:
<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
select * from t_employee
<!-- 后面多出的and或者or where标签不能解决
prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
prefix给拼串后的整个字符串加一个前缀
prefixOverrides="":
前缀覆盖: 去掉整个字符串前面多余的字符
suffix="":后缀
suffix给拼串后的整个字符串加一个后缀
suffixOverrides=""
后缀覆盖:去掉整个字符串后面多余的字符 -->
<!-- 自定义字符串的截取规则 -->
<trim prefix="where" suffixOverrides="and">
<if test="empId!=null">
empId=#{empId} and
</if>
<if test="empName!=null && empName!=""">
empName like #{empName} and
</if>
<if test="empSex==0 or empSex==1">
and empSex=#{empSex}
</if>
<if test="empAge!=null">
and empAge=#{empAge}
</if>
</trim>
</select>
5.foreach标签
5.1 批量查询
接口中方法:public List<Employee> getEmpsByempIdList(@Param("empIdList")List<String> empIdList);
XML中:
<select id="getEmpsByempIdList" resultType="com.mybatis.entity.Employee">
select * from t_employee
<!-- collection:指定要遍历的集合
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
-->
<foreach collection="empIdList" item="empId" separator=","
open="where empId in(" close=")">
#{empId}
</foreach>
</select>
5.2 批量插入
接口中方法:public Integer addEmployees(@Param("emps")List<Employee> emps);
XML中:
<insert id="addEmployees">
<!-- 第一种方式:推荐 -->
insert into
t_employee(empId,empName,empSex,empAge)
values
<foreach collection="emps" item="emp" separator=",">
(#{emp.empId},#{emp.empName},#{emp.empSex},#{emp.empAge})
</foreach> <!-- 第二种方式:不推荐 需要数据库连接属性allowMultiQueries=true -->
<!--
<foreach collection="emps" item="emp" separator=";">
insert into t_employee(empId,empName,empSex,empAge)
values(#{emp.empId},#{emp.empName},#{emp.empSex},#{emp.empAge})
</foreach>
-->
</insert>
5.3 批量删除
接口中方法:public Integer deleteEmpsByempIdList(@Param("empIdList")List<String> empIdList);
XML中:
<delete id="deleteEmpsByempIdList">
delete from t_employee
<foreach collection="empIdList" item="empId" separator=","
open="where empId in(" close=")">
#{empId}
</foreach>
</delete>
6.choose标签
接口中方法:public List<Employee> getEmpsByChooseCondition(Employee emp);
XML中:
<select id="getEmpsByChooseCondition" resultType="com.mybatis.entity.Employee">
select * from t_employee
<where>
<!-- 如果带了empId就用empId查,如果带了empName就用empName查;只会进入其中一个 -->
<choose>
<when test="empId!=null">
empId=#{empId}
</when>
<when test="empName!=null">
empName like #{empName}
</when>
<otherwise>
empSex = 0
</otherwise>
</choose>
</where>
</select>
总结:mybatis 的动态sql语句是基于OGNL表达式的,主要有以下几类(可以随机组合)
- if 简单的条件判断
- choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
- trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
- where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
- set (主要用于更新时)
- foreach (在实现 mybatis in 语句查询时特别有用)
MyBatis探究-----动态SQL详解的更多相关文章
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- MyBatis的动态SQL详解-各种标签使用
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...
- Oracle中动态SQL详解(EXECUTE IMMEDIATE)
Oracle中动态SQL详解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠倾我心 阅读数:744 标签: oracle动态sqloracle 更多 个人分类: ...
- MyBatis动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...
- Java数据持久层框架 MyBatis之API学习七(动态 SQL详解)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- 超全MyBatis动态SQL详解!( 看完SQL爽多了)
MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...
- oracle中动态SQL详解
部分内容参考网上资料 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情 ...
- 动态SQL详解
动态SQL 在之前用户所编写的PL/SQL程序时有一个最大的特点:就是所操作的数据库对象(例如:表)必须存在,否则创建的子程序就会出问题,而这样的操作在开发之中被称为静态SQL操作,而动态SQL操作可 ...
- (转)Oracle中动态SQL详解
本文转载自:http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html 1.静态SQLSQL与动态SQL Oracle编译PL ...
随机推荐
- sybase central 报 NullPointerException 解决
准备发布版本,但是要创建数据库的时候遇到了问题,发现之前可以正常打开的sybase Central 现在无法打开了.苦恼一段时间后找到如下解决方法. 报错如下: 解决如下: 正常打开:
- python学习:注释、获取用户输入、字符串拼接、运算符、表达式
注释 #为单行注释'''三个单引号(或者"""三个双引号)为多行注释,例如'''被注释的内容''' '''三个单引号还可以起到多行打印的功能. #ctrl+? 选中的多行 ...
- react_app 项目开发 (7)_难点集合
/src/App/Admin/Header 布局 import {Row, Col} from "antd" <div className="header_box& ...
- 引用:使用grunt 压缩 合并js、css文件
引用:https://www.jianshu.com/p/08c7babdec65 压缩 js 文件 1.创建一个目录 名为grunt 目录.png 2.在grunt目录下创建一个 src目录,存 ...
- 20175320 2018-2019-2 《Java程序设计》第6周学习总结
20175320 2018-2019-2 <Java程序设计>第6周学习总结 教材学习内容总结 本周学习了教材的第七及第十章的内容.在这两章中介绍了接内部类与异常类以及输入.输出流,第七章 ...
- iOS代码组件化--利用cocoaPods创建私有库
如果项目模块多,模块间逻辑复杂,我们发现多个人同时维护一个代码仓库需要十分小心,一不小心,造成冲突,解决起来很烦,相信很多人都遇到手工删除合并的冲突的文件的经历. 如果利用组件化思想,每个人维护自己的 ...
- [05-02]红帽linux常用操作命令
命令怎么用(三种方式) shutdown --help shutdown --? man shutdown (man 就是manual 手册, 指南) 服务 service 怎么知道服务的名字呢? ...
- Wpf DataGrid 自动滚动到最后一行
if (mainDataGrid.Items.Count > 0) { var border = VisualTreeHelper.GetChild(mainDataGrid, 0) as De ...
- 2. Scala变量
2.1 变量是程序的基本组成单位 举一个简单的例子 object boke_demo01 { def main(args: Array[String]): Unit = { var a: Int = ...
- L1-039. 古风排版
L1-039. 古风排版 中国的古人写文字,是从右向左竖向排版的.本题就请你编写程序,把一段文字按古风排版. 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数.第二行给出一 ...