Mybatis框架(一)-- 快速入门 Mybatis框架(二)-- 原理解析 Mybatis框架(三)-- 详细配置参数 Mybatis框架(四)-- 其他配置 Mybatis框架(五)-- 多表查询 Mybatis框架(六)-- 延迟加载 Mybatis框架(七)-- 缓存 Mybatis框架(八)-- 注解开发
1 总配置文件
包含连接数据库的四个参数包含mappers映射配置文件(每个dao层接口的配置文件)的目录2 映射配置文件Mapper
包含对应方法需要用到的Sql语句包含对应方法返回值的全限定类名封装结果的接收JavaBean类型(domain层)解析配置文件,根据配置文件的信息创建Connection对象注册驱动,获得连接。 获取与处理对象PreparedStatement对象 conn.prepareStatement(Sql语句) 执行查询 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集合
return 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 } }