抽取可重用的sql片段

抽取<sql id="xx"></sql>

使用<include refid="xx"></inculde>

 <select id="getEmpsByDid" resultType="com.atguigu.mybatis.beans.Employee">
<include refid="selectEmployeeSQL"></include> from tbl_employee where d_id = #{did}
</select> //抽取可重用的SQL片段
<sql id="selectEmployeeSQL">
select id ,last_name,email,gender
</sql>

动态sql

MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作

OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的

  • 表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等

  • 访问对象属性:person.name

  • 调用方法: person.getName()

  • 调用静态属性/方法:

  • 调用构造方法:

  • 运算符: +,-*,/,%

  • 逻辑运算符: in ,not in ,> ,>= ,< ,<= ,== ,!= ,or,and

注意:xml中特殊符号如”,>,<等这些都需要使用转义字符

if where

​ 1) If用于简单的判断.

​ 2) Where用于解决SQL语句中where关键字以及条件中第一个and或者or的问题

// public List<Employee>  getEmpsByConditionIfWhere(Employee Condition);
<select id="getEmpsByConditionIfWhere" resultType="com.atguigu.mybatis.beans.Employee">
select id, last_name, email, gender from tbl_employee
// where 1=1 处理所有条件不满足时where后为空的方法
<where>
//现在使用where标签也可完美解决
// 在SQL语句中提供WHERE关键字,并且要解决第一个条件就出现的and 或者是 or的问题
<if test="id!=null">
and id = #{id }
</if> <if test="lastName!=null&amp;&amp;lastName!=&quot;&quot;">
and last_name = #{lastName}
</if>
<if test="email!=null and email.trim()!=''">
and email = #{email}
</if>
<if test="gender==0 or gender==1">
and gender = #{gender}
</if>
</where>
</select>

choose(when,otherwise)

用于分支判断,类似于java中的switch case,只会满足所有分支中的一个

//public List<Employee>  getEmpsByConditionChoose(Employee Condition);
<select id="getEmpsByConditionChoose" resultType="com.atguigu.mybatis.beans.Employee">
select id ,last_name, email,gender from tbl_employee
<where>
<choose>
<when test="id!=null">
id = #{id}
</when>
<when test="lastName!=null">
last_name = #{lastName}
</when>
<when test="email!=null">
email = #{email}
</when>
<otherwise>
gender = 'm'
</otherwise>
</choose>
</where>
</select>

choose 类似 switch

when 类似 case

otherwise 类似 default

trim

trim 可以在条件判断完的SQL语句前后 添加或者去掉指定的字符

prefix 添加前缀
prefixOverrides 去掉前缀
suffix 添加后缀
suffixOverrides 去掉后缀
//public List<Employee>  getEmpsByConditionTrim(Employee Condition);
<select id="getEmpsByConditionTrim" resultType="com.atguigu.mybatis.beans.Employee">
select id , last_name ,email , gender
from tbl_employee
//添加where前缀,若后缀是and则删除
<trim prefix="where" suffixOverrides="and">
<if test="id!=null">
id = #{id} and
</if>
<if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
last_name = #{lastName} and
</if>
<if test="email!=null and email.trim()!=''">
email = #{email} and
</if>
<if test="&quot;m&quot;.equals(gender) or &quot;f&quot;.equals(gender)">
gender = #{gender}
</if>
</trim>
</select>

set

用于解决修改操作中SQL语句中可能多出逗号的问题

//public void  updateEmpByConditionSet(Employee Condition);
<update id="updateEmpByConditionSet">
update tbl_employee
<set>
<if test="lastName!=null and lastName!=''">
last_name = #{lastName},
</if>
<if test="email!=null and email.trim()!=''">
email = #{email} ,
</if>
<if test="gender==0 or gender==1">
gender = #{gender}
</if>
</set>
where id =#{id}
</update>

foreach

动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。

foreach 主要用于循环迭代
item 当前从集合中迭代出的元素
collection 要迭代的集合
open 开始字符
close 结束字符
separator 元素与元素之间的分隔符
index 迭代的是List集合: index表示的当前元素的下标
迭代的Map集合: index表示的当前元素的key
// public List<Employee>  getEmpsByIds(@Param("ids")List<Integer> ids );
<select id="getEmpsByIds" resultType="com.atguigu.mybatis.beans.Employee">
/*
select * from tbl_employee where id in(?,?,?);
select * from tbl_employee where id = ? or id = ? or id = ? */ select id ,last_name ,email, gender from tbl_employee
where id in
<foreach collection="ids" item="currId" open=" (" close=")" separator=",">
#{currId}
</foreach>
</select>

批量操作

添加:insert into tbl_employee(x,x,x) values(?,?,?),(?,?,?),(?,?,?)

删除:delete from tbl_employee where id in(?,?,?)

修改:待更新(麻烦一点,可自己寻找好的办法)

	修改: update tbl_employee set  last_name = #{lastName} ...where id = #{id};
update tbl_employee set last_name = #{lastName} ...where id = #{id};
update tbl_employee set last_name = #{lastName} ...where id = #{id};
默认情况下, JDBCB不允许将多条SQL通过;拼成一个字符串。
可以在连接的url后面加上一个参数: allowMultiQueries=true
//public void addEmps(@Param("emps")List<Employee> emps );
<insert id="addEmps">
insert into tbl_employee(last_name, email,gender ) values
<foreach collection="emps" item="emp" separator=",">
(#{emp.lastName},#{emp.email},#{emp.gender})
</foreach>
</insert>

动态sql & 抽取可重用sql的更多相关文章

  1. MyBatis中关于SQL标签的用法(重用SQL 代码段)

    一. 没用sql标签前的SQL映射代码: <select id="findById" resultType="cn.tedu.mybatis.entity.User ...

  2. MyBatis_tp50_动态sql_sql标签_抽取可重用的sql片段_使用include标签进行引用

    笔记要点出错分析与总结 include内部使用自定的属性,之能使用$ {}来取值 ,#{}不能用 工程组织数据库组织0.重新修改Bean类1.定义接口 public interface Employe ...

  3. mybatis动态sql中的sql标签——抽取可重用的sql片段

    1.用<sql>标签抽取可重用的sql片段 <!-- 抽取可重用的SQL片段,方便后面引用           1.sql抽取,经常将要查询的列名,或者插入用的列名,之后方便引用   ...

  4. mapper.xml中动态sql抽取重复项

    mabatis重点是通过标签对sql灵活的组织,通过配置的方式完成输入 输出映射. 1.对mapper.xml中重复的sql抽取统一维护,以及foreach使用 UserMapperCustom.xm ...

  5. 黑马MyBatisday2 MyBatis Dao层实现 接口代理实现&传统实现 动态SQL和SQL抽取 自定义类型处理 分页插件PageHelper

    package com.itheima.mapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelp ...

  6. 利用MyBatis的动态SQL特性抽象统一SQL查询接口

    1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...

  7. 在Delphi中动态地使用SQL查询语句 Adoquery sql 参数 冒号

    在Delphi中动态地使用SQL查询语句 在一般的数据库管理系统中,通常都需要应用SQL查询语句来提高程序的动态特性.下面介绍如何在Delphi中实现这种功能.在Delphi中,使用SQL查询语句的途 ...

  8. 阶段3 1.Mybatis_08.动态SQL_03.mybatis中动态sql语句-foreach和sql标签

    foreach标签 in的查询 sql语句好写,但是传参在映射文件里面改怎么传呢 定义一个List<Integer>成员变量,然后生成get和set 定义一个新的查询方法 open:开始符 ...

  9. 使用mybatis的动态sql解析能力生成sql

    需求: 计算平台,有很多表,打算提供一个基于sql的服务接口, sql不能完全在配置页面写死, 要能根据参数不同执行不同的语义,防止sql个数爆炸 把mybatis原码down下来, 改造一下测试用例 ...

随机推荐

  1. 《Android自动化环境搭建》

    一.安装JDK并配置环境变量 1:在Java官网上下载本机系统相对应的jdk文件安装,直接下一步一步到位 2:配置JAVA_HOME 新建 JAVA_HOME 环境变量,变量值是所安装JDK 的路径, ...

  2. 检验appium环境是否正常:使用appium自动给手机安装app(注意:如果已存在该app,再执行会将原来的卸载再重装,需谨慎)

    (注意:如果已存在该app,再执行会将原来的卸载再重装.泪的教训,我的微信被卸载重装了o(╥﹏╥)o,自动安装app这个步骤需谨慎操作) hi,前面几篇已经讲了appium环境的搭建.设备的连接, 那 ...

  3. django 高级扩展-中间件-上传图片-分页-富文本-celery

    """ django 高级扩展 一.静态文件 1.css,js,json,图片,字体等 2.配置setting,在最底下设置静态文件目录,写入下面代码 #配置静态文件目录 ...

  4. html正文提取工具goose的安装及简单使用Demo

    1.git clone https://github.com/grangier/python-goose.git 2.cd python-goose 3.sudo pip install -r req ...

  5. 『GoLang』字典Map

    map是一种元素对的无序集合,一组称为元素value,另一组为唯一键索引key. 未初始化map的值为nil.map 是引用类型,可以使用如下声明: var map1 map[keytype]valu ...

  6. 没想到 TCP 协议,还有这样的骚操作。。。

    大家好,我是小林. 昨晚有位读者问了我这么个问题: 大概意思是,一个已经建立的 TCP 连接,客户端中途宕机了,而服务端此时也没有数据要发送,一直处于 establish 状态,客户端恢复后,向服务端 ...

  7. 牛客挑战赛48C-铬合金之声【Prufer序列】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/C 题目大意 \(n\)个点加\(m\)条边使得不存在环,每种方案的权值是所有联通块的大小乘积. 求 ...

  8. Python3模块调用你真的会吗?不懂就来看一看?

    前言 学习Python自动化框架的时候,各种文件会相互之间的调用.刚学的时候是不是很头疼!有木有!!一步步告诉你如何调用文件里的类和方法. 经常会调用同目录下的文件还有跨文件的调用 调用同目录下文件A ...

  9. vue组件的生命周期详解

    1.生命周期&生命周期函数 生命周期:指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段. 生命周期函数:由vue框架提供的内置函数,会伴随着组件的生命周期,自动按序执 ...

  10. 手把手教你 Docker部署可视化工具Grafana

    一.Grafana的简单介绍 Grafana是开源的.炫酷的可视化监控.分析利器,无论您的数据在哪里,或者它所处的数据库是什么类型,您都可以将它与Grafana精美地结合在一起.它还有丰富的套件供您选 ...