Mybatis框架(一)-- 快速入门
Mybatis框架(二)-- 原理解析
Mybatis框架(三)-- 详细配置参数
Mybatis框架(四)-- 其他配置
Mybatis框架(五)-- 多表查询
Mybatis框架(六)-- 延迟加载
Mybatis框架(七)-- 缓存
Mybatis框架(八)-- 注解开发
文章目录
-
- Mybatis框架所使用的资源
- Mybatis执行原理
- 动态代理过程
Mybatis框架所使用的资源
1 总配置文件
- 包含连接数据库的四个参数
- 包含mappers映射配置文件(每个dao层接口的配置文件)的目录
2 映射配置文件Mapper
- 包含对应方法需要用到的Sql语句
- 包含对应方法返回值的全限定类名封装结果的接收JavaBean类型(domain层)
Mybatis执行原理
- 解析配置文件,根据配置文件的信息创建Connection对象注册驱动,获得连接。
- 获取与处理对象
对象 conn.prepareStatement(Sql语句)PreparedStatement
- 执行查询
ResultSet rs = preparedStatement.executeQuery();
- 遍历结果集,用于封装 (通过返回值的全限定类名)。
通过返回值的全限定类名创建List集合 E为返回值类型
List<E> list = new ArrayList();
while(rs.next()){
通过反射-创建E类型的对象,
E element = (E)Class.forName(返回值的全限定类名).newInstance();
将数据库返回的一条数据封装到element中,并添加到list中
因为我们的实体类E 和 表中的列名是一致的。
于是我们就可以把表的列名看成是实体类的属性名称。
通过反射机制就可以把表中每条数据赋值到E实例对象的对应属性中
list.add(element);
}
反射机制详解
5.返回List集合
动态代理过程
要详细了解Mybatis的实现,请先了解动态代理 – 代理模式
我们在抽象层次上理解动态代理与Mybatis框架的关系:
由于所有的Select语句都是向数据库发送Select语句并返回数据,只有Select语句和用于接收数据的JavaBean不同,使用动态代理对相同动作进行统一封装,不同之处使用动态代理进行增强。
首先定义一个接口里面包含要用到的方法 例如 (非真实代码,仅提供思路)
public interface SelectInterface
{
List<T> select(); //通过sql语句返回数据,sql语句可通过配置文件或注解读取
}
通过动态代理返回实例
SelectInterface SelectProxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), SelectInterface.class, InvocationHandler h);
然后再执行
SelectProxy.select();
即可完成查询
关键的是InvocationHandler h中做了什么
InvocationHandler h InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
1. 根据配置文件的信息注册驱动,获得连接Connection对象。
根据配置文件或注解,获得sql语句
获取预处理对象 PreparedStatement conn.prepareStatement(Sql语句)
执行查询 ResultSet rs = preparedStatement.executeQuery();`
2. 通过 返回值的全限定类名--returnType 或注解Sql语句所绑定的方法,得到返回值类型
遍历结果集,进行封装
(通过反射可以得到返回类型的属性个数fields,再通过属性名与表中列名相同可以一一赋值)
3. 返回结果集合List
}
}