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 ...
随机推荐
- js收藏网页功能,纠正网上乱转没求证的案例
网站一般流行以下收藏代码 function AddFavorite(title, url){ try{ //ie收藏 window.external.addFavorite(url, title); ...
- VMware workstation虚拟机联网的方法
注意:我的虚拟机所安装的系统是Centos 方法一: 第一步:先设置VMware的编辑--虚拟网络编辑器,启用VMnet8,NAT模式,如下图所示. 其实就是VMware默认的设置,无须更改,如果不小 ...
- prometheus 监控系统
一. 安装docker环境 二. 安装prometheus 2.1 编辑配置文件 2.2 编辑docker-compose 三. grafana 展示 四 添加监控节点 五. 监控 java进程 六. ...
- 新增、修改校验逻辑使用-Validation-的group分组校验完成-2022新项目
一.业务场景 一般在项目开发中少不了新增.修改操作,这两个操作中传递的参数中也仅仅只有一个参数是不一致的,新增操作时没有ID, 修改时有ID,其校验逻辑也只有这一个ID校验的差别.最开始自己在写代码时 ...
- TR069-STUN
原理 1.NAT穿越技术,为了解决NAT设备对P2P网络的通信限制 2.作用:检测网络中是否存在NAT设备,并获取两个通信端点经NAT设备分配的IP地址和端口号,然后建立一条可穿越NAT的P2P链 ...
- pod为什么会被驱逐及如何避免pod被驱逐导致的服务中断
Pod被驱逐的原因主要有以下几点: 资源不足:当节点资源(如CPU.内存.存储等)不足以满足Pod的资源需求时,调度器会选择将其中一个或多个Pod驱逐出节点,以便在资源有限的节点上安排新的Pod. 超 ...
- IntentGC-A Scalable Graph Convolution Framework Fusing Heterogeneous Information for Recommendation-KDD19
一.摘要 网络嵌入的显著进步导致了最先进的推荐算法.然而,网站上的用户-物品交互(即显式偏好)的稀疏性仍然是预测用户行为的一个很大的挑战. 虽然,已经有研究利用了一些辅助信息(如用户间的社会关系)来解 ...
- 基于python的固定间隔时间执行实例解析
一 概念 datetime的用法如下: import datetime. # 打印当前时间 time1 = datetime.datetime.now() print(time1) # 打印按指定格式 ...
- Spring boot返回时间与MySql数据库中不相同问题及解决方法
最近做项目测试的发现,访问Url返回的时间与数据库中的不相同,环境是Spring boot+MyBatis+Mysql(阿里云服务器),经过一番折腾,得到了解决 问题描述 我是直接使用IDEA的数据库 ...
- 一个简单的百万并发的TCP服务器的实现。
我们紧接着上篇文章,看看我们上节课的代码有什么问题? 可以明显的看出来上节课的代码公用了一个同样的缓冲区进行读写,正常的情况下我们需要封装一个结构体,让每个对应的客户端的FD都有独立的结构进行读写还有 ...