源码搭建的话,请参考此链接
Mybatis的基本架构
先说一下JDBC获取数据库数据的流程
1.加载JDBC驱动(以mysql为例子,既是mysql-connector-java) 2.建立数据库连接 3.创建JDBC Statements对象 4.编写SQL 5.执行SQL 6.处理结果 7.释放资源 Connection,Statements,Resultset
使用Mybatis连接数据库,用到的核心组件
- 数据库连接池
- 事务管理
- 缓存机制
- 数据处理层
- 接口层
不管怎么说Mybatis底层也是调用JDBC来完成SQL执行,我们需要关注的类包:
- org.apache.ibatis.datasource (数据源和连接池相关)
- org.apache.ibatis.transaction (事务相关)
- org.apache.ibatis.session (sqlSession)
- org.apache.ibatis.cache(缓存)
- org.apache.ibatis.executor(执行器)
下面来我们看一下demo中的例子
public static void main(String[] args) {
String resource ="mybatis-config.xml"; // 加载mybatis配置文件
InputStream inputStream =null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory =null;
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); // 根据配置文件创建一个sqlSessionFactory工厂。每次new 一个SqlSession
SqlSession sqlSession =null;
try {
sqlSession=sqlSessionFactory.openSession(); // 从池中获取session
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);// 通过session获取Mapper,在Spring中我们通常使用 DI 注入方式得到
Role role=roleMapper.getRole(1L);
log.debug("sql 已经被执行");
System.out.println(role.getId()+":"+role.getRoleName()+":"+role.getNote());
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
}finally {
sqlSession.close();
}
}
需要注意的是SqlSession并没有依赖JDBC的连接Connection而是通过Transaction来关联,更多细节在以后展开,这里先大概描述。
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<!-- <setting name="aggressiveLazyLoading" value="false"/> -->
</settings>
<typeAliases>
<typeAlias alias="role" type="mytest.learn.Role"/>
</typeAliases>
<typeHandlers>
<typeHandler jdbcType="VARCHAR" javaType="string" handler="mytest.learn.MyStringHandler"/>
</typeHandlers>
<!-- 定义数据库的信息,默认使用development数据库构建环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:13306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 定义映射器 -->
<mappers>
<package name="mytest.learn"/>
</mappers>
</configuration>
在代码sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);中解析mybatis-config,涉及到XML解析成对象。具体怎么样解析请看源码,这里不关注其解析过程。
总结
mybatis框架,做的是减少了好多模板代码,节省了维护成本,操作数据库更为简单化,只需要写好对应SQl和Domain对象,即可自动转换成JavaBean,还有N多好处,个人想到既是这些。数据库连接就是通过(以mysql为例子)mysql:// 协议跟Mysql服务器进行通讯的,底层肯定是TCP了。连接池就是保存连接,当应用程序启动的时候会预先连接到Mysql服务器上,存活一些长连接,只要有请求过来直接从池中返回连接,进行交互即可,重用了连接。提高了效率。
PS:此为个人笔记,水平有限,讲解的不是很好,请大家见谅,有不对的地方请多多包涵并指出,感激不尽!有问题随时联系我。