Mybatis(持久层框架)
1. 概述:让用户只关注sql语句本身,使用ORM思想实现结果集的封装。
ORM:Object Relational Mappging(对象关系映射)
2. 环境搭建:
(1):创建maven项目填入mybatis和mysql驱动包的依赖坐标;
(2):创建实体类和dao的接口;
(3):创建mybatis主配置文件:SqlMapConfig.xml;
(4):创建映射配置文件IUserDao.xml。(也可以用注解配置:①在dao接口方法前写注解@Select并指定sql语句;②在主配置文件中用class指定dao接口名)
3. 使用:
(1):读取配置文件(XML解析);
(2):创建SqlSessionFactory(创建者模式);
(3):创建SqlSession对象(使用工厂创建:openSession());
(4):使用SqlSession创建dao接口的代理对象;
(5):使用代理对象执行接口方法(selectList()或其他);
(6):释放资源。
4. selectList方法执行的细节:
(1):selectList("cn.xupt.dao.IUserDao.findAll")方法通过一个字符串类型的Statement:cn.xupt.dao.IUserDao.findAll来找到对应的mapper对象,这个mapper对象中存有两个东西:
①对应方法的要执行的sql语句;
②要封装成的对象的实体类的路径(cn.xupt.domain.User)。
(2):需要给selectList提供的信息有两个:
①数据库的连接信息(那四条:驱动类路径、url、username、password);
②映射信息:其实就是mapper对象,这样的mapper对象有很多个,我们将它们存在一个map集合中,key值就是上面说的那个statement对象:cn.xupt.dao.IUserDao.findAll,value则是(1)中说的。
5. Mybatis的底层实现过程:
(1):主要的类
(2):配置文件:
(3):类的介绍:
①:Resources类是读取主配置文件(SqlMapConfg.xml)流的类;
②:Configuration类存储连接数据库的四个信息以及mappers集合(map集合);
③:Mapper类就对应了上面讲的,里面有sql语句和结果集类型;
④:XMLConfigBuilder类是解析XML文件的工具类,它有如下功能:
——将主配置文件中的连接数据库的四个信息读取出来封装成一个Configuration对象并返回;
——将每个dao配置文件中的每一个mapper对象组装好并加入到mappers中返回。
⑤:SqlSessionFactoryBuilder类用于构建工厂类(需要传入参数);
⑥:SqlSessionFactory工厂接口,这个接口里面定义了这个工厂可以生产的SqlSession对象的方法;
⑦:DefaultSqlSessionFactory类就是工厂类,它需要实现工厂接口,重写接口里的方法,让这个工厂类可以生产DefaultSqlSession这样的对象(若接口中有一个方法,此处就是工厂方法模式,若接口中有多个方法,也就是说一个工厂可以生产多个产品,此处就是抽象工厂模式);
⑧:SqlSession接口是主要和数据库交互的核心接口,它可以创建dao接口的代理对象(MapperProxy);
⑨:MapperProxy是代理对象,它可以在执行dao接口的指定方法的基础上增强它;
⑩:Executer类中有selectList(),就是jdbc访问数据库(传入con和mapper)。
(4):处理过程:
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
①:用io.Resources类读取配置文件流;
②:将流传给SqlSessionFactoryBuilder让它创建一个可以生产DefualtSqlSession的工厂实现类DefualtSqlSessionFactory;
③:工厂类生产一个DefualtSqlSession对象,这个对象又通过getMapper()方法创建了一个IUserDao接口的代理对象;
④:这个代理对象通过mapper的键值寻找到sql语句和结果集类型并传参给selectList()方法让它执行查询;
⑤:释放资源。