mybatis
1. 简介
ORM (object relationship mapping) 对象关系映射
映射关系:数据库数据与java对象联系起来
对比JDBC
a. 动态sql
b. 分离集中管理sql
c. 输入映射和输出映射
2. 导包
mybatis 3.5.2
mysql-connector-java 5.1.47
junit test
3. 配置
3.1 基础支撑层
<?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>
<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>
<!--映射器,包含SQL代码和映射定义信息-->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
3.2 数据处理层
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://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>
命名空间(Namespaces)的作用
-
利用更长的完全限定名来将不同的语句隔离开
-
实现接口绑定
命名解析, 为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
- 完全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
- 短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用完全限定名。
4. 调用
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
sqlSessionFactory = builder.build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
// 你的应用逻辑代码
}
sqlSession→ selectOne selectList(select标签) 与 insert(insert标签)、update(update)、delete(delete标签)
共同点:
- 都可以传入两个参数:
- 参数1(String):对应的命名空间+id
- 参数2(Object):基本类型→#{任意写}
- Javabean→#{javabean的成员变量名}
- parameterType可以不写
不同点:
- Insert、delete、update:没有resultType、提交sqlSession,查询的resultType是必须写的
- 使用的标签不同
5. 作用域(Scope)和生命周期
依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。
5.1 SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。
最佳作用域是方法作用域(也就是局部方法变量)。
5.2 SqlSessionFactory
一旦被创建就应该在应用的运行期间一直存在, 在应用运行期间不要重复创建多次 。
最佳作用域是应用作用域。 (单例或静态单例模式)
5.3 SqlSession
实例不是线程安全的,因此是不能被共享的,每个线程都应该有它自己的 SqlSession 实例。
最佳的作用域是请求或方法作用域
确保SqlSession关闭的标准模式:
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// 你的应用逻辑代码
}
5.4 映射器实例
映射器是一些由你创建的、绑定你映射的语句的接口。 任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。
最佳作用域是方法作用域