MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录。
1、简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件和配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
2、灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
3、解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
4、提供映射标签,支持对象与数据库的ORM字段关系映射
5、提供对象关系映射标签,支持对象关系组建维护
6、提供xml标签,支持编写动态sql。
org.apache.ibatis.logging
org.apache.ibatis.logging.commons
org.apache.ibatis.logging.jdbc
org.apache.ibatis.logging.jdk14
org.apache.ibatis.logging.log4j
org.apache.ibatis.logging.log4j2
org.apache.ibatis.logging.nologging
org.apache.ibatis.logging.slf4j
org.apache.ibatis.logging.stdout
org.apache.ibatis.exceptions
org.apache.ibatis.cache
org.apache.ibatis.cache.decorators
org.apache.ibatis.cache.impl
org.apache.ibatis.parsing
xml解析,${} 格式的字符串解析
org.apache.ibatis.type
实现java和jdbc中的类型之间转换
org.apache.ibatis.io
通过类加载器在jar包中寻找一个package下满足条件(比如某个接口的子类)的所有类
org.apache.ibatis.reflection
org.apache.ibatis.reflection.factory
org.apache.ibatis.reflection.invoker
org.apache.ibatis.reflection.property
org.apache.ibatis.reflection.wrapper
可以参考MetaObjectTest来跟踪调试,基本上用到了reflection包下所有的类
org.apache.ibatis.datasource
org.apache.ibatis.datasource.jndi
org.apache.ibatis.datasource.pooled
org.apache.ibatis.datasource.unpooled
org.apache.ibatis.transaction
org.apache.ibatis.transaction.jdbc
org.apache.ibatis.transaction.managed
org.apache.ibatis.session
org.apache.ibatis.session.defaults
org.apache.ibatis.jdbc
org.apache.ibatis.builder
org.apache.ibatis.builder.annotation
org.apache.ibatis.builder.xml
org.apache.ibatis.mapping
org.apache.ibatis.scripting
org.apache.ibatis.scripting.defaults
org.apache.ibatis.scripting.xmltags
org.apache.ibatis.annotations
org.apache.ibatis.binding
org.apache.ibatis.executor
org.apache.ibatis.executor.keygen
org.apache.ibatis.executor.loader
org.apache.ibatis.executor.loader.cglib
org.apache.ibatis.executor.loader.javassist
org.apache.ibatis.executor.parameter
org.apache.ibatis.executor.result
org.apache.ibatis.executor.resultset
org.apache.ibatis.executor.statement
org.apache.ibatis.plugin
在了解了MyBatis的设计原理及架构之后,我的简化版MyBatis初现端倪。总结之后如下图:
MyConfiguration负责与人交互。当读取xml文件后,会将属性和连接数据库的操作封装在MyConfiguration对象中供后面的组件调用。我打算将使用dom4j来读取xml文件,因为它具有性能优异和非常方便使用的特点。
一个Session仅拥有一个对应的数据库连接。类似于一个前段请求Request,它可以直接调用execute来执行SQL语句。从流程图中可以看出,MySqlSession的成员变量中必须得有MyExecutor和MyConfiguration来集中做调配。MySqlSession中会有一个getMapper方法,使用动态代理生成对象后,就可以进行对数据库的操作。
Executor是一个执行器,负责SQL语句的生成和查询缓存的维护,也就是JDBC的代码将在这里构建。
要保证只对指定的接口生成一个对象,执行它的时候运行sql,而接口无法直接调用方法,所以这里使用动态代理生成对象,在执行时回到MySqlSession中调用对应的方法,最终由MyExecutor做JDBC对对应的方法调用执行。这样设计是为了单一职责,可扩展性更强。
JDK 8 + MySQL 8。
这里有个坑,当时装数据库时直接官网下的最新版,在JDBC连接数据库时配置的参数需要修改,不然会报各种奇奇怪怪的错误,还是推荐大家使用MySQL 5版本。
思路捋完了,该上代码了…我将按照我编写时的思路顺序一一阐述。由于我在项目里集成了日志,便于我们直观的查看各个类之间的调用顺序。