MyBatis资料整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wo3002807/article/details/65480196
========================================================================
========使用篇===============================================
========================================================================
1. Mapper XML映射文件
顶级元素:
cache:给定命名空间的缓存配置。
cache-ref:其他命名空间缓存配置的引用
resultMap:用来描述如何从数据库结果集中来加载对象,列名与对象的属性一一对应关系
sql:可被其他语句引用
i nsert/update/delete/select:db操作指令
2. 顶级元素解析
2.1 select元素
**id:接口方法
**parameterType:限定参数类型,可选,可以有TypeHandler推断出具体传入语句参数的类型。
**resultType:期望结果类型。
**resultMap:外部resultMap的命名引用。  resultMap与resultType不能同时使用
**useCache:结果集被二级缓存保存,默认值:true
**flushCache:任何使用语句被调用,都会导致本地缓存和二级缓存都会清空。默认值:false
timeout:驱动呢程序等待数据库返回请求结果的描述。默认值依赖驱动。
fetchSize:每次返回的结果行数。默认值以来驱动
*statementType:STATEMENT/PREPARED/CALLABLE任意一个,对应mybatis使用的是Statement,PreparedStatement,CallableStatement.默认值:PREPARED
resultSetType:FORWARD_ONLY/SCROLL_SENSITIVE/SCROLL_INSENSITIVE任意一个,默认值依赖驱动
*databaseId:如果配置了databaseIdProvider,Mybatis会加载所有的不带databaseId或匹配当前databaseId的语句;如果带或者不带的语句都有,则不带的会被忽略。
resultOrdered:这个仅对嵌套结果select语句使用;如果为true,就是假设包含了嵌套结果集或者分组。这样的话,当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值:false
resultSets:这个设置仅对多结果集的情况适用,它将列出语句之后返回结果集并每个结果集给一个名词,名称是逗号分开。
2.2 update/insert/delete元素
**id:接口方法
**parameterType:限定参数类型,可选,可以有TypeHandler推断出具体传入语句参数的类型。
**flushCache:任何使用语句被调用,都会导致本地缓存和二级缓存都会清空。默认值:false
*timeout:驱动呢程序等待数据库返回请求结果的描述。默认值依赖驱动。
*statementType:STATEMENT/PREPARED/CALLABLE任意一个,对应mybatis使用的是Statement,PreparedStatement,CallableStatement.默认值:PREPARED
*useGenerateKeys:仅对update/insert有用,会通过Mybatis提供的方法来自动生成。默认值为false
*keyProperty:仅对insert/update有用,唯一标记一个属性,对象的属性名
*keyColumn:仅对update/insert有用,通过生成的键值设置表中的列名,
*databaseId:如果配置了databaseIdProvider,Mybatis会加载所有的不带databaseId或匹配当前databaseId的语句;如果带或者不带的语句都有,则不带的会被忽略。
2.2.1 selectKey元素
keyProperty:对象的属性名
keyColumn:表列名
resultType:结果类型
order:BEFORE/AFTER.
*statementType:STATEMENT/PREPARED/CALLABLE任意一个,对应mybatis使用的是Statement,PreparedStatement,CallableStatement.默认值:PREPARED
例子:
<insert id="addStudent" parameterType="student" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into student(name,age,school,birthday) 
values
(#{name},#{age},#{school},#{birthday})
</insert>
这个没有多大的作用,只是调用数据库支持的自动递增函数才行;那个keyProperty是为映射javaBean对象的属性名,从DB里获取keyColumns的值后给赋上。
可以用官方上例子:
<insert id="insertAuthor">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
</selectKey>
insert into Author(id, username, password, email,bio, favourite_section)
values
(#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>
大体原理,先解析selectKey元素,生成SelectKeyGenerator对象,注入到MappedStatement。它会在BaseStatementHandler构造函数中调用接口before方法。
SelectKeyGenerator对象的before方法大体是通过DB来获取对应的值,从而往parameterType对象的keyProperty属性注入值,接着就按照往常的流程执行下去。
2.3 sql元素
例子:
<sql id="userColumns">${alias}.filed1,${alias}.field2,${alias}.field3</sql>
<select id="dd">
<include refid="userColumns"><property name="alias" value="t1"/>
</select>
===========================================
*讲解Parameter
如果指定ParameterType为一个定制对象,则使用下面的形式,来指定。一般只要指定属性名即可,如果需要更精确的类型,则需要指定javaType与jdbcType来从configuration中找到精确的typeHandler来进行类型转换。或者直接指定typeHandler即可。

至于mode很少涉及到,一般默认为IN;其余的两个OUT/INOUT没有了解到,没有看到具体例子。要了解需要从源码进行查阅相关。


#{fields,javaType=Type,jdbcType=type,typeHandler=handler,mode=IN/OUT/INOUT}
*讲解resultMaps
resultType="map" 采用hashMap<String,Object>来存储的
resultType="javaBean" 采用Javabean来映射,将一条记录存储为一个对象。
resultTMap="resultMapId"  从configuration找到resultMapId,将resultMapId的列名与属性一一对应,转换为一个对象;提出这个,是为了列名与javaBean对象的属性名没有一一对应。所以需要在ResultMap元素里添加映射关系。


2.4 ResultMap元素
constructor:用来注入结果到构造方法中
idArg:ID参数,标记作用作为id可以帮助提供整体效能
arg:注入到构造方法的一个普通结果
id:一个ID结果,
result:注入到字段或JavaBean属性中
association:对象里包括另外一个对象
嵌套查询:执行另外一个SQL映射语句
嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集。
collection:*ofType,一个对象里包括一个集合,该集合的元素是一个对象。元素对象类型由ofType指定。
与association类似,只是这个是集合形式
*descriminator:*extends
加载动态对象。根据条件选择不同对象来加载结果集


*讲解自动映射-->先处理自动映射后,在处理手动映射
自动映射:不需人为干预,常规情况下,是列名与java类中属性名一一对应即可,注意,忽略大小写。
然而,数据库的列名一般命名规则是单词间用下划线分隔;而java属性一般遵循驼峰命名法,为了这两种命名方式之间自动映射,需要Mybatis-config.xml配置里配置 mapUnderscoreToCamelCase为true
手动映射:人为干预;
一般包括为修改查询列名,使其符合自动映射规则。
自动映射等级:主要是在Mybatis-config.xml配置里的settings里设置autoMappingBehavior.
NONE:禁用自动映射。
PARTIAL:将自动映射结果除了那些有内部定义内嵌结果映射,默认值
FULL:自动映射所有,有一定风险。回起到想不到的效果。


讲解缓存
当你配置<cache>时,它会建立一个缓存对象。它会保存在CachingExecutor类中的tcm,类型为TransactionalCacheManager。它只会保存该mapper配置文件所有的语句 结果。但前提是该语句要配有useCache为true时才起作用。
而在语句配置的useCache与flushCache会在BaseExecutor起作用。
所以说,这两个种是不一样的缓存。
可不可以说,<cache>配置是不是就是一级缓存,而那个useCache就是二级缓存呢?
而那个二级缓存就是默认是开启的。
而那个MyBatis-config配置中的cacheEnabled会影响一级缓存,而影响不到二级缓存,因为cacheEnabled会影响是否会用到CachingExecutor。这个就是一级缓存。
========================================================================
=======XML映射配置文件=====Mybatis-config.xml
========================================================================
configuration配置下
顶级元素
properties属性
settings设置
typeAliases类型命名
typeHandlers类型处理器
objectFactory对象工厂
plugins插件
environments环境
databaseIdprovider数据库厂商标记
mappers映射器


========================================================================
========原理篇==========================================================
========================================================================
JDBC基础原理
1. 创建连接Connection
2. 创建Statement()
========================================================================
1. DataSource
接口:
A. getConnection()
B. getConnectiion(username,password)
mybatis实现该接口的类有如下:
(1) PooledDataSource
(2) UnpooledDataSource
(3) JndiDataSource, 但没有具体的类通过JndiDataSourceFactory来创建
========================================================================
2. TransactionFactory
接口:
A. setProperties(properties)
B. newTransaction(connection)
C. newTransaction(datasource,transactionLevel,autoCommit)
mybatis实现该接口的类有如下:
(1) JdbcTransactionFactory
(2) ManagedTransactionFactory
========================================================================
3. Environment
简单封装TransactionFactory与DataSource
========================================================================
4. Mapper
========================================================================
5. Configuration
封装了大量的配置信息,同时也包含了Environment信息,Mapper信息
属性成员:
A. environment
B. typeAliasRegistry
C. typeHandlerRegistry
D. mapperRegistry
E. mapperStatements
F. defaultExecutorType
G. resultMaps
关键方法:
A. newExecutor(Transaction):Executor
B. newExecutor(Transaction,ExecutorType):Executor
C. newParameterHandler(MappedStatement,Object,BoundSql):ParameterHandler
D. newResultSetHandler(Executor,MappedStatement,RowBounds,ParameterHandler,ResultHandler,BoundSql):ResultSetHandler
E. newStatementHandler(Executor,MappedStatement,Object,RowBounds,ResultHandler,BoundSql):StatementHandler
F. newMetaObject(Object):MetaObject
========================================================================
6. SqlSessionFactoryBuilder
建造者模式下,通过这个builder来创建SqlSessionFactory具体实现类
========================================================================
7. SqlSessionFactory
接口:
A. getConfiguration
B. openSession
C. openSession(boolean)
D. openSession(TransactionIsolatioonLevel)
E. openSession(ExecutorType)
F. openSession(ExecutorType,boolean)
G. openSession(ExecutorType,TransactionIsolatioonLevel)
H. openSession(ExecutorType,Connection)
mybatis实现该接口的类有如下:
(1) DefaultSqlSessionFactory
(2) SqlSessionManager
========================================================================
8. SqlSession
接口:(关键的接口)
A. clearCache/flushStatement
B. commit/commit(boolean)/rollback/rollback(boolean)
C. getConnection/getMapper
D. insert(string)/insert(String,Object)/
E. select(String,Object,ResultHandler)/select(String,ResultHandler)/select(String,Object,RowBounds,ResultHandler)
F. selectCursor(String)/selectCursor(Striing,Object,RowBounds)
G. selectList(String)/selectList(String,Object)/selectList(String,Object,RowBounds)
H. selectMap(String,String)/selectMap(String,Object,String)/selectMap(String,Object,String,RowBounds)
I. selectOne(String,Object)/selectOne(String)
J. update(String)/update(String,Object)
mybatis实现该接口的类有如下:
(1) DefaultSqlSession
(2) SqlSessionManager(同时实现了SqlSessionFactory)
========================================================================
在这里也同时关键的组件
1. ExecutorType
2. ResultHandler


========================================================================
Mybatis的SqlSession的初始化过程
1. 初始化dataSource
2. 初始化transactionFactory
3. 封装上面的两个成为一个对象environment
4. 以environment对象为参数来初始化configuration
5. configuration设置mapper
6. 通过SqlSessionFactoryBuilder来创建SqlSessionFactory.
7. SqlSessionFactory来打开SqlSession.
总结:1-5可以算是初始化configuration的各个步骤。所以,可以以配置文件的形式来一次性初始化configuration.
========================================================================
Mybatis的SqlSession执行操作过程
1. 从SqlSession中获取操作DB的接口:该接口有MapperProxy代理,该代理主要是缓存作用,具体操作的是MapperMethod
2. MapperMethod对参数进行转换,接着调用SqlSession的提供接口
3. 从SqlSession中的configuration中获取mappedStatement
4. 调用SqlSession中的executor.query接口来向DB查询数据

猜你喜欢

转载自blog.csdn.net/wo3002807/article/details/65480196
今日推荐