-
SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)
-
SqlSessionFactory:依靠工厂来生成SqlSession(会话)
-
SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口。
-
SQL Mapper:它是MyBatis新设计的组件,它是由一个java接口和XML文件(或注解)构成的,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。
每个MyBatis的应用都是以SqlSessionFactory的实例为中心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。但是需要注意SqlSessionFactory是一个工厂接口而不是实现类,它的任务是创建SqlSession。SqlSession类似于一个JDBC的Connection对象,MyBatis提供了两种模式去创建SqlSessionFctory:一种是XML配置的方式;另一种是代码的方式。能够使用配置文件的时候,我们尽量要用配置文件。
这里我们的Configuration的类全限定名为org.apache.ibatis.session.Configuration,它在MyBatis中将以一个Configuration类对象的形式存在,而这个对象将存在于整个Mybatis应用的生命期中,以便重复读取和运用。在内存中的数据是计算机系统中读取速度最快的,我们可以解析一次配置的XML文件保存到Configuration类对象中,方便我们从这个对象中获取配置信息,性能高。单例占用空间小,基本不占用存储空间,而且可以反复使用。Configuration类对象保存着我们配置在MyBatis的信息。在MyBatis中提供了两个SqlSessionFactory的实现类,DefaultSqlSessionFactory和SqlSessionManager.不过SqlSessionManager目前还没有使用,MyBatis中目前使用的是DefaultSqlSessionFactory.
1.1 使用XML方式创建
如下我们配置一个简单的XML,包含获取数据库连接实例的数据源(DataSource)、决定事务范围和控制方式的事务管理器(TransactionManager)和映射器(SQL Mapper).
<?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"> <!--通过这个配置文件,完成mybatis与数据库的连接 --> <configuration> <!-- 定义数据库信息,默认使用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="learn" /> </dataSource> </environment> </environments> <!-- 定义映射器 --> <mappers> <mapper resource="com\slp\dao\mapping\Role.xml" /> </mappers> </configuration>
使用配置文件创建SqlSessionFactory:
private static SqlSessionFactory sqlSessionFactory = null; public static SqlSessionFactory getSqlSessionFactory(){ InputStream inputStream = null; if(sqlSessionFactory == null){ try { String resource = "mybatis_config.xml"; sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource)); return sqlSessionFactory; } catch (IOException e) { e.printStackTrace(); } } return sqlSessionFactory; }
1.2使用代码方式创建
package com.slp; import org.apache.ibatis.datasource.pooled.PooledDataSource; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; public class CodeSqlSessionFactory { public SqlSessionFactory getSqlSessionFactory(){ //构建数据库连接池 PooledDataSource dataSource = new PooledDataSource(); dataSource.setDriver("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis"); dataSource.setUsername("root"); dataSource.setPassword("123456"); //构建数据库事务方式 TransactionFactory transactionFactory = new JdbcTransactionFactory(); //创建了数据库运行环境 Environment environment = new Environment("development",transactionFactory,dataSource); //构建Configuration对象 Configuration configuration = new Configuration(environment); //注册一个Mybatis上下文别名 configuration.getTypeAliasRegistry().registerAliases("role", Role.class); //加入一个映射器 configuration.addMapper(RoleMapper.class); //使用SqlSessionFactoryBuilder构建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); return sqlSessionFactory; } }
package com.slp; import org.apache.ibatis.session.SqlSession; /** * SqlSession的用途主要有两种 * 1)获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果 * 2)直接通过命名信息去执行SQL返回结果,这是iBatis版本留下的方式,在SqlSession层我们通过update、insert、select、delete等方法,带上SQL的id来操作在XML中配置好的SQL,从而完成我们的工作,与此时同时也支持事务,通过commit rollback方法提交或者回滚事务。 * @author sangliping * */ public class CodeSqlSession { public Role getRole(){ Role role = new Role(); SqlSession sqlSession = null; //打开SqlSession会话 try { CodeSqlSessionFactory sqlSessionFactory = new CodeSqlSessionFactory(); sqlSession = sqlSessionFactory.getSqlSessionFactory().openSession(); /*some code*/ sqlSession.commit(); } catch (Exception e) { sqlSession.rollback(); }finally{ //在finally语句中确保资源被顺利关闭 if(sqlSession!=null){ sqlSession.close(); } } return role; } }