mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
- 软件框架(Framework): 用于解决软件中的通用型(共性)问题
- 持久层框架(数据访问层):用于更好解决数据持久化问题
- 半自动的ORM框架:解决对象关系映射问题。而hibernate (ORM 框架) :用于解决数据的持久化问题(数据库操作)
框架MyBatis开发优势
封装了JDBC共性,简化了代码的编写,提高了代码的开发速度,以及可维护性。 合理的架构设计,提高了系统的稳定性,访问性能,可扩展性。
(JDBC 编程的基本步骤如下:
TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换
MappedStatement MappedStatement维护了一条<select|update|delete|insert>节点的封装,
SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
BoundSql 表示动态生成的SQL语句以及相应的参数信息
Configuration MyBatis所有的配置信息都维持在Configuration对象之中。
MyBatis 项目中核心API:
SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数,
ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
MyBatis 核心应用组件:
MyBatis基础服务层主要负责提供如下几个方面的服务:
MyBatis接口应用层主要负责对外提供应用服务,主要为增删改查
MyBatis数据处理层主要负责处理数据访问问题:
- 加载驱动程序Driver (Class.forName(“com.mysql.jdbc.Driver”))
- 建立连接Connection (DriverManager.getConnection(url,username,password))
- 创建Statement (conn.createStatement())
- 发送sql (stmt.executeUpdate(sql))
- 处理结果ResultSet (while(rs.next))
- 释放资源(close))
- SqlSessionFactoryBuilder (负责读取配置文件,创建SqlSessionFactory对象)
- SqlSessionFactory(负责创建SqlSession对象)
- SqlSession(负责连接的维护,事务的处理,类似JDBC中的Connection)
- 配置文件(提供基础配置信息,例如连接配置,缓存配置,映射配置)
- 映射文件(定义SQL映射):ORM
- 连接服务 (配置连接池,)
- 事务服务(保证数据的原子性,一致性,隔离性,持久性)
- 缓存服务(更好的提高查询性能)
- 配置服务 (别名配置,映射配置,...,日志配置,....)
- SQL参数映射(Dao方法参数与映射文件中#{}表达式映射)
- SQL解析(语法,语义) 例如: select * from blog where id=#{id}
- SQL 执行(将sql发送到数据库端执行)
- SQL 结果映射(例如将ResultSet中的数据存到map)
日志配置应用
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:
1)SLF4J(日志框架标准,类似JDBC标准)
2)Apache Commons Logging
3)Log4j 2 (是log4j的升级版,配置文件升级为xml格式了)
4)Log4j(日志处理库,配置文件格式为.properties)
5)JDK logging
项目中mybatis通常会借助第三方日志库进行日志的处理,例如log4j.
Mybatis缓存:
- 缓存是什么? 内存中的一个对象(容器).
- 缓存对象的作用?提高程序的性能(最主要的的是访问效率)
- MyBatis 中缓存概述?
MyBatis 框架中提供了非常强大的缓存特性来提高查询性能,通常可将其分为一级缓存(SqlSession级别)和二级缓存(SqlSessionFactory级别)。
一级缓存应用说明:
- 默认是开启的(也是应用最多的一种)
- 其类型为SESSION或STATEMENT两种,默认是SESSION类型
- )缓存对象的生命周期不同(例如session类型的一级缓存,session关闭就失效.)
- )其类型的配置可在配置文件中通过这个localCacheScope属性进行配置。
- 一级缓存在每次更新(同一个session)后都会失效。
- 一级缓存在事务并发执行时可能会出现脏读,但相对于STATEMENT效率会高一些。
二级缓存应用:
MyBatis 二级缓存默认是没有开启的,需要在映射文件中加上<Cache/>元素
1) eviction 表示回收策略(例如LRU,FIFO等,默认为LRU)
2) flushInterval 表示刷新间隔
3) size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。
4) readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。可读写的缓存会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。
readOnly说明:
1)readOnly的值为true时,缓存中保存的是堆内存中对象的引用.每次从缓存取数据都是获得的同一个对象.readOnly为false时,首先会将查询到的对象,拷贝到缓存一份(对象需要实现序列化接口),然后从缓存取数据每次都是执行对象的拷贝.
2)MyBatis 中的二级缓存同样存在脏读问题,尤其是在分布式应用场景中表现出的问题就会更加突出。
mybatis中的高级映射
MyBatis中的高级映射一般要借助select元素中的resultMap属性进行实现,通过此属性配置实现一对一,一对多等关系映射的实现.
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
说说不同点吧,resultType 和restltMap
restulyType:
1.对应的是java对象中的属性,大小写不敏感,
2.如果放的是java.lang.Map,key是查询语句的列名,value是查询的值,大小写敏感
3.resultMap:指的是定义好了的id的,是定义好的resyltType的引用
注意:用resultType的时候,要保证结果集的列名与java对象的属性相同,而resultMap则不用,而且resultMap可以用typeHander转换
4.type:java 对象对应的类,id:在本文件要唯一column :数据库的列名或别名,property:对应java对象的属性,jdbcType:java.sql.Types
查询语句中,resultMap属性指向上面那个属性的标签的id
parameterType:参数类型,只能传一个参数,如果有多个参数要封装,如封装成一个类,要写包名加类名,基本数据类型则可以省略
5.一对1、一对多时,若有表的字段相同必须写别名,不然查询结果无法正常映射,出现某属性为空或者返回的结果与想象中的不同,而这往往是没有报错的。
6.若有意外中的错误,反复检查以上几点,和认真核查自己的sql语句,mapper.xml文件是否配置正确。
以上仅是一些总结,也有也是借鉴了他人的帖子,希望大家多多指导!