JavaEE高级-MyBatis学习笔记
> 2、使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象代表和数据库的一次会话。
> 3、使用SqlSession根据方法id进行操作
- 如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
> 在 properties 元素体内指定的属性首先被读取。
> 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
> 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
- 类很多的情况下,可以批量设置别名这个包下的每一个类创建一个默认的别名,就是简单类名小写。
- 也可以使用@Alias注解为其指定一个别名
- 值得注意的是,MyBatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,我们在起别名的时候千万不要占用已有的别名。
- Type: DB_VENDOR
> 使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义。
- Property-name:数据库厂商标识
- Property-value:为标识起一个别名,方便SQL语句使用databaseId属性引用
- DB_VENDOR
> 会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短
- MyBatis匹配规则如下:
1、如果没有配置databaseIdProvider标签,那么databaseId=null
- 或者使用批量注册: 这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下
- 主键生成方式
> 若数据库支持自动生成主键的字段(比如 MySQL和 SQL Server),则可以设置useGeneratedKeys=”true”,然后再把keyProperty 设置到目标属性上。
> 而对于不支持自增型主键的数据库(例如Oracle),则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会被设置,然后插入语句会被调用
- selectKey
- 参数(Parameters)传递
> 单个参数– 可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。
> 多个参数– 任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,0,1…,值就是参数的值。
> 命名参数– 为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
> POJO– 当这些参数属于我们业务POJO时,我们直接传递POJO
> Map– 我们也可以封装多个参数为map,直接传递
- 参数处理
> 参数也可以指定一个特殊的数据类型:
> javaType 通常可以从参数对象中来去确定
- select元素
> Select元素来定义查询操作。
> Id:唯一标识符。– 用来引用这条语句,需要和接口的方法名一致
> parameterType:参数类型。– 可以不传,MyBatis会根据TypeHandler自动推断
> resultType:返回值类型。– 别名或者全类名,如果返回的是集合,定义集合中元素的类型。不能和resultMap同时使用
- 自动映射:
1、全局setting设置
> autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是列名和javaBean属性名一致
> 如果autoMappingBehavior设置为null则会取消自动映射
> 数据库字段命名规范,POJO属性符合驼峰命名法,如A_COLUMNaColumn,我们可以开启自动驼峰命名规则映射功能,mapUnderscoreToCamelCase=true。
2、自定义resultMap,实现高级结果集映射。
- resultMap
> constructor
>> 类在实例化时, 用来注入结果到构造方法中
>> idArg - ID 参数; 标记结果作为 ID 可以帮助提高整体效能
>> arg - 注入到构造方法的一个普通结果
> id – 一个 ID 结果; 标记结果作为 ID 可以帮助提高整体效能
> result – 注入到字段或 JavaBean 属性的普通结果
> association
>> 一个复杂的类型关联;许多结果将包成这种类型
>> 嵌入结果映射 – 结果映射自身的关联,或者参考一个
> collection
>> 复杂类型的集
>> 嵌入结果映射 – 结果映射自身的集,或者参考一个
> discriminator
>> 使用结果值来决定使用哪个结果映射
>> case – 基于某些值的结果映射:嵌入结果映射 – 这种情形结果也映射它本身,因此可以包含很多相同的元素,或者它可以参照一个外部的结果映射。
- id & result
> id 和 result 映射一个单独列的值到简单数据类型(字符串,整型,双精度浮点数,日期等)的属性或字段。
- association
> 复杂对象映射
> POJO中的属性可能会是一个对象
> 我们可以使用联合查询,并以级联属性的方式封装对象。
> 使用association标签定义对象的封装规则
> association-嵌套结果集
> association-分段查询
>> select:调用目标的方法查询当前属性的值
>> column:将指定列的值传入目标方法
> association-分段查询&延迟加载::开启延迟加载和属性按需加载
> 旧版本的MyBatis需要额外的支持包: asm-3.3.1.ja、 cglib-2.2.2.jar
- Collection-集合类型&嵌套结果集
- Collection-分步查询&延迟加载
- 扩展-多列值封装map传递
> 分步查询的时候通过column指定,将对应的列的数据传递过去,我们有时需要传递多列数据。
> 使用{key1=column1,key2=column2…}的形式
- association或者collection标签的fetchType=eager/lazy可以覆盖全局的延迟加载策略,指定立即加载(eager)或者延迟加载(lazy)
- choose (when, otherwise)
- trim (where, set)
> where
> set
> trim
- foreach:动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。
> 当迭代列表、集合等可迭代对象或者数组时– index是当前迭代的次数,item的值是本次迭代获取的元素
> 当使用字典(或者Map.Entry对象的集合)时– index是键,item是值
- bind
> bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:
- Multi-db vendor support
> 若在 mybatis 配置文件中配置了 databaseIdProvider , 则可以使用 “_databaseId”变量,这样就可以根据不同的数据库厂商构建特定的语句
- OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等
> 一级缓存演示&失效情况
>> 同一次会话期间只要查询过的数据都会保存在当前SqlSession的一个Map中、 key:hashCode+查询的SqlId+编写的sql查询语句+参数
>> 一级缓存失效的四种情况
1、不同的SqlSession对应不同的一级缓存
2、同一个SqlSession但是查询条件不同
3、同一个SqlSession两次查询期间执行了任何一次增删改操作
4、同一个SqlSession两次查询期间手动清空了缓存
> 二级缓存
>> 二级缓存(second level cache),全局作用域缓存
>> 二级缓存默认不开启,需要手动配置
>> MyBatis提供二级缓存的接口以及实现,缓存实现要求POJO实现Serializable接口
>> 二级缓存在 SqlSession 关闭或提交之后才会生效
>> 使用步骤:
1、全局配置文件中开启二级缓存 <setting name="cacheEnabled" value="true"/>
2、需要使用二级缓存的映射文件处使用cache配置缓存 <cache />
3、注意:POJO需要实现Serializable接口
- 缓存相关属性
> eviction=“FIFO”:缓存回收策略:
>> LRU – 最近最少使用的:移除最长时间不被使用的对象
>> FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
>> SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
>> WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象
>> 默认的是 LRU。
> flushInterval:刷新间隔,单位毫秒
>> 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
> size:引用数目,正整数
>> 代表缓存最多可以存储多少个对象,太大容易导致内存溢出
> readOnly:只读,true/false
>> true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
>> false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。
- 缓存有关设置
1、全局setting的cacheEnable: 配置二级缓存的开关。一级缓存一直是打开的。
2、select标签的useCache属性: 配置这个select是否使用二级缓存。一级缓存一直是使用的
3、sql标签的flushCache属性: 增删改默认flushCache=true。sql执行以后,会同时清空一级和二级缓存。查询默认flushCache=false。
4、sqlSession.clearCache(): 只是用来清除一级缓存。
5、当在某一个作用域 (一级缓存Session/二级缓存Namespaces) 进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。
- 第三方缓存整合
> EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
> MyBatis定义了Cache接口方便我们进行自定义扩展。
> 步骤:
1、导入ehcache包,以及整合包,日志包:ehcache-core-2.6.8.jar、mybatis-ehcache-1.0.3.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.2.jar
2、编写ehcache.xml配置文件
3、配置cache标签 <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
> 参照缓存:若想在命名空间中共享相同的缓存配置和实例。可以使用 cache-ref 元素来引用另外一个缓存。
> Context标签
>> targetRuntime=“MyBatis3“可以生成带条件的增删改查
>> targetRuntime=“MyBatis3Simple“可以生成基本的增删改查如果再次生成,建议将之前生成的数据删除,避免xml向后追加内容出现的问题。
- MBG配置文件
- 测试查询:QBC风格的带条件查询
2)、在全局配置文件中注册插件
- 插件原理
1)、按照插件注解声明,按照插件配置顺序调用插件plugin方法,生成被拦截对象的动态代理
2)、多个插件依次生成目标对象的代理对象,层层包裹,先声明的先包裹;形成代理链
3)、目标方法执行时依次从外到内执行插件的intercept方法。
4)、多个插件情况下,我们往往需要在某个插件中分离出目标对象。可以借助MyBatis提供的SystemMetaObject类来进行获取最后一层的h以及target属性的值
- Interceptor接口
> Intercept:拦截目标方法执行
> plugin:生成动态代理对象,可以使用MyBatis提供的Plugin类的wrap方法
> setProperties:注入插件配置时设置的属性
> 我们可以对照官方文档的说明,快速的使用插件
> 使用步骤:
1、导入相关包pagehelper-x.x.x.jar 和 jsqlparser-0.9.5.jar。
2、在MyBatis全局配置文件中配置分页插件。
3、使用PageHelper提供的方法进行分页
4、可以使用更强大的PageInfo封装返回结果
- 批量操作
> 默认的 openSession() 方法没有参数,它会创建有如下特性的:
>> 会开启一个事务(也就是不自动提交)
>> 连接对象会从由活动环境配置的数据源实例得到。
>> 事务隔离级别将会使用驱动或数据源的默认设置。
>> 预处理语句不会被复用,也不会批量处理更新。
> openSession 方法的 ExecutorType 类型的参数,枚举类型:
>> ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情(这是默认装配的)。它为每个语句的执行创建一个新的预处理语句。
>> ExecutorType.REUSE: 这个执行器类型会复用预处理语句。
>> ExecutorType.BATCH: 这个执行器会批量执行所有更新语句
> 批量操作我们是使用MyBatis提供的BatchExecutor进行的,他的底层就是通过jdbc攒sql的方式进行的。我们可以让他攒够一定数量后发给数据库一次。
> 与Spring整合中,我们推荐,额外的配置一个可以专门用来执行批量操作的sqlSession
> 需要用到批量操作的时候,我们可以注入配置的这个批量SqlSession。通过他获取到mapper映射器进行操作。
> 注意:
1、批量操作是在session.commit()以后才发送sql语句给数据库进行执行的
2、如果我们想让其提前执行,以方便后续可能的查询操作获取数据,我们可以使用sqlSession.flushStatements()方法,让其直接冲刷到数据库进行执行。
- 存储过程
> 实际开发中,我们通常也会写一些存储过程,MyBatis也支持对存储过程的调用
> 一个最简单的存储过程
> 存储过程的调用:
1、select标签中statementType=“CALLABLE”
2、标签体中调用语法:{call procedure_name(#{param1_info},#{param2_info})}
> 存储过程-游标处理
>> MyBatis对存储过程的游标提供了一个JdbcType=CURSOR的支持,可以智能的把游标读取到的数据,映射到我们声明的结果集中
>> 调用实例:
- 自定义TypeHandler处理枚举
> 我们可以通过自定义TypeHandler的形式来在设置参数或者取出结果集的时候自定义参数封装策略。
> 步骤:
1、实现TypeHandler接口或者继承BaseTypeHandler
2、使用@MappedTypes定义处理的java类型、使用@MappedJdbcTypes定义jdbcType类型
3、在自定义结果集标签或者参数处理的时候声明使用自定义TypeHandler进行处理或者在全局配置TypeHandler要处理的javaType
> 测试实例
>> 一个代表部门状态的枚举类
1、测试全局配置EnumOrdinalTypeHandler
2、测试全局配置EnumTypeHandler
3、测试参数位置设置自定义TypeHandler
> 自定义TypeHandler
JavaEE高级-MyBatis学习笔记的更多相关文章
- JavaEE高级-SpringMVC学习笔记
*SpringMVC概述 - Spring为展示层提供的基于MVC设计理念的优秀Web框架,是目前最主流的MVC框架之一 - Spring3.0后全面超越Struts2,成为最优秀的MVC框架 - S ...
- JavaEE高级-MyBatisPlus学习笔记
第 1 章 简介 1.1 MyBatisPlus 介绍 -MyBatis-Plus(简称 MP),是一个 MyBatis 的增强工具包,只做增强不做改变. 为简化开发工作.提高生产率而生我们的愿景是成 ...
- JavaEE高级-Spring学习笔记
*Spring是什么? - Spring是一个开源框架 - Spring为简化企业级应用开发而生.使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能 - Spring是一个I ...
- JavaEE高级-JPA学习笔记
*JPA概述 *JPA是什么? - Java Persistence API :用于对象持久化的API - Java EE 5.0平台标准的ORM规范,使得应用程序以统一的方式访问持久化层 - JPA ...
- JavaEE高级-Hibernate学习笔记
*什么是Hibernate? > 一个框架 > 一个Java领域的持久层框架 > 一个ORM框架 *对象的持久化 > 狭义的理解:“持久化”仅仅指把对象永久保存到数据库中 &g ...
- JavaEE高级-Struts2学习笔记
Struts2是一个用来来发MVC应用的框架,它提供了Web应用程序开发过程中一些常见问题的解决方案: - 对来自用户的输入数据进行合法的验证 - 统一的布局 - 可扩展性. - 国际化和本地化 - ...
- JavaEE高级-Maven学习笔记
Maven简介 1.Maven是一款服务于Java平台的自动化构建工具. 2.构建: - 概念:以“Java源文件”.“框架配置文件”.“JSP”.“HTML”.“图片”等资源为“原料”,去“生产”一 ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
- mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)
继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...
随机推荐
- EasyUI combobox下拉框添加水平滚动条和垂直滚动条
在EasyUI中combobox组件设置滚动条: 1.垂直滚动条:设置panelHeight属性,默认200,组件的数据过多滚动条自动出现,设置auto,则不出现滚动条. 2.水平滚动条:水平滚动条在 ...
- 《Effective Java》读书笔记 - 11.序列化
Chapter 11 Serialization Item 74: Implement Serializable judiciously 让一个类的实例可以被序列化不仅仅是在类的声明中加上" ...
- 《Effective Java》读书笔记 - 5.泛型
Chapter 5 Generics Item 23: Don't use raw types in new code 虽然你可以把一个List<String>传给一个List类型(raw ...
- debian配置国内软件源
本例在debian:buster-slim docker镜像中实验通过 1.启动docker实例 docker run -it --name debian debian:buster-slim bas ...
- C++ STL unordered_map
容器unordered_map<key type,value tyep>m; 迭代器unordered_map<key type,value tyep>::iterator i ...
- 2、node-webkit运行web应用,node-webkit把web应用打包成桌面应用
下面我通过一个简单的demo来介绍怎么样把一个web应用打包成一个可执行文件(这里只介绍windows环境) 首先新建一个index.html文件,作为我们这个demo的入口页面,我们暂且就把这个页面 ...
- AndroChef Java Decompile
With AndroChef Java Decompiler you can decompile apk., dex, jar and java class-files. It's simple an ...
- wcf restful 访问报错 *.svc HTTP error 404.17 - Not Found
安装完成 iisreset,即使不重启也已经可以使用了
- elasticsearch7.0安装及配置优化
简单讲ES开箱即用,不用任何配置也能玩转搜索引擎:以下内容是根据易企秀线上实际使用场景进行的安装和配置,支持冷热数据分离 1.安装 Linux 环境下载安装包 curl -L -O https://a ...
- JSP———数据交互【1】
JSP的内置对象 不用声明就可以在JSP页面中使用 request对象 内置对象 request 封装了用户提交的信息,主要用于处理客户端请求 <FORM action="tom.js ...