记MyBatis动态SQL

写在前面:

在此记录下项目中能够经常遇到的MyBatis动态SQL,因为经常容易忘,所以索性就给记录下来,免得每次都要百度搜索好久,需要使用的朋友自取,但是别忘了点赞哦

在此仅作部分说明和XML文件演示:

1.< SQL >标签

又叫 共性抽取

	<!--<sql>一般放在上面或最底下-->
<sql id="person">
id
,name,sex
</sql>
<select id="queryPerson" resultType="Person">
SELECT
<!--在此调用sql的id-->
<include refid="person"></include>
FROM person
</select>

2.< if >标签

在test中写判断条件,< if >中只能用and不能用&&,并且,避免连接时and/or出错,上面最好用 < where >或者 where 1=1拼接

< where >可以代替where 1=1 并且能自动去除掉第一个and

<select id="queryPerson" resultType="Person"> 
SELECT * FROM Person WHERE 1=1
<if test="name!=null and param1!=''">
and name=#{name}
</if>
</select>

3.分支标签

即分支语法,与switch case ,if-else相近

1.第一种:用在查询条件上用choose-when;otherwise可不要

 <select id="queryPerson" resultType="Person">
SELECT * FROM person
<where>
<choose>
<when test="name !=null">
name = #{name}
</when>
<when test="age !=null">
age = #{age}
</when>
<otherwise>
sex = #{sex}
</otherwise>
</choose>
</where>

2. 第二种case-when:用在查询结果上

 <select id="queryPerson" resultType="Person">
SELECT id,name,
<!--sex可省-->
( case sex
when 1 then "男"
when 2 then "女"
ELSE "中性人" end) as sex
FROM person
</select>

3.case-when 的特殊用法:行转列:

原本:

id name subject score
1 张三 JAVA 90
2 张三 VUE 66
3 李四 VUE 80
4 王五 XML 70

转换后:

name JAVA VUE XML
张三 90 66 null
李四 null 80 null
张三 null null 70
SELECT
name,
SUM(CASE subject WHEN 'JAVA' THEN score end) as 'JAVA',
SUM(CASE subject WHEN 'VUE' THEN score end) as 'VUE',
SUM(CASE subject WHEN 'XML' THEN score end) as 'XML'
FROM prson
GROUP BY name

< foreach >标签

foreach标签一般用来遍历查询或者批量操作

注:

collection中写列表名,

open表示语句前面用( 包含,close表示后面用 )包含,也可自行添加括号

separator表示中间用 隔开,

item表示每个list中的字符或者对象名,如果是array数组,item.id可写为id

index 表示下标,可省略

遍历list

1.批量查询列表

<select id="queryList" resultType="Person">
SELECT *
FROM person
WHERE person.id
IN
<foreach collection="list" open="(" close=")"separator="," item="item">
#{item.id}
</foreach>
</select>
  1. 批量插入列表:
<insert id="insertBatch">
INSERT INTO person (id,name)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.id},
#{item.name}
)
</foreach>
</insert>

3.批量修改列表

<update id="updateBatch">
UPDATE person
SET age = '18'
WHERE
sex = '男'
AND name IN
<foreach collection="nameList" item="item" index="index" open="(" close=")" separator=",">
#{item.name}
</foreach>
</update>

4.批量删除列表

<delete id="deleteBatch">
DELETE FROM person
WHERE id IN
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item.id}
</foreach>
</delete>

遍历map

1.map 的entrySet()

<insert id="insertPersonMap" parameterType="java.util.Map">
INSERT INTO person(id, name)
VALUES
<foreach collection="map.entrySet()" open="(" separator="," close=")" index="key" item="val">
#{key}, #{val}
</foreach>
</insert>

2.分别遍历

<insert id="insertPersonMap" parameterType="java.util.Map">
INSERT INTO person
<foreach collection="map.keys" item="key" open="(" separator="," close=")">
#{key}
</foreach>
VALUES
<foreach collection="param.value" item="val" open="(" separator="," close=")">
#{val}
</foreach>
</insert>

3.map中值为list[map]的遍历:

参数形式:

{"k1":"v1",
"k2":[
{"a1":"b1"},
{"a2":"b2"}
]
}

遍历方式(双重):

 <foreach collection="Map" item="item" separator="," >
<foreach collection="item.entrySet()" separator="," index="key" item="val">
#{key} #{val}
</foreach>
</foreach>

关系映射 resultMap

一般情况:

  <!--使用resultMap手动映射-->
<resultMap id="personMap" type="person">
<!--主键绑定-->
<id property="id" column="person.id"></id>
<!--非主键绑定-->
<result property="name" column="person.name"></result>
</resultMap>

list嵌套等

<resultMap id="ListMap" type="路径.person">
<result column='id' property='id' />
<result column='name' property='name' />
<collection property='实体中的list名' resultMap='listResultMap'/>
</resultMap> <resultMap id="listResultMap" type="list中装的数据类型路径">
<result column='id' property='id' />
<result column='name' property='name' />
</resultMap>

嵌套查询

需要返回list的同时还要返回list中对象包含的list

<!--设定映射关系-->
<resultMap id="personMap" type="com.personList">
<id column="ID" property="id"/>
<result column="NAME" property="name"/>
<result column="TYPE" property="type"/>
<collection property="scoreList" select="queryscoreList" column="{personId=id}"></collection>
</resultMap>
<resultMap id="scoreListMap" type="com.scoreList">
<id column="ID" property="id"/>
<result column="PERSON_ID" property="personId"/>
<result column="SCORE" property="score"/>
</resultMap>
<!--编写语句-->
<select id="selectPersonList" resultMap="personMap">
SELECT
ID,
NAME`,
FROM person
</select>
<!--因为关联了映射关系,下面语句会自动执行并添加进list中-->
<select id="queryScoreList" resultMap="scoreListMap">
SELECT score from score表
</select>

补充:collection 与assocation的异同

异:

关联-association

集合-collection

即assocation是一对一的关系,collection是一对多的关系

< collection >比< association >多了一个ofType属性,

即collection集合中单个元素的javaType属性

< collection >的javaType属性是继承了Collection接口的list或set等java集合属性

同:

< collection >和< association >标签都属于嵌套结果集,

处理逻辑基本相同

其他重要sql笔记

concat拼接:

两个字段拼接起来搭建新的一列

或合并字符(例如:id,%)或字符串

select
concat(id,name) as id_name
from person

时间比较:

符号转换:避免出现奇怪的bug

< <= > >= & ' "
&lt ; &lt ;= &gt ; &gt ;= &amp ; &apos ; &quot ;
(unix_timestamp(START_TIME) &lt;=unix_timestamp(NOW()))

记Mybatis动态sql的更多相关文章

  1. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  2. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  3. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  4. Mybatis动态SQL单一基础类型参数用if标签

    Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...

  5. 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...

  6. Mybatis动态SQL简单了解 Mybatis简介(四)

    动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ }   Mybatis应用中,S ...

  7. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  8. mybatis 动态sql和参数

    mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...

  9. MyBatis动态SQL之一使用 if 标签和 choose标签

    bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...

随机推荐

  1. 01 Mybatis框架添加英雄步骤

    客户端发出请求的几种方式 通过浏览器的地址栏中发出请求 通过html页面中的超链接发出请求 通过html页面中的form表单发出请求 通过前端框架发出请求 工程中使用数据库需要做的几件事: 在pom. ...

  2. ansible概述、安装、模块介绍

    一.Ansible介绍 Ansible是一 个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩. 它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功 ...

  3. SpringWeb 拦截器

    前言 spring拦截器能帮我们实现验证是否登陆.验签校验请求是否合法.预先设置数据等功能,那么该如何设置拦截器以及它的原理如何呢,下面将进行简单的介绍 1.设置 HandlerInterceptor ...

  4. 9.2 DAG上的动态规划

    在有向无环图上的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路,最短路或路径计数问题 9.2.1 DAG模型 嵌套矩形问题: 矩形之间的可嵌套关系是一种典型的二元关系,二元关系可以 ...

  5. 迭代器和增强for循环

    iterator 迭代:即Collection集合元素的通过获取方法,在获取元素之前先要判断集合中有没有元素,如果有就把这个元素取出来,然后在判断,如果还有就再去除卡u,一直把集合中的所有元素全部拿出 ...

  6. 【Java中的线程】java.lang.Thread 类分析

    进程和线程 联想一下现实生活中的例子--烧开水,烧开水时是不是不需要在旁边守着,交给热水机完成,烧开水这段时间可以去干一点其他的事情,例如将衣服丢到洗衣机中洗衣服.这样开水烧完,衣服洗的也差不多了.这 ...

  7. CMAKE编译时如何自动下载第三方库并解压、安装到指定目录

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 在日常开发过程中难免会使用到第三方库或者需要将部分库分离另外存储,如果将库与代码放在一起难免会造成工程庞大,此时就可 ...

  8. CF859E 题解

    分析 我们不妨把这些座位看作是一张图中的节点,把每个人的诉求作为一条边(由[原座位]指向[想去的座位]) 比如,对于样例#1,我们就可以得到这样一张图: 显然,我们有可能会得到多个连通图(比如上面这张 ...

  9. 使用JMeter进行MySQL的压力测试

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 目录 前言 1. JMeter安装 2. 导入MyS ...

  10. django自带的序列化组件

    1.什么是序列化组件 在django中,自带一个序列化组件,它是用来将数据进行整理.转化成特定的为一个特定的格式(比如json数据格式),然后传输给前端,以便前端对数据进行处理操作. 2.为什么要用序 ...