Mybatis
2021-10-22 11:31:16 13 举报
AI智能生成
复工后
作者其他创作
大纲/内容
XML配置文件(configuration XML)中包含了对MyBatis系统的核心设置
包含获取数据库连接实例的数据源(dateSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)
mybatis-config.xml
概念
可以重用SqlSessionFactoryBuilder来创建多个SqlsessionFactory实例,但是最好还是不要让其一直存在以保证所有的XML解析资源开放给更重要的事情
作用域(Scope)和生命周期
SqlSessionFactoreBuilder
sql会话工厂,用于创建SqlSession
SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,在没有任何理由对它进行清除或者重建
最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式
作用域和生命周期
String resource=\"org/mybatis/example/mybatis-config.xml\"; InputStream inputStream=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
使用XML构建
java代码块构建
如何创建
SqlSessionFactory接口
SqlSession是Mybatis的一个重要接口,定义了数据库的增删改查以及事务管理的常用方法
SqlSession还提供了查找Mapper接口的有关方法
每个线程都应该有他自己的SqlSession实例
SqlSesion的实例不是线程安全的,因此是不能被共享的,所以它的最佳作用域是请求或者方法作用域
SQLSession session=sqlSessionFactory.openSession(); try{ //do work }finally{ session.close(); }
SqlSession接口
承载了实际的业务逻辑。其生命周期比较短,由SqlSession创建,用于将Java对象和实际的SQL语句对应起来
Mapper接口是指程序员自行定义的一个数据操纵接口,类似于通常所说的DAO接口。跟DAO不同的地方在于Mapper接口只需要程序员定义,不需要程序员区实现,MaBatis会自动为Mapper接口创建动态代理对象。Mapper接口的方法通常与Mapper配置文件中的select/insert/update/delete等XML结点存在一一对应关系
使用XML配置文件的方式
使用注解方式
直接使用Mybatis提供的API
实现方式
<mapper namespace=\"com.etc.dao.EmployeeDao\"> <select id=\"queryIf\" resultType=\"com.etc.bean.Employee\"> select * from employee where 1=1 <if test=\"eName!=null\"> and eName like '%${eName}%' </if> <if test=\"eSex!=null\"> and eSex =#{eSex} </if> </select> <select id=\"queryChoose\" resultType=\"com.etc.bean.Employee\"> select * from employee where 1=1 <choose> <when test=\"eName!=null\"> and eName like '%${eName}%' </when> <when test=\"eSex!=''\"> and eSex like '%${eSex}%' </when> <otherwise> order by eid desc </otherwise> </choose> </select> <select id=\"queryByTrim\" resultType=\"com.etc.bean.Employee\"> select * from employee <trim prefix=\"where\" prefixOverrides=\"and|or\"> <if test=\"eName!=null\"> and eName like '%${eName}%' </if> <if test=\"eSex!=''\"> and eSex like '%${eSex}%' </if> <if test=\"eAddr!=null\"> and eAddr like '%${eAddr}%' </if> </trim> </select> <update id=\"update\" parameterType=\"com.etc.bean.Employee\"> update employee <set> <if test=\"eName!=null\
配置文件
Mapper接口
几个关键类
Executor:MyBatis执行器,是MyBatis调度的核心,负责SQl语句的生成和查询缓存的维护
StatementHandler:封装了JDBC Statement操作,负责对JDBC statement的操作。如设置参数,将Statement结果集转换成List集合
ParameterHandler:负责对用户传递的参数转换成JDBC Statement所需要的参数
ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
TypeHander:负责java数据类型和jdbc数据类型之间的映射和转换
MappedStatement:MappedStatement维护了一条<select|update|delete|insert>节点的封装
BoundSQL:表示动态生成的SQL语句以及相应的参数信息
Configuration:Mybatis所有的配置信息都维持在Configuration对象之中
mybatis源码的几个主要部件
http://www.mybatis.org/mybatis-3/zh/index.html
官网
Mybatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架
Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
MyBatis可以对配置和原生的Map使用简单的XML或注解,将接口和Java的POJO映射成数据库中的数据
什么是Mybatis
<dependency> <groupId>org.mybatis</groupId> <artfactId>mybatis</artifactId> <version>x.x.x</version></dependency>
安装
mybatis简介
引用propertis文件并读取配置信息,也可以在<propertis/>标签中定义属性
作用
#驱动 driverdriver=com.mysql.cj.jdbc.Driver#链接地址url=jdbc:mysql://localhost:3306/oa#用户名username=root密码password=root
创建一个资源文件jdbc.properties
<properties resource=\"dbconfig.properties\"></properties>
mybatis-config.xml中引入
也可以在<propertis/>标签中定义属性
<dataSource type=\"POOLED\"> <property name=\"driver\" value=\"${driver}\"/> <property name=\"url\" value=\"${url}\"/> <property name=\"username\" value=\"${username}\"/> <property name=\"password\" value=\"${password}\"/> </dataSource>
使用properties文件里的属性
例子
在properties元素体内指定的属性首先被读取
然后根据properties元素中的resource属性读取类路径下属性文件或者更据url属性指定的路径读取属性文件,并覆盖已读取的同名属性
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性
配置的加载顺序
properties
MyBatis中极为重要的调整设置,他们会改变MyBatis的运行时行为
<settings> <!-- //二级缓存开启--> <setting name=\"cacheEnabled\" value=\"true\"/> <!-- 延迟加载--> <setting name=\"lazyLoadingEnabled\" value=\"true\"/> <setting name=\"aggressiveLazyLoading\" value=\"false\"/> </settings>
配置方式
该配置影响的所有映射器中配置的缓存的全局开关。默认true
cacheEnabled
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认false
lazyLoadingEnabled
当开启时,任何方法的调用都会加载该对象的所有属性。否则每个属性会按需加载,默认FALSE
aggressiveLazyLoading
指定MyBatis所有日志的具体实现,未指定时将自动查找
logImpl
常用
setting
用于引用定义好的映射定义,告诉mybatis去哪里找我们的sql定义配置
<mappers> <mapper resource=\"mapper/EmployeeMapper.xml\"/> </mappers>
直接引用xml文件
<mappers> <mapper url=\"file///D:/workspace/UserMapper.xml\"/> </mappers>
通过绝对路径,绝对路径前加
<mappers> <mapper resource=\"com.etc.mapper.UserMapper\"/> </mappers>
引用mapper接口对象的方式
引用方式
mapper
配置成适应多种环境,这种机制有助于将sql映射应用于多种数据库之中
不过要记住:尽管可以配置多个环境,每个SqlSessionFactory实例只能选择其一
为了开发设置不同的数据库配置
测试和生产环境数据库不同
有多个数据库和共享相同的模式,既对不同的数据库使用相同的SQl映射
使用场景
<environments default=\"development\"> <environment id=\"development\"> <transactionManager type=\"JDBC\"/> <dataSource type=\"POOLED\"> <property name=\"driver\" value=\"${driver}\"/> <property name=\"url\" value=\"${url}\"/> <property name=\"username\" value=\"${username}\"/> <property name=\"password\" value=\"${password}\"/> </dataSource> </environment> </environments>
代码
配置环境(environments)
XML映射配置文件
①每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。②在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据库,而我们在极短的时间内做了完全相同的查询,那么它们的结果极有可能完全相同,由于查询一次数据库的代价很大,这有可能造成很大的资源浪费。③为了解决这个问题,减少资源浪费,MyBatis会在表示会话的SQLSession对象中建立一个简单的缓存,将每次查询到的结果缓存起来,当下次查询的时候,如果判断现有个完全一样的查询,会直接从缓存中将结果取出来,返回给用户,不需要再进行一次查询数据库了。
什么是一级缓存,为什么使用一级缓存
①a.MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。②b.如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;③c.如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;d.SqlSession中执行了任何一个update操作(update()、delete()、insert()),都会清空PerpetualCache对象的数据,但是该对象可以继续使用;
一级缓存的生命周期
一级缓存的工作流程
如何确定CacheKey
一级缓存
MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。
①1.MyBatis支持二级缓存的总开关:全局配置变量参数cacheEnabled=true②2.该select语句所在的Mapper,配置了<cache> 或<cached-ref>节点,并且有效③3.该select语句的参数useCache=true ④4.对象的类必须实现序列化接口
支持二级缓存的条件
子主题Cache使用时的注意事项/避免使用二级缓存
二级缓存
mybatis的缓存
Mybatis
0 条评论
回复 删除
下一页