[官网] https://mybatis.org/mybatis-3/zh/index.html
简介
MyBatis 是一款优秀的基于 ORM 的半自动轻量级持久层框架,它支持定制化SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型,将接口和 Java 的 POJO (Plain Old Java Objects,普通老式Java对象)映射成数据库中的记录。
历史
Mybatis 本是 Apache 的一个开源项目 iBatis,2010年6月这个项目由 Apache Software Foundation 迁移到了Google Code,随着开发团队转投 Google Code 旗下,ibatis3.x 正式更名为 Mybatis,代码于2013年11月迁移到 Github。
iBATIS 一词来源于 “internet” 和 “abatis” 的组合,是一个基于 Java 的持久层框架。iBATIS 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO)
基本应用
构建 SqlSessionFactory
- 通过 XML 构建
// BlogMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
// mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<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>
private SqlSessionFactory buildSqlSessionFactoryFromXml(String resourcePath) throws IOException {
InputStream inputStream = Resources.getResourceAsStream(resourcePath);
return new SqlSessionFactoryBuilder().build(inputStream);
}
- 通过 Java 构建
private SqlSessionFactory buildSqlSessionFactory() {
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
return new SqlSessionFactoryBuilder().build(configuration);
}
获取 SqlSession
SqlSession 提供了在数据库执行 SQL 命令所需的所有方法
- 通过 SqlSession 实例来直接执行已映射的 SQL 语句
SqlSession sqlSession = sqlSessionFactory.openSession();
Blog blog = (Blog) sqlSession.selectOne("org.mybatis.example.BlogMapper.selectBlog", 1);
- 通过接口来执行
SqlSession sqlSession = sqlSessionFactory.openSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(1);
作用域和生命周期
-
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 的最佳作用域是方法作用域。可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好不要一直保留,以保证所有的 XML 解析资源可以被释放给更重要的事。 -
SqlSessionFactory
SqlSessionFactory 的最佳作用域是应用作用域。SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,不要重复创建多次。 -
SqlSession
SqlSession 的最佳作用域是请求或方法作用域。每个线程都应该有它自己的 SqlSession 实例,因为SqlSession实例不是线程安全的,因此不能被共享。绝对不能将 SqlSession实例的引用放在类的静态域、类的实例变量、任何类型的托管作用域(例如Servlet的HttpSession)。在Web框架中,每次收到HTTP请求就可以打开一个SqlSession,返回一个响应后就关闭它。 -
映射器实例
映射器是一些绑定映射语句的接口。映射器接口的实例是从SqlSession中获得的,从技术层面上来讲,任何映射器实例的最大作用域与请求它们的SqlSession相同。但方法作用域才是映射器实例的最合适的作用域。
网友评论