Mybatis:框架构建
一、安装、导入依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
二、使用XML构建SqlSessionFactory
认识SqlSessionFactory
-
SqlSessionFactory是个单个数据库映射关系经过编译后的内存镜像
-
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心
-
SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得
-
SqlSessionFactoryBuilder 可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例
-
SqlSessionFactory是线程安全的,一旦被创立,在整个执行过程中都存在,
-
最好使用单例模式,不要多次创建
-
SqlSessionFactory是创建SqlSession的工厂
实例操作
//核心配置文件路径
String resource = "mybatis-config.xml";
//加载资源文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建出SqlSessionFactory实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- MyBatis 包含一个名叫 Resources 的工具类,可使从 classpath 或其他位置加载资源文件更加容易。
- 也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置
Mybatis核心配置
- 核心配置文件中,包含数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)
- environment 元素体中包含了事务管理和连接池的配置。mappers 元素包含一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
三、从 SqlSessionFactory 中获取 SqlSession
- 认识SqlSession
- SqlSession是持久化操作的对象,类似于JDBC的Connection
- 他是持久层和应用程序执行交互操作的单线程对象
- sqlSession完全包含以数据库为背景的所有Sql操作方法
- SqlSession的实例不能被共享
- 非线程安全
- 使用完要关闭SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101); //执行selectBlog方法
}
事实上,为了方便,通常我们会创建一个utils工具类进行封装操作,
public class CustomerUtils {
private static SqlSessionFactory sessionFactory;
static {
String resource = "mybatis-config.xml";
try {
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getsession() {
return sessionFactory.openSession();
}
}
这样,我们就可以通过工具类直接调用方法,是不是很方便呢?
四、Sql语句的映射
<mapper namespace="org.mybatis.example.BlogMapper"> //所映射的接口
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
五、Sql语句注解映射
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
说明:
- 命名空间的作用:
- 利用更长的完全限定名来将不同的语句隔离开
- 实现了接口绑定
- SqlSessionFactoryBuilder:
- 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了(局部方法变量)