文章目录
JDBC连接数据库的问题
1.代码重复
2.结果集处理复杂,需要手动处理,对应表的字段和类型
3连接管理复杂 ,需要手动打开和关闭连接
4.sql写到了业务逻辑里面 耦合度太高 不利于管理
mybatis特性
- 使用连接池对连接进行管理
- sql和代码分离,集中管理
- 参数映射和动态sql
- 结果集映射
- 缓存管理
- 重复sql的提取
- 插件机制
工作流程图
- 解析配置文件
- 创建工厂类
- 创建会话
- 会话操作数据库
核心对象的生命周期
在编程式使用的这个 demo 里面,我们看到了 MyBatis 里面的几个核心对象:SqlSessionFactoryBuiler、SqlSessionFactory、SqlSession 和 Mapper 对象。这几个核心对象在 MyBatis 的整个工作流程里面的不同环节发挥作用。如果说我们不用容器,自己去管理这些对象的话,我们必须思考一个问题:什么时候创建和销毁这些对象?
在一些分布式的应用里面,多线程高并发的场景中,如果要写出高效的代码,必须了解这四个对象的生命周期。这四个对象的声明周期的描述在官网上面也可以找到。
http://www.mybatis.org/mybatis-3/zh/getting-started.html
我们从每个对象的作用的角度来理解一下,只有理解了它们是干什么的,才知道什么时候应该创建,什么时候应该销毁。
1)SqlSessionFactoryBuiler
首 先 是 SqlSessionFactoryBuiler 。 它 是 用 来 构 建 SqlSessionFactory 的 , 而qlSessionFactory 只需要一个,所以只要构建了这一个 SqlSessionFactory,它的使命就完成了,也就没有存在的意义了。所以它的生命周期只存在于方法的局部。
2)SqlSessionFactory
SqlSessionFactory 是用来创建 SqlSession 的,每次应用程序访问数据库,都需要创建一个会话。因为我们一直有创建会话的需要,所以 SqlSessionFactory 应该存在于应用的整个生命周期中(作用域是应用作用域)。创建 SqlSession 只需要一个实例来做这件事就行了,否则会产生很多的混乱,和浪费资源。所以我们要采用单例模式。
3)SqlSession
SqlSession 是一个会话,因为它不是线程安全的,不能在线程间共享。所以我们在请求开始的时候创建一个 SqlSession 对象,在请求结束或者说方法执行完毕的时候要及时关闭它(一次请求或者操作中)。
4)Mapper
Mapper(实际上是一个代理对象)是从 SqlSession 中获取的。BlogMapper mapper = session.getMapper(BlogMapper.class);
它的作用是发送 SQL 来操作数据库的数据。它应该在一个 SqlSession 事务方法之内。
总结: