动态SQL基本语句用法
1.if语句
如果empno不为空,则在WHERE参数后加上AND empno = #{empno},这里有1=1所以即使empno为null,WHERE后面也不会报错。 映射文件 <select id="getEmpById2" resultType="emp">
SELECT * FROM emp WHERE 1=1
<if test="empno != null">
AND empno = #{empno}
</if>
</select>
EmpMapper接口 public Emp getEmpById2(@Param("empno")Integer empno) throws IOException;
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。if标签是与(and)的关系,而 choose 是或(or)的关系。 2.where语句和Choose(when,otherwise)
1.Where后面empno和ename为null,那where就不会出现在sql语句中。
2. choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。 映射文件 <select id="getEmpById3" resultType="emp" parameterType="emp">
SELECT * FROM EMP
<where>
<choose>
<when test="empno != null">
AND empno like #{empno}
</when>
<when test="ename != null">
AND ename like #{ename}
</when>
<otherwise>
AND job = "zz"
</otherwise>
</choose>
</where>
</select> EmpMapper接口 public Emp getEmpById3(Emp emp) throws IOException;
3.set语句
set主要也是用来解决更新问题的。
映射文件 <update id="updateEmprById2" parameterType="emp">
UPDATE emp
<set>
<if test="ename!=null"> ename=#{ename},</if>
<if test="job!=null"> job=#{job},</if>
</set>
<where>
<if test="empno!=null">
empno=#{empno};
</if>
</where>
</update>
EmpMapper接口 public Integer updateEmprById2(Emp emp) throws IOException;
4.trim
trim标记是一个格式化的标记,可以完成set或者是where标记的功能。
相关属性:
Prefix:前缀。
prefixOverrides:去掉第一个指定内容。
suffix:后缀。
suffixoverride:去掉最后一个指定内容。
映射文件 <!-- 代替where -->
<select id="getEmpById4" resultType="emp" parameterType="emp">
SELECT * FROM emp
<!-- <where> <if test="username!=null"> and name = #{username} </if> </where> -->
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="empno != null">
and empno = #{empno}
</if>
<if test="ename!=null">
AND ename = #{ename}
</if>
</trim>
</select>
映射文件 <!-- 代替set -->
<update id="updateEmprById3" parameterType="emp">
update emp
<trim prefix="set" suffixOverrides=",">
<if test="ename!=null">
ename = #{ename},
</if>
<if test="job != null">
job = #{job}
</if>
</trim>
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="empno != null">
and empno = #{empno}
</if>
</trim>
</update>
EmpMapper接口 public Emp getEmpById4(Emp emp) throws IOException;
public Integer updateEmprById3(Emp emp) throws IOException;
5.foreach语句
foreach用来遍历,遍历的对象可以是数组,也可以是集合。
相关属性:
Collection:collection属性的值有三个分别是list、array、map三种。
Open:前缀。
Close:后缀。
Separator:分隔符,表示迭代时每个元素之间以什么分隔。
Item:表示在迭代过程中每一个元素的别名。
Index:用一个变量名表示当前循环的索引位置。
映射文件 <insert id="addEmp6">
insert into emp(ename,job)values
<foreach collection="emps" item="emp" separator=",">
(#{emp.ename},#{emp.job})
</foreach>
</insert>
EmpMapper接口 public int addEmp6(@Param("emps")List<Emp> emps);
6.SQL块
映射文件 <!-- 定义重复使用的SQL内容 -->
<sql id="baseSql">
empno,ename,job
</sql> <!-- 使用include引入sql块 -->
<select id="selEmp1" resultType="emp">
select
<include refid="baseSql"/>
from emp
</select>
EmpMapper接口 public List<Emp> selEmp1() throws IOException;
7.bind
映射文件 <select id="getEmpById6" resultType="emp">
<!-- 声明了一个参数empno 在后面就可以使用了 -->
<bind name="empno" value="7975" />
select * from emp where empno=${empno}
</select>
EmpMapper接口 public Emp getEmpById6()throws IOException;
全部代码:
EmpMapper接口 package com.zsl.dao; import java.io.IOException;
import java.util.List; import org.apache.ibatis.annotations.Param; import com.zsl.pojo.Emp; public interface EmpMapper {
public Integer addEmp(Emp emp) throws IOException; public Integer deleteEmpById(Integer empno) throws IOException;
public Integer updateEmprById(Emp emp) throws IOException; public Emp getEmpById(@Param("empno")Integer empno) throws IOException; public Integer addEmp1(String ename,String job) throws IOException;
public Integer addEmp2(String ename,String job) throws IOException; public Integer addEmp3(@Param("ename")String ename,@Param("job")String job) throws IOException; public Integer addEmp4(@Param("ename")String ename,@Param("job")String job) throws IOException; public List<Emp> selEmp() throws IOException; public Emp getEmpById2(@Param("empno")Integer empno) throws IOException; public Emp getEmpById3(Emp emp) throws IOException;
public Integer updateEmprById2(Emp emp) throws IOException;
public Emp getEmpById4(Emp emp) throws IOException;
public Integer updateEmprById3(Emp emp) throws IOException;
// 如果不指定@Param 默认是array
public List<Emp> getEmpById5(@Param("empnos")List<Integer> empno);
public int addEmp6(@Param("emps")List<Emp> emps);
public List<Emp> selEmp1() throws IOException;
public Emp getEmpById6()throws IOException;
}
EmpMapper.XML映射文件 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsl.dao.EmpMapper">
<!-- <insert id="addEmp" parameterType="emp">
insert into emp(ename,job)values(#{ename},#{job})
</insert> -->
<delete id="deleteEmpById" parameterType="int">
delete from emp where empno=#{empno}
</delete>
<update id="updateEmprById" parameterType="emp">
update emp set name = #{ename} where empno=#{empno}
</update> <select id="getEmpById" resultType="emp">
select * from emp where empno=${empno}
</select> <insert id="addEmp1">
insert into emp(ename,job)values(#{arg0},#{arg1})
</insert> <insert id="addEmp2">
insert into emp(ename,job)values(#{param1},#{param2})
</insert> <insert id="addEmp3">
insert into emp(ename,job)values(${ename},${job})
</insert> <insert id="addEmp4">
insert into emp(ename,job)values(#{ename},#{job})
</insert> <select id="selEmp3" resultType="emp">
select empno empno,ename ename,job job,mgr mgrA from emp
</select> <resultMap type="emp" id="baseMap">
<id column="empno" property="empno" />
<result property="ename" column="ename" />
<result property="job" column="job" />
<result property="mgrA" column="mgr" />
</resultMap> <select id="selEmp" resultType="emp" resultMap="baseMap">
select * from emp
</select> <!-- useGeneratedKeys:使用生成的主键 keyProperty="id":将生成的主键的值保存到对象的id属性中 -->
<insert id="addEmp" parameterType="emp" useGeneratedKeys="true"
keyProperty="empno">
insert into emp(ename,job)values(#{ename},#{job})
</insert> <insert id="addEmp6" parameterType="emp">
<selectKey keyProperty="empno" resultType="int">
select
LAST_INSERT_ID()
</selectKey>
insert into emp(ename,job)values(#{ename},#{job})
</insert> <select id="getEmpById2" resultType="emp">
SELECT * FROM emp WHERE 1=1
<if test="empno != null">
AND empno = #{empno}
</if>
</select> <select id="getEmpById3" resultType="emp" parameterType="emp">
SELECT * FROM EMP
<where>
<choose>
<when test="empno != null">
AND empno like #{empno}
</when>
<when test="ename != null">
AND ename like #{ename}
</when>
<otherwise>
AND job = "zz"
</otherwise>
</choose>
</where>
</select> <update id="updateEmprById2" parameterType="emp">
UPDATE emp
<set>
<if test="ename!=null"> ename=#{ename},</if>
<if test="job!=null"> job=#{job},</if>
</set>
<where>
<if test="empno!=null">
empno=#{empno};
</if>
</where>
</update> <!-- 代替where -->
<select id="getEmpById4" resultType="emp" parameterType="emp">
SELECT * FROM emp
<!-- <where> <if test="username!=null"> and name = #{username} </if> </where> -->
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="empno != null">
and empno = #{empno}
</if>
<if test="ename!=null">
AND ename = #{ename}
</if>
</trim>
</select> <!-- 代替set -->
<update id="updateEmprById3" parameterType="emp">
update emp
<trim prefix="set" suffixOverrides=",">
<if test="ename!=null">
ename = #{ename},
</if>
<if test="job != null">
job = #{job}
</if>
</trim>
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="empno != null">
and empno = #{empno}
</if>
</trim>
</update> <select id="getEmpById5" resultType="emp">
select * from emp where empno in
<foreach collection="empnos" open="(" close=")" separator=","
item="empno">
#{empno}
</foreach>
</select> <insert id="addEmp6">
insert into emp(ename,job)values
<foreach collection="emps" item="emp" separator=",">
(#{emp.ename},#{emp.job})
</foreach>
</insert> <!-- 定义重复使用的SQL内容 -->
<sql id="baseSql">
empno,ename,job
</sql> <!-- 使用include引入sql块 -->
<select id="selEmp1" resultType="emp">
select
<include refid="baseSql"/>
from emp
</select> <select id="getEmpById6" resultType="emp">
<!-- 声明了一个参数empno 在后面就可以使用了 -->
<bind name="empno" value="7975" />
select * from emp where empno=${empno}
</select>
</mapper>
动态SQL基本语句用法的更多相关文章
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...
- mybatis动态SQL标签的用法
动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...
- 获取动态SQL查询语句返回值(sp_executesql)
在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值 ...
- mybatis动态sql foreach的用法
<select id="findUserByIds" parameterType="com.pojo.QueryVo" resultType=" ...
- [刘阳Java]_MyBatis_动态SQL标签用法_第7讲
1.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. 2.MyBatis中用于实现动态SQL的元素主要有 if choose(when,otherwi ...
- 一步步学Mybatis-怎么样实现动态SQL查询(6)
上一章我们已经讲完了关于Mybatis的分页用法,其实MyBatis 还具有的一个强大的特性之一通常是它的动态 SQL 能力. 如果你有使用 JDBC 或其他 相似框架的经验,你就明白要动态的串联 S ...
- Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!
封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...
- mybatis 详解(五)------动态SQL
前面几篇博客我们通过实例讲解了用mybatis对一张表进行的CRUD操作,但是我们发现写的 SQL 语句都比较简单,如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ...
- 【转载】 mybatis入门系列四之动态SQL
mybatis 详解(五)------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when, ...
随机推荐
- leetcode_3FizzBuzz的一些思考
题目很简单,给定一个正整数n,如果n能整除3的话往list里加入Fizz,如果n能整除5的话往list里面加入Buzz,如果即能整除3又能整除5的话,加入FizzBuzz,代码也很简单 public ...
- java42
1.Random类 随机生成某个整数 Random r = new Random(); System.out.println(r.nextInt()); 伪随机数:第一次打印为随机,再次运行,数字将保 ...
- Springboot核心注解
运行文中的代码需要在项目构建中引入springboot 相关依赖. ① @configuration configuration,用来将bean加入到ioc容器.代替传统xml中的bean配置.代码示 ...
- 【NOIP2017提高A组模拟9.17】组合数问题
[NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...
- IAR编译出现Configuration is up-to-date.
IAR编译出现如下: Building configuration: SimpleBLECentral - CC2541EM Updating build tree... Configuration ...
- python核心高级学习总结3-------python实现进程的三种方式及其区别
python实现进程的三种方式及其区别 在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.f ...
- Python妙用re.sub分析正则表达式匹配过程
声明:本文所使用方法为老猿自行研究并编码,相关代码版权为老猿所有,禁止转载文章,代码禁止用于商业用途! 在<第11.23节 Python 中re模块的搜索替换功能:sub及subn函数>介 ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的clicked信号参数QAbstractButton *解决办法
一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...
- PHP代码审计分段讲解(3)
05 ereg正则%00截断 放上源代码 <?php $flag = "flag"; if (isset ($_GET['password'])) { if (ereg (& ...
- java基础之二:取整函数(Math类)
在日常开发中经常会遇到数字的情况,有关数据的场景中会遇到取整的情况,java中提供了取整函数.看下java.lang.Math类中取整函数的用法. 一.概述 java.lang.Math类中有三个和取 ...