两种方式创建SqlSessionFactory

网上得来终觉浅,绝知此事要躬行。

前提:已经完成了MyBatis环境的搭建!!!

一、使用配置文件创建SqlSessionFactory
两种方式创建SqlSessionFactory_第1张图片
开工喽----------------------------------------------------------------------------------------------------------------------------

package com.littlestar.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

/**
 * 获取sqlsession工具类
 */
public class SqlSessionFactoryUtil2 {

	// 获取class对象
	private final static Class<SqlSessionFactoryUtil2> LOCK = SqlSessionFactoryUtil2.class;

	//首先创建静态成员变量sqlSessionFactory
	private static SqlSessionFactory sqlSessionFactory = null;

	//构造函数私有
	private SqlSessionFactoryUtil2() {
	}

	public static SqlSessionFactory getSqlSessionFactory() {
		synchronized (LOCK) {
			if (sqlSessionFactory != null) {
				return sqlSessionFactory;
			}
			String resource = "mybatis-config.xml";
			try {
				InputStream inputStream = Resources.getResourceAsStream(resource);
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			} catch (IOException e) {
				e.printStackTrace();
				return null;
			}
			return sqlSessionFactory;
		}
	}

}

构造方法中加入了private关键字,使得其他代码不能通过new的方式来创建它。而加入Syschronized 关键字加锁,主要是为了防止在多线程的环境下多次实例化SqlSessionFactory对象,从而保证SqlSessionFactory的唯一性。

这种线程安全模型有个名词叫懒汉式。更多单例以及线程安全模型请看-> https://blog.csdn.net/cselmu9/article/details/51366946

二、使用代码创建SqlSessionFactory

不是特别建议用代码来实现(因为耦合度太高了),但是学习的时候还是需要学习一下的。

// 数据库连接池信息
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword ("123456");
dataSource.setUrl("jdbc:mysql://localhost:3306/inventory");
dataSource.setDefeultAutoCommit(false);
// 采用 MyBatis 的 JDBC 事务方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment ("development", transactionFactory, dataSource);
// 创建 Configuration 对象
Configuration configuration = new Configuration(environment);
// 注册一个 MyBatis 上下文别名
configuration.getTypeAliasRegistry().registerAlias("emp", Emp.class);
// 加入一个映射器
configuration.addMapper(EmpMapper.class);
//使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory
SqlSessionFactory SqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
return SqlSessionFactory;

这段代码代替的是getSqlSessionFactory()里面的哪一段代码,稍微聪明一点的应该就知道这段其实相当于就是解析xml文档并完成各个对象创建和值的注入。 所以,通过代码生成的这种方式,其实就是框架底层做的事,只不过这些值都是可配置的。

下一节:SqlSession和Mapper的使用

你可能感兴趣的:(#,Mybatis,MyBatis)