SSM-Mybatis-SqlSessionFactory
通过Mybatis提供的构造器,SqlSessionFactoryBuilder。它提供一个类org.apache.ibatis.session.Configuration作为引导,采用分步Builder模式,具体分步在Configuration类中完成。
形成SqlSessionFacoty的方式
- 可以通过配置文件的方法(推荐)
- 通过代码的方式
通过上面两种方式,Mybatis会读取配置文件,通过Configuration类对象构建整个Mybats上下文
注意:SqlSessionFactory只是一个接口,他有两个实现类,SqlSessionManager和DefaultSqlSessionFactory一般使用后者去实现,前者使用在多线程环境中
SqlSessionFactory的唯一作用就是生产SqlSession对象
使用XML构建SqlSessionFactory
Mybatis中的XML分为两类:
- 基础配置文件:通常只用一个,主要是配置一些最基本的上下文参数和运行环境。
- 映射文件:可以配置映射关系,SQL,参数等信息
Mybatis基本配置文件:
<?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 type="com.abc.A" alias="role"></typeAlias>
</typeAliases>
<!--数据库环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--映射文件-->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
元素定义一个别名role 他代表了type中内容的类,这样定义后可以,在mybatis上下文中使用别名去代替全限定类名
这里描述的是数据库的配置环境。里面的元素是配置事务管理器,然后采用元素配置数据库,POOLED代表采用Mybatis内部提供连接池方式。
元素代表引入的那些映射器
下列通过简单的代码生产SqlSessionFacoty
SqlSessionFactory sqlSessionFactory=null;
String resource="mybatis-config.xml";
InputStream inputStream;
try{
//读取mybatis-config.xml
inputStream= Resources.getResourceAsStream(resource);
//通过SqlSessionFactoryBuilder的build方法创建SqlSessionFactory
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}catch(IOException e){
System.out.println(e);
}
采用XML的方式方便日后维护和修改,避免了重新编译代码。
使用代码创建SqlSessionFactory
//数据库连接池信息
PooledDataSource pooledDataSource=new PooledDataSource();
pooledDataSource.setDriver("com.mysql.jdbc.Driver");
pooledDataSource.setUsername("root");
pooledDataSource.setPassword("123456789");
pooledDataSource.setUrl("jdbc:mysql://localhost:3306/ssm");
pooledDataSource.setDefaultAutoCommit(false);
//采用mybatis的JDBC事务方式
TransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
Environment development = new Environment("development", jdbcTransactionFactory, pooledDataSource);
//创建Configuration
Configuration configuration=new Configuration(development);
//注册一个Mybatis上下文别名
configuration.getTypeAliasRegistry().registerAlias("role", Role.class);
//加入一个映射器
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
return sqlSessionFactory;
这种写法不推荐,和XML写的功能一样,这种写法的缺点:如果发生系统修改,需要重新编译才能运行
SqlSession
在Mybatis中,SqlSession是其核心接口。在Mybatis中有两个实现类,DefaultSqlSession和SqlSessionManager,其中前者是单线程使用,后者则是多线程环境中使用。
SqlSession代表一个连接资源的启用,他的作用有三个:
- 获取Mapper接口
- 发送SQL给数据库
- 控制数据库事务
SqlSession简单创建方式:
SqlSession sqlSession=SqlSessionFactory.openSession();
SqlSession接口中有很多方法,可以直接发送SQL
//定义SqlSession
SqlSession sqlSession=null;
try{
//打开SqlSession会话
sqlSession=SqlSessionFactory.openSession();
// some code..
//提交事务
sqlSession.commit();
}catch(Exception ex){
//事务回滚
sqlSession.rollback();
}finally{
//确保资源顺利关闭
if(sqlSession!=null)
sqlSession.close();
}
}
这里使用了commit提交事务和rollback回滚事务。finally语句块中为了不让整个系统陷入瘫痪的可能,所以需要确保资源的关闭。