1. 创建 SqlSessionFactory 和 SqlSession 对象
MyBatis 框架的核心是 SqlSessionFactoryBuilder、SqlSessionFactory 和 SqlSession 对象,这三者之间的创建关系如下:
SqlSessionFactoryBuilder 创建出 SqlSessionFactory,SqlSessionFactory 创建出 SqlSession。
使用 SqlSessionFactoryBuilder 类创建 SqlSessionFactory 对象的方式可以来自于一个 XML 配置文件,还可以来自于一个实例化的 Configuration 对象,并且使用 XML 方式创建 SqlSessionFactory 对象在使用上比较广泛。
2. XML 配置文件模板
使用 SqlSessionFactoryBuilder 类创建 SqlSessionFactory 对象可以来自于一个 XML 配置文件:
Mybatis---详解Mybatis-config.xml配置文件.CSDN
注意模板中标记的顺序不能改变,不然会出现异常。
3. 使用 XML 配置文件创建 SqlSessionFactory
SqlSessionFactory 对象存储 MyBatis 环境的全局信息。
创建名称为 MyBatis1 的项目。
根据 XML 配置文件来创建 SqlSessionFactory 对象的核心代码,
public class Test1 {
public static void main(String[] args) {
try {
String resouce = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
System.out.println(SqlSessionFactory);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在代码中使用 Resources 类将 mybatis-config.xml 文件转换成 InputStream 输入流,再把 InputStream 输入流传入 SqlSessionFactoryBuilder 类的 build() 方法来创建 SqlSessionFactory 对象。
类 SqlSessionFactoryBuilder 的主要内容就是根据 mybatis-config.xml 配置文件中的信息来创建 SqlSessionFactory 对象。
配置文件 mybatis-config.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>
<!-- 在配置文件中可以有多个<environment id="development">配置-->
<!-- 目的就是在配置文件中保存多个数据库的连接信息-->
<!-- 而使用<environment default="development">代码的作用就是-->
<!-- 默认使用 id 为 development 的数据库连接-->
<environments default="development">
<!-- 定义 id 为 development 的数据库连接-->
<environment id="development">
<!-- 定义数据库的事务要由程序员的代码进行控制-->
<transactionManager type="JDBC"/>
<!-- 使用MyBatis自己提供的连接池来处理 Connection 对象-->
<dataSource type="POOLED">
<!-- 连接数据库的 4 大变量-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
配置文件 mybatis-config.xml 的主要作用就是定义如何连接数据库,包含连接数据库所用到的 username、password 及 url 等参数,但在本实验中,文件 mybatis-config.xml 里并没有实质的属性值,而是使用 ${xxx} 替代。这是因为在获取 SqlSessionFactory 工厂对象时,不需要提供这些参数。
4. 创建 SqlSession 对象
从数据库执行增加、删除、更新和查询操作是需要使用 SqlSession 对象的。而使用 SqlSessionFactory 可以创建 SqlSession 对象。
示例代码如下:
public class Test2 {
public static void main(String[] args) {
try {
String resouce = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
System.out.println(SqlSessionFactory);
SqlSesion sqlSesion = sqlSessionFactory.openSession();
System.out.println(sqlSesion);
sqlSesion.commit();
sqlSesion.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
调用 SqlSessionFactory 对象的 openSession() 方法来创建 SqlSession 对象。
获得 SqlSession 对象并调用下面的 4 种方法可以对数据库进行操作:
sqlSession.insert(arg0); //插入操作
sqlSession.delete(arg1); //删除操作
sqlSession.update(arg2); //更新操作
sqlSession.selectList(arg3); //查询操作
5. MyBatis 核心对象的生命周期与封装
对象的生命周期也就是对象从创建到销毁的过程,但此过程中,如果实现的代码质量不太优质,那么很容易造成程序上的错误或效率的降低。
(1)SqlSessionFactoryBuilder 对象可以被 JVM 所实例化,使用或者销毁。一旦使用了 SqlSessionFactoryBuilder 对象创建了 SqlSessionFactory 后,SqlSessionFactoryBuilder 类就不需要存在了,也就是不需要保持此对象的状态,可以任由 JVM 销毁,因此 SqlSessionFactoryBuilder 对象的最佳使用范围是在方法之内,也就是说,可以在方法内部声明 SqlSessionFactoryBuilder 对象来创建 SqlSessionFactory 对象。
(2)SqlSessionFactory 对象是由 SqlSessionFactoryBuilder 对象创建而来的。一旦 SqlSessionFactory 类实例被创建,该实例在应用程序执行期间应该始终存在,根本不需要每一次操作数据库时都重新创建它。因为创建 SqlSessionFactory 对象比较耗时,所以应用它的最佳方式就是写一个单例模式,或使用 Spring 框架来实现单例模式以对 SqlSessionFactory 对象进行有效的管理。SqlSessionFactory 对象是线程安全的。
(3)SqlSession 对象是由 SqlSessionFactory 类创建而来,需要注意的是,每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能共享使用,因为它是线程不安全的,所以千万不要在 Servlet 中声明该对象的一个实例变量。因为 Servlet 是单例的,声明成实例变量会造成线程的安全问题,也绝对不能将 SqlSession 对象放在一个类的静态字段甚至是实例字段中,还不可以将 SqlSession 对象放在 HttpSession 会话或 ServletContext 上下文中。在接收到了 HTTP 请求后可以打开一个 SqlSession 对象操作数据库,在响应之前需要关闭 SqlSession。关闭 SqlSession 很重要,在实际操作中应使用 finally 块来关闭它。