构建SqlSessionFactory
每个mybatis应用都是以SqlSessionFactory的实例为中心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。以下是SqlSessionFactory的源码:
我们可以看到,SqlSessionFactory是一个工厂接口,而不是一个实现类。它的任务就是创建SqlSession。SqlSession类似于一个JDBC的Connection对象。
Mybatis提供了两种模式去创建SqlSessionFactory:一种是XML配置的方式;另一种是代码的方式。此处推荐用XML配置的方式,因为这种方式可以避免硬编码,也方便日后配置人员的修改,避免重复编译代码。
Configuration:Mybatis中的Configuration类,将存在于整个Mybatis应用的生命周期中,以便重复读取和运用。我们可以解析一次配置的XML文件保存到Configuration类对象中,方便我们从这个对象中读取配置信息。性能高,单例占用空间小,基本不占用存储空间,而且还可以反复使用。Configuration类对象保存着我们配置在MyBatis中的信息。
SqlSession的实现类:分别是DefaultSessionFactory和SqlSessionManager。
他们之间的关系图是:
1、 使用XML方式构建
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 定义别名 --> <typeAliases> <typeAlias alias="user" type="com.entity.User"/> </typeAliases> <!-- 定义数据库信息,默认使用development数据库构建环境 --> <environments default="development"> <environment id="development"> <!-- 采用jdbc事务管理 --> <transactionManager type="JDBC"/> <!-- 配置数据库链接信息 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value=""/> </dataSource> </environment> </environments> <!-- 定义映射器 --> <mappers> <!-- 映射到,pojo的映射文件中去,就像是,输入账号密码正确了,就可以开始操纵数据了 --> <mapper resource="com/mapper/userMapper.xml"/> </mappers> </configuration>
上面是一个简易的XML,包含
① 获取数据库连接实例的数据源(DataSource):
<dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value=""/> </dataSource>
② 决定事务范围和控制方式的事务管理器(TransactionManager):
<transactionManager type="JDBC"/>
③ 映射器(SQL Mapper):
<mappers> <mapper resource="com/mapper/userMapper.xml"/> </mappers>
也就是说,①这里配置了一个别名叫“user”,它代表“com.entity.User”;②我们配置了环境内容,它默认使用id是development的环境配置,包含的内容有:采用JDBC的事务管理模式、数据库的连接信息和配置映射器。
这里引入了一个XML,它的作用是提供SQL和SQL对POJO的映射规则定义。Mybatis将解析这个XML,来为我们生成映射器。
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = null; sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
我们创建了一个XML文件输入流,用SqlSessionFactoryBuilder读取XML的信息来创建SqlSessionFactory的对象。
Mybatis的解析程序会将mybaits-config.xml文件配置的信息解析到Configuration类对象里面去,然后利用SqlSessionFactoryBuilder读取这个对象为我们创建SqlSessionFactory。
2、 使用代码方式构建
首先构建Configuration类对象。然后往对象里面注册我们构建SqlSessionFactory所需要的信息即可。
//构建数据连接池 PooledDataSource dataSource = new PooledDataSource(); dataSource.setDriver("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis"); dataSource.setUsername("root"); dataSource.setPassword(""); //构建数据库事务方式 TransactionFactory transactionFactory = new JdbcTransactionFactory(); //创建了数据库运行环境 Environment environment = new Environment("development",transactionFactory,dataSource); //构建Configuration对象 Configuration configuration = new Configuration(environment); //注册一个Mybatis上下文别名 configuration.getTypeAliasRegistry().registerAlias("user",User.class); //加入一个映射器 configuration.addMapper(UserMapper.class); //使用SqlSessionFactoryBuilder构建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); return sqlSessionFactory;
① 初始化了一个数据库连接池。
② 定义了JDBC的数据库事务管理方式。
③ 用数据库连接池和事务管理方式创建了一个数据库运行环境,并命名为development。
④ 创建了一个Configuration类对象,并把数据库运行环境注册给它。
⑤ 注册一个user的别名。
⑥ 加入一个映射器。
⑦ 用SqlSessionFactoryBuilder通过Configuration对象创建SqlSessionFactory。