mybatis的工厂模式
// 创建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- SqlSessionFactory:一个用于生产 SqlSession对象的工厂
1.不能自己 new 一个 SqlSession
SqlSession session = new SqlSession() ???
2.一般来说,工厂要定义为全局实例
3.在创建一个工厂时,要指定一些配置文件
- mybatis-config.xml
-mybatis-mapper.xml
注意: MyBatis里指定资源文件里,路径前不加 /
//应该这样写
String resource = "mybatis-config.xml";
//而不是
String resource = "/mybatis-config.xml";
mybatis会话
- SqlSession :代表了对数据库的一次访问 ,相当于 c3p0里的 Connection 对象
打开会话 session = factory.openSession()…
执行SQL session.xxx(…)
执行SQL session.xxx(…)
关闭会话 session.close()
- 会话的使用惯例:
1.在需要的时候就创建一个会话
2.用完了就立即关闭它
以上用法可以参照 MyBatis 的官方文档
- SqlSesion 的一般用法:
第1种写法:try..finally
SqlSession session = sqlSessionFactory.openSession();
try
{
// do work
}
finally
{
session.close();
}
无论 try { } 里有没有出错,总是保证finally{}被执行。这种方式,可以保证session.close() 总是被执行。
第2种写法: try-with-resources(mybatis官方推荐写法)
一般形式:
try ( resource ) {
// do work
}
这种语法自Java 1.7 引入,称为 try-with-resources,一般用于各种资料句柄的自动关闭。要求小括号里的resource对象必须实现了 java.lang. AutoCloseable接口。语法上会保证,在执行完 try { … } 中的语句之后,总是执行resource.close()方法。
package my;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test
{
public static void main(String[] args) throws Exception
{
// 创建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 使用简化的try-with-resources语法,等效于try..finally语句
try (SqlSession session = sqlSessionFactory.openSession())
{
Student row = session.selectOne("af.test.getStudent", 20190001);
if (row != null)
System.out.println(row.id + "," + row.name + "," + row.sex + "," + row.cellphone);
}
System.out.println("Exit");
}
}
在小括号里获取了一个 SqlSession 对象,而SqlSession类是实现了AutoCloseable接口的,所以语法上符合try-with-resource的规定。它会保证session.close()总是被执行,和try..finally是等效的。