前言
MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis;首先他是一个很好的很灵活的ORM框架,那么不论多好,根本都是操作数据库数据,也就是JDBC;那么我们先回忆一下JDBC:
JDBC
一、采用JDBC访问数据库的基本步骤:
- 载入JDBC驱动程序:
- 定义连接URL,建立连接: jdbc:子协议,并且载入服务器的主机名、端口、数据库名(或引用);显示调用commit()
- 创建Statement对象:每个Statement对象只能打开一个ResultSet对象
- 执行查询或更新:A.查询操作:executeQuery(SQL语句) B.维护操作:executeUpdate(SQL语句)
C.批处理操作:executeBat - 结果处理:ResultSet中行的第一列索引为1,而非0
- 关闭连接:以ResultSet、Statement、Connection的顺序进行
JDBC-Statement(预备语句):分三种:静态sql,预编译,存储过程
PreparedStatement的好处:防止sql注入
- 依赖于服务器对预编译查询的支持,以及驱动程序处理原始查询的效率,预备语句在性能上的优势可能有很大的不同。
- 安全是预备语句的另外一个特点,我们推荐在通过HTML表单接受用户输入,然后对数据库进行更新时,一定要使用预备语句或存储过程。
- 预备语句还能够正确地处理嵌入在字符串中的引号以及处理非字符数据(比如向数据库发送序列化后的对象)
CallableStatement(存储过程语句)的优缺点:
- 优点:语法错误可以在编译时找出来,而非在运行期间;数据库存储过程的运行可能比常规的SQL查询快得多;程序员只需知道输入和输出参数,不需了解表的结构。另外,由于数据库语言能够访问数据库本地的一下儿功能(序列,触发器,多重游标),因此用它来编写存储过程可能要比使用Java编程语言要简易一些。
- 缺点:存储过程的商业逻辑在数据库服务器上运行,而非客户机或Web服务器。而行业的发展趋势是尽可能多地将商业逻辑移出数据库,将它们放在JavaBean组件(或者在大型的系统中,EnterPrise JavaBean组件)中,在Web构架上采用这种方式的主要动机是:数据库访问和网络I/O常常是性能的瓶颈。
Mybatis
那么对应着JDBC的步骤来讲一下mybatis的设计实现过程,我理解他是一个sql驱动的框架,步骤:
- sqlSession:最重要的接口入口
- Executor:注意这个jdbc中的执行
- StatementHandler:创建各种Statement对象
- parameterHandler:处理参数
- ResultSetHandler:处理结果,对应JDBC的ResultSet;
- config配置文件:mybatis的一大特色,不仅配置数据库连接等相关配置,一些属性的配置,以及一些插件的配置;mybatis最好的特点就是可以自己写一些plugin插件,比如我们都用过的分页等
- Intercepter:拦截器,做个性话处理
对于plugin插件的实现原理主要是通过生成代理对象(静态代理,动态代理),配合Intercepter一同来处理,也就是我们可以针对上面的前五个过程之间错个性话的插件处理,做自己需要的操作;比如分页就可以有两种方式:一种在resultSet部分处理,但这个方式显然不好,不能很好的优化执行sql的性能,只是通过内存对查询结果进行分页;那么比较好的就是在StatementHandler缓解做处理进行分页,也就是查询sql之前。
根据步骤在ResultHandler缓解处理后在返回Executor然后返回给客户端的调用接口。
大家可能看到mybatis的步骤过程貌似是和jdbc反着的,为什么不是先Statement,然后Executor呢;这块其实是mybatis设计的一个思想,采用设计模式,这里的Executor不是执行器,而是一个参数给Statement;Mybatis对外统一提供了一个操作接口类Executor,提供的接口方法有update、query、flushStatements、commit、rollback等接口函数。
关于SqlSession主要有三个:Default,Manager,Template。
总结
至此,就是Mybatis的大体设计思想,同学们可以自己跟着步骤从sqlSession开始研究学习。