SqlSessionFactory 如何使用MyBatis,首先就是xml或java代码生成SqlSessionFactory,MyBatis给咱们提供了SqlSessionFactoryBuilder(构造器),org.apache.ibatis.session.Configuration这个类做为引导,使用的是Builder模式。java
在MyBatis中有两种形式生成SqlSessionFactory,一种是XML,一种是java代码实现。这里小编推荐使用XML的形式,也是大多数企业开发的选择。配置XML或java代码后,MyBatis会读取配置文件,经过Configuration类对象构建MyBatis的上下文。spring
须要提醒你们的是SqlSessionFactory是一个接口,而它的实现类为SqlSessionManager和DefaultSqlSessionFactory两个类。sql
通常用DefaultSqlSessionFactory,DefaultSqlSessionFactory在多线程中,而它的具体实现依靠DefaultSqlSessionFactory。数据库
使用XML构建SqlSessionFactory 主要分为两类:一类是基础配置文件,一般只有一个,主要配置最基础的上下文参数和运行环境:另外一类为映射文件,主要配置映射关系、SQL、参数等。apache
<mappers>
<!-- 注册userMapper.xml文件,
userMapper.xml位于com.feiyu.mapping这个包下,因此resource写成com/feiyu/mapping/userMapper.xml-->
<mapper resource="com/feiyu/mapping/userMapper.xml"/>
</mappers>
复制代码
元素:定义一个别名,表明com.feiyu.POJO.User这个类,在上下文中科院代替全限定名使用。编程
元素:默认为开发者,里面的是配置事务管理器,采用JDBC管理器方式,使用 配置数据库,type="POOLED"为MyBatis内部提供的链接池方式。缓存
//mybatis的配置文件
String resource = "mybatis-config.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream inputStream = Test1.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//建立能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
/*
* 映射sql的标识字符串,
* com.feiyu.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
* getUser是select标签的id属性值,经过select标签的id属性值就能够找到要执行的SQL
*/
String statement = "com.feiyu.mapping.userMapper.getUser";//映射sql的标识字符串
//执行查询返回一个惟一user对象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
复制代码
读取mybatis-config.xml,而后经过SqlSessionFactoryBuilder的Builber方法建立SqlSessionFactory。session
SqlSession 做用至关于一个JDBC中的Connection对象,表明一个链接资源的启用。有如下三个做用:mybatis
SqlSession sqlSession = SqlSessionFactory.openSession();多线程
下面咱们来看看SqlSession在操做事务时的伪代码:
//定义SqlSession SqlSession sqlSession = null; try{ //打开SqlSession会话 sqlSession = SqlSessionFactory.openSession(); sqlSession.commit();//提交事务 }catch (Exception ex) { sqlSession.rollback();//回滚事务 }finally { //在finally语句中确保资源被顺利关闭 if (sqlSession != null) { sqlSession.close(); } }
使用commit方法提交事务,和使用rollback方法回滚事务。
注意:数据库的链接资源使用后要及时的关闭它,若是不及时关闭,数据库的链接资源就会很快被消耗光,整个系统将陷入瘫痪状态,因此这里使用finally语句使其顺利关闭。
映射器 在MyBatis中,映射器尤其的重要,也是最复杂的组件,它是由一个接口和对应的XML文件(或@注解)构成。
有如下4个做用:
描述映射规则 配置缓存 提供SQL语句,配置SQL参数类型,返回类型,缓存刷新等 提供动态SQL 本文只实现XML文件形式映射器方式,也是大多数开发的选择,下面首先定义一个POJO:
package com.feiyu.POJO; /**
@author gacl
users表所对应的实体类 */ public class User { //实体类的属性和表的字段名称一一对应 private int id; private String name; private int age;
public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
映射器接口
package com.feiyu.mapping;
import com.feiyu.POJO.User;
public interface UserMapper { public User getUser(int id); }
引入XML文件
元素:其中的namespace对应的是一个接口的全限定名,这样MyBatis就能够根据上下文找到对应的接口