findAll的分析
- mybatis在使用代理Dao的方式实现增删改查时做了什么事呢?
- 创建代理对象
- 在代理对象中调用selectList方法
-
读取配置文件:用到的技术就是解析xml的技术(此处用dom4j解析xml技术)
- 配置连接数据库的信息
- 映射配置信息(xml配置文件的位置)
- 得到PrepareStatement语句的配置信息(mapper),此配置中还有封装的实体类全限定类名
-
selectList方法
- 根据配置文件的信息创建Connection对象,注册驱动,获取连接
- 获取预处理对象PrepareStatement,此时需要SQL语句,conn.prepareStatement(sql);(来自mapper)
- 执行查询 ResultSet resultSet = prepareStatement.executeQuery();
- 遍历结果集用于封装
List<E> list = new ArrayList(); while(resultSet.next()) { E element = (E)Class.forName(配置的全限定类名).newInstance(); //进行封装,把每个rs的内容都封装到element中 //反射 //实体类属性和表中的列名是一致的 //于是就可以把表的列名看成是实体类的属性名称 //使用反射的方式来根据名称获取每个属性,并把值赋进去 //把element加入到list中 list.add(element); }
- 返回list
-
想让上面的selectList方法执行,需要提供两个信息
- 连接信息
- 映射信息
- 包括两部分(执行的sql语句 + 封装结果的实体类全限定类名),把这两个信息组合起来定义成一个对象
- 即 String(com.itheima.dao.IUserDao.findAll)
- Mapper对象(String domainClassPath & String sql)
自定义Mybatis的分析
//根据dao接口字节码创建dao的代理对象
public <T> T getMapper(Class <T> daoInterfaceClass)
{
/**
类加载器:它使用的和被代理对象是相同的类加载器
代理对象要实现的接口:和被代理对象实现相同的接口
如何代理:它就是增强的方法,我们需要自己来提供
此处是一个InvocationHandler的接口,我们需要写一个该接口的实现类,在实现类中调用selectList方法
*/
Proxy.newProxyInstance(类加载气息,代理对象要实现的接口字节码数,如何代理);
}
自定义mybatis能通过入门案例看到的类
+ class Resource
+ SqlSessionFactoryBuilder
+ interface SqlSessionFactory
+ interface SqlSession