mybatis复习(三)映射文件属性详解和动态SQL
mybatis映射文件属性详解和动态SQL笔记
<SELECT>
id = "" 唯一标识
parameterType = "" 表示传入SQL语句的参数类的全限定名或者别名,它是一个可选属性,因为
mybatis可以根据TypeHandler 推断出具体传入的参数.默认值为unset(依赖于驱动)
resultType = "" 从SQL中返回的参数类型的全限定名或者别名.如果是集合类型,那么返回的应该
就是集合可以包含的类型,返回时可以使用resultType 或 resultMap
resultMap = "" 表示外部resultMap的命名引用.返回时可以使用resultMap或者resultType
flushCache 表示在调用sql语句后 是否需要MyBatis 清空之前查询的本地缓存和二级缓存.值
为布尔值 默认为false.如果设置为true,任何时候只要SQL语句被调用,都会清空本地缓存和
二级缓存.
useCache 用于控制二级缓存的开启和关闭.其值为布尔值 默认为true 表示查询结果存入二级缓存
timeout 用于设置超时时间 单位秒 超出时抛出异常
fetchSize 获取记录的总条数设定 其默认值为unset
statementType 用于设置mybatis使用哪个JDBC的Statement工作,其值为 STATEMENT PREPARED(默认)
和CALLABLE,分别对应JDBC中的Statement PreparedStatement和CallableStatement
resultSetType = "" 指定结果集的类型 可设置为 FORWARD_ONLY SCROLL_SENSITIVE或SCROLL_INSENSITIVE
默认值依赖于驱动
<insert>
keyProperty="id" (仅在insert和update有用) 此属性作用将插入或更新操作时的返回值赋值给实体类的某个属性,
通常会设置主键,如果为联合主键多个值之间用逗号隔开
keyColumn = "" (仅在insert和update有用) 此属性用于设置第几列是主键,当主键列不是表中的第一列时需要设置.
联合主键时,逗号隔开
useGeneratedKeys = "" (仅在insert和update有用) 此属性会使Mybatis使用JDBC的getGeneratedKeys()
方法来获取数据库内部产生的主键,如MySql和sqlServer自动递增的字段,默认为false.
主键不支持自动增长或者 数据库中没有设置为自定增长
<selectKey keyProperty="id" resultType="Integer" order="BEFORE" >
select if(max(id) is null , 1, max(id) +1) as newId from 表名
</selectKey>
order="" 属性可以被设置为BEFORE或AFTER。如果设置为BEFORE,那么它会首先执行<selectKey>元素中的配置来设置
主键,然后执行插入语句;如果设置为AFTER,那么它会先执行插入语句,然后执行<selectKey>元素中的配置内容
<update>
update 和 delete属性一致 与insert一样执行完后返回一条记录整数
<resultMap>
<resultMap id="resultMap" type="com.example.mybatisplus.pojo.User">
<constructor>
<idArg column="id" javaType="Integer"/>
<arg column="name" javaType="String"/>
<arg column="age" javaType="Integer"/>
</constructor>
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="createTime" column="create_time"/>
<association property="id"/>
<collection property="id" />
<discriminator column="" javaType="">
<case value="1" resultMap="" resultType=""/>
<case value="0" resultMap="" resultType=""/>
</discriminator>
</resultMap>
<resultMap> 元素表示结果映射集,是MyBatis中最重要也是最强大的元素。它的主要作用是定义映射规则、级联的更新以及
定义类型转化器等。
id = "" 唯一标识
type = "" 需要映射的实体
子元素<constructor>用于配置构造方法(当一个POJO中未定义无参的构造方法时,就可以使用<constructor>元素进行配置)
子元素 <id/> 用于表示哪个列是主键
子元素<result/>用于表示POJO和数据表中普通列的映射关系 属性property="id" 表示实体类属性名,column 表示数据表列名
<association>和<collection>用于处理多表时的关联关系
<discriminator>元素主要用于处理一个单独的数据库查询返回很多不同数据类型结果集的情况。
column="" 设置要进行鉴别比较值的列名。
javaType="" 指定列的类型,保证使用相同的Java类型来比较值。
<case value="">
value:该值为discriminator标签column属性用来匹配的值。
resultMap:当column的值和value的值匹配时,可以配置使用resultMap指定的映射,resultMap优先级高于resultType。
resultType:当column的值和value的值匹配时,用于配置使用resultType指定的映射
</case>
</discriminator>
动态SQL
<if test="name != null and name != '' ">
like concat('%', #{xxx}, '%')
</if>
问题? 如果想要更新某一个对象,就需要发送所有的字段给持久化对象,然而实际应用中,大多数情况下都是更新的某一个或几个字段。
如果更新的每一条数据都要将其所有的属性都更新一遍,那么其执行效率是非常差的。
方案: 使用了<set>和<if>元素相结合的方式来组装update语句。其中<set>元素会动态前置SET关键字,同时也会消除SQL语句中最后一个多余的逗号;
<if>元素用于判断相应的字段是否传入值,如果传入的更新字段非空,就将此字段进行动态SQL组装,并更新此字段,否则此字段不执行更新。
<set>
<if test="name != null and name != '' ">
name = #{xxx},
</if>
<if test="age != null and age != '' ">
age = #{xxx},
</if>
</set>
in
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
· item:配置的是循环中当前的元素。
· index:配置的是当前元素在集合的位置下标。
collection:配置的list是传递过来的参数类型(首字母小写),它可以是一个array、list(或collection)、Map集合的键、
POJO包装类中数组或集合类型的属性名等。
· open和close:配置的是以什么符号将这些集合元素包装起来。
· separator:配置的是各个元素的间隔符。
like concat('%', #{xxx}, '%') concat在oracle中无效 此时需要使用<bind>元素拼接
<select>
<bind name = "pattern_name" value = " '%'+ name +'%' "/>
select * from user
where name like #{pattern_name}
</select>
value = " '%'+ name +'%' " name 可以写_parameter.getName()也可以直接使用传入的字段属性名 既name
mybatis复习(三)映射文件属性详解和动态SQL的更多相关文章
- Mybatis(三) 映射文件详解
前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...
- Mybatis SQL映射文件详解
Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...
- MyBatis 映射文件详解(六)
MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上 ...
- Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(转)
通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车,开始美好的旅程! 本篇是在SSM框架基础上进行的. 参考文章: 1.Quartz学习——Qua ...
- [转]hibernate三种状态详解
本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼ 分类: hibernate ...
- 多表连接的三种方式详解 hash join、merge join、 nested loop
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...
- elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))
一.分词器 1. 认识分词器 1.1 Analyzer 分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...
- 《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项
<深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 0.写在前面 MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓 ...
- Hexo系列(三) 常用命令详解
Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...
- 【C/C++开发】C++11 并发指南三(std::mutex 详解)
本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...
随机推荐
- [manjaro linux] 安装完成之后的配置工作,以及常用软件的安装
emmm 很久没有更新了,绝对不是丢掉了博客帐号,有时间还是要好好装饰以下博客的... https://zhuanlan.zhihu.com/p/114296129 看到很多过程 sudo pacma ...
- live [lɪv , laɪv] 动词读lɪv 形容词读laɪv
live [lɪv , laɪv] 动词读lɪv 形容词读laɪv live 英 [lɪv , laɪv] 美 [lɪv , laɪv] v. 居住;住;生存;(尤指在某时期)活着;(以某种方式)生活 ...
- [好文推荐] vue3 源码分析 mini-vue 写的不错
[阮一峰推荐]学习 vue3 源码的利器 git clone https://github.com/cuixiaorui/mini-vue.git
- linux文件编辑
1.VIM基本概述 1.什么是VIM? vi和vim是Linux下的一个文本编辑工具.(可以理解为windows的记事本,或word文档) 2.为什么要使用VIM? 因为Linux系统一切皆为文件,而 ...
- Https详细分析
目录介绍 01.为何会有Https 02.解决方案分析 03.SSL是什么 04.RSA验证的隐患 05.CA证书身份验证 06.Https工作原理 07.Https代理作用 08.Https真安全吗 ...
- 记录--啊?Vue是有三种路由模式的?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 众所周知,vue路由模式常见的有 history 和 hash 模式,但其实还有一种方式-abstract模式(了解一哈~) 别急,本文我 ...
- 记录--你知道Vue中的Scoped css原理么?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 追忆Scoped 偶然想起了一次面试,二面整体都聊完了,该做的算法题都做出来了,该背的八股文也背的差不多了,面试官频频点头,似乎对我的基础 ...
- 开发必会系列:J2EE是什么
为什么Java是跨平台的? 高级语言通过编译器,转为汇编语言,汇编语言通过汇编器转为0和1. 当c转为汇编时,不同厂家cpu,用不同的指令集,所以有不同的汇编语言结果,导致c不能跨平台. java在各 ...
- Redis 中 scan 命令太坑了,千万别乱用!!
作者:铂赛东\链接:www.jianshu.com/p/8cf8aac3dc25 1 原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作.但是最近在使用redis的scan ...
- vue初学核心基础
一.初识vue 1.vue的使用 导入vue之后创建vue模块,el属性表示控制区域的id名称,data表示该区域内的数据 在vue中我们都是用表中模板的标准语法来传递数据 <head> ...