MyBatis知识点

MyBatis简介

MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.

MyBatis-HelloWorld

HelloWorld简单版
–创建一张测试表
–创建对应的javaBean
–创建mybatis配置文件,sql映射文件
–测试

MyBatis操作数据库

1、创建MyBatis全局配置文件
MyBatis 的全局配置文件包含了影响MyBatis 行为甚深的设置(settings)和属性(properties)信息、如数据库连接池信息等。指导着MyBatis进行工作。我们可以参照官方文件的配置示例。

2、创建SQL映射文件
映射文件的作用就相当于是定义Dao接口的实现类如何工作。这也是我们使用MyBatis时编写的最多的文件。

测试
1、根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
在这里插入图片描述2、使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象代表和数据库的一次会话。
在这里插入图片描述
使用SqlSession根据方法id进行操作
在这里插入图片描述
HelloWorld-接口式编程
创建一个Dao接口
修改Mapper文件
测试

使用SqlSession获取映射器进行操作
在这里插入图片描述
SqlSession
SqlSession 的实例不是线程安全的,因此是不能被共享的。
SqlSession每次使用完成后需要正确关闭,这个关闭操作是必须的
SqlSession可以直接调用方法的id进行数据库操作,但是我们一般还是推荐使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作

properties属性

在这里插入图片描述
在这里插入图片描述
如果属性在不只一个地方进行了配置,那么MyBatis 将按照下面的顺序来加载:
在properties 元素体内指定的属性首先被读取。
然后根据properties 元素中的resource 属性读取类路径下属性文件或根据url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

settings设置

这是MyBatis 中极为重要的调整设置,它们会改变MyBatis 的运行时行为。
在这里插入图片描述
在这里插入图片描述

typeAliases别名处理器

类型别名是为Java 类型设置一个短的名字,可以方便我们引用某个类。
在这里插入图片描述
类很多的情况下,可以批量设置别名这个包下的每一个类创建一个默认的别名,就是简单类名小写。
在这里插入图片描述
@Alias注解为其指定一个别名
在这里插入图片描述
不能用以下这些作为别名
在这里插入图片描述

自定义类型处理器

步骤:
1.实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
2.指定其映射某个JDBC类型(可选操作)
3.、在mybatis全局配置文件中注册

plugins插件

1.插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。后面会有专门的章节我们来介绍mybatis运行原理以及插件
2.Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
3.ParameterHandler(getParameterObject, setParameters)
4.ResultSetHandler(handleResultSets, handleOutputParameters)
5.StatementHandler(prepare, parameterize, batch, update, query)

environment-指定具体环境

id:指定当前环境的唯一标识
transactionManager、和dataSource都必须有
在这里插入图片描述

transactionManager

type:JDBC | MANAGED | 自定义
1.JDBC:使用了JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。JdbcTransactionFactory
2.MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如JEE 应用服务器的上下文)。ManagedTransactionFactory
3.自定义:实现TransactionFactory接口,type=全类名/别名

dataSource

type:UNPOOLED | POOLED | JNDI | 自定义
1.UNPOOLED:不使用连接池,UnpooledDataSourceFactory
2.POOLED:使用连接池,PooledDataSourceFactory
3.JNDI:在EJB 或应用服务器这类容器中查找指定的数据源
4.自定义:实现DataSourceFactory接口,定义数据源的获取方式。

databaseIdProvider环境

MyBatis 可以根据不同的数据库厂商执行不同的语句。
在这里插入图片描述
MyBatis匹配规则如下:
1、如果没有配置databaseIdProvider标签,那么databaseId=null
2、如果配置了databaseIdProvider标签,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为null
3、如果databaseId不为null,他只会找到配置databaseId的sql语句
4、MyBatis 会加载不带databaseId属性和带有匹配当前数据库databaseId 属性的所有语句。如果同时找到带有databaseId 和不带databaseId 的相同语句,则后者会被舍弃。

mapper映射

mapper逐个注册SQL映射文件
在这里插入图片描述
使用批量注册
(这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下)
在这里插入图片描述

MyBatis-映射文件

映射文件指导着MyBatis如何进行数据库增删改查,有着非常重要的意义;
•cache –命名空间的二级缓存配置
•cache-ref –其他命名空间缓存配置的引用。
•resultMap–自定义结果集映射
•parameterMap –已废弃!老式风格的参数映射
•sql –抽取可重用语句块。
•insert –映射插入语句
•update –映射更新语句
•delete –映射删除语句
•select –映射查询语句

insert、update、delete元素

在这里插入图片描述

主键生成方式

若数据库支持自动生成主键的字段(比如MySQL 和SQL Server),则可以设置useGeneratedKeys=”true”,然后再把keyProperty设置到目标属性上。
在这里插入图片描述
对于不支持自增型主键的数据库(例如Oracle),则可以使用selectKey子元素:selectKey 元素将会首先运行,id 会被设置,然后插入语句会被调用
在这里插入图片描述

selectKey

在这里插入图片描述

参数传递

单个参数
可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。
多个参数
任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,0,1…,值就是参数的值。
命名参数
为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
POJO
当这些参数属于我们业务POJO时,我们直接传递POJO
Map
我们也可以封装多个参数为map,直接传递

参数处理

参数也可以指定一个特殊的数据类型:
在这里插入图片描述
在这里插入图片描述

–javaType 通常可以从参数对象中来去确定
–如果null 被当作值来传递,对于所有可能为空的列,jdbcType 需要被设置
–对于数值类型,还可以设置小数点后保留的位数:
–mode 属性允许指定IN,OUT 或INOUT 参数。如果参数为OUT 或INOUT,参数对象属性的真实值将会被改变,就像在获取输出参数时所期望的那样。

参数位置支持的属性
–javaType、jdbcType、mode、numericScale、
resultMap、typeHandler、jdbcTypeName、expression

实际上通常被设置的是:
可能为空的列名指定jdbcType
•#{key}:获取参数的值,预编译到SQL中。安全。
•${key}:获取参数的值,拼接到SQL中。有SQL注入问题。ORDER BY ${name}

select元素

Select元素来定义查询操作。
Id:唯一标识符。
–用来引用这条语句,需要和接口的方法名一致
parameterType:参数类型。
–可以不传,MyBatis会根据TypeHandler自动推断
resultType:返回值类型。
–别名或者全类名,如果返回的是集合,定义集合中元素的类型。不能和resultMap同时使用

在这里插入图片描述

自动映射

1.全局setting设置
–autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是列名和javaBean属性名一致
–如果autoMappingBehavior设置为null则会取消自动映射
–数据库字段命名规范,POJO属性符合驼峰命名法,如A_COLUMNaColumn,我们可以开启自动驼峰命名规则映射功能,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-分段查询&延迟加载

在这里插入图片描述

Collection-集合类型&嵌套结果集

在这里插入图片描述
在这里插入图片描述

Collection-分步查询&延迟加载

在这里插入图片描述

扩展-多列值封装map传递

分步查询的时候通过column指定,将对应的列的数据传递过去,我们有时需要传递多列数据。
使用{key1=column1,key2=column2…}的形式
在这里插入图片描述
association或者collection标签的fetchType=eager/lazy可以覆盖全局的延迟加载策略,指定立即加载(eager)或者延迟加载(lazy)

MyBatis-动态SQL

动态SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作。
动态SQL 元素和使用JSTL 或其他类似基于XML 的文本处理器相似。
MyBatis 采用功能强大的基于OGNL 的表达式来简化操作。
–if
–choose (when, otherwise)
–trim (where, set)
–foreach

if

在这里插入图片描述

choose

在这里插入图片描述

trim (where, set)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

foreach

动态SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建IN 条件语句的时候。
在这里插入图片描述
当迭代列表、集合等可迭代对象或者数组时
–index是当前迭代的次数,item的值是本次迭代获取的元素
当使用字典(或者Map.Entry对象的集合)时
–index是键,item是值

bind

bind 元素可以从OGNL 表达式中创建一个变量并将其绑定到上下文。比如:
在这里插入图片描述

MyBatis缓存机制

一级缓存和二级缓存。
–1、默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。
–2、二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
–3、为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

一级缓存

一级缓存(local cache), 即本地缓存, 作用域默认为sqlSession。当Session flush 或close 后, 该Session 中的所有Cache 将被清空。
本地缓存不能被关闭, 但可以调用clearCache() 来清空本地缓存, 或者改变缓存的作用域.
在mybatis3.1之后, 可以配置本地缓存的作用域. 在mybatis.xml 中配置

一级缓存演示&失效情况

同一次会话期间只要查询过的数据都会保存在当前SqlSession的一个Map中
key:hashCode+查询的SqlId+编写的sql查询语句+参数
一级缓存失效的四种情况
–1、不同的SqlSession对应不同的一级缓存
–2、同一个SqlSession但是查询条件不同
–3、同一个SqlSession两次查询期间执行了任何一次增删改操作
–4、同一个SqlSession两次查询期间手动清空了缓存

二级缓存

•二级缓存(second level cache),全局作用域缓存
•二级缓存默认不开启,需要手动配置
•MyBatis提供二级缓存的接口以及实现,缓存实现要求POJO实现Serializable接口
•二级缓存在SqlSession 关闭或提交之后才会生效
•使用步骤
–1、全局配置文件中开启二级缓存

–2、需要使用二级缓存的映射文件处使用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。

在这里插入图片描述

MyBatis-Spring整合
整合关键配置

在这里插入图片描述

MyBatis-逆向工程
MBG使用

•使用步骤:
–1)编写MBG的配置文件(重要几处配置)
1)jdbcConnection配置数据库连接信息
2)javaModelGenerator配置javaBean的生成策略
3)sqlMapGenerator配置sql映射文件生成策略
4)javaClientGenerator配置Mapper接口的生成策略
5)table配置要逆向解析的数据表
tableName:表名
domainObjectName:对应的javaBean名
–2)运行代码生成器生成代码
•注意:
Context标签
targetRuntime=“MyBatis3“可以生成带条件的增删改查
targetRuntime=“MyBatis3Simple“可以生成基本的增删改查
如果再次生成,建议将之前生成的数据删除,避免xml向后追加内容出现的问题。

MBG配置文件
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
//数据库连接信息配置
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/bookstore0629"
userId="root" password="123456">
</jdbcConnection>
//javaBean的生成策略
<javaModelGenerator targetPackage="com.atguigu.bean" targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
//映射文件的生成策略
<sqlMapGenerator targetPackage="mybatis.mapper" targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
//dao接口java文件的生成策略
<javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.dao"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
//数据表与javaBean的映射
<table tableName="books" domainObjectName="Book"></table>
</context>
</generatorConfiguration>
生成器代码
publicstaticvoidmain(String[] args) throwsException {
List<String> warnings = newArrayList<String>();
booleanoverwrite = true;
File configFile = newFile("mbg.xml");
ConfigurationParser cp = newConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = newDefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = newMyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
测试查询
@Test
publicvoidtest01(){
SqlSession openSession = build.openSession();
DeptMapper mapper = openSession.getMapper(DeptMapper.class);
DeptExample example = newDeptExample();
//所有的条件都在example中封装
Criteria criteria = example.createCriteria();
//select id, deptName, locAdd from tbl_dept WHERE
//( deptName like ? and id > ? )
criteria.andDeptnameLike("%部%");
criteria.andIdGreaterThan(2);
List<Dept> list = mapper.selectByExample(example);
for(Dept dept : list) {
System.out.println(dept);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值