Mybatis执行过程简单分析

public static void main(String[] args) throws IOException {

/**
 * 步骤分析:
 *  第一步:读取配置文件(此时读取的是主配置文件SqlMapConfig.xml,它里面指定了映射配置文件位置)
 *  第二步:创建SqlSessionFactory对象(它是一个工厂对象,通过类名就可以得知,它是生产SqlSession)
 *  第三步:使用SqlSession对象,创建一个IUserDao接口的代理实现类。
 *  第四步:使用代理实现类对象,调用findAll方法实现查询所有
 *  第五步:释放资源
 **/

// 读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

// 创建SQLSessionFactory工厂的构建对象
/**
 *  定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
 *  为什么使用工厂模式:
 *  1、一个调用者想创建一个对象,只要知道其名称就可以了。
 *  2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
 *  3、屏蔽产品的具体实现,调用者只关心产品的接口。
 *  理解:您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现
 **/

// SqlSessionFactoryBuilder:负责构建SqlSessionFactory,并且提供了多个build的重载方法
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

// 创建创建SqlSessionFactory 它是一个创建SqlSession的工厂 是一个接口
SqlSessionFactory factory = builder.build(in);

// 使用工厂生产一个SqlSession
// SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection.
// 它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象.
// SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,
// 可以用SqlSession实例来直接执行被映射的SQL语句.每个线程都应该有它自己的SqlSession实例.
// SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,
// 绝对不能将SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中.
// 也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中.
// 使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它.

SqlSession session = factory.openSession();

// 使用SqlSession创建一个dao接口的代理实现类
// SqlSession.getMapper()就是绕一大圈去动态代理一个对象。这个对象根据返回类型和参数类型,最后用SqlSession的方法。
IUserDao proxyUserDao = session.getMapper(IUserDao.class);
// 使用代理dao调用方法
List<User> all = proxyUserDao.findAll();
for (User user : all) {
    System.out.println(user);
}
// 释放资源
session.close();

}

Last modification:July 29th, 2019 at 06:59 pm