[2012-04-20 周五凌晨] 今天打了好多个大雷,惊吓不小啊。落下太多东西没看了,现在唯有深夜,冲完冷水澡才有精神啊。
++++++++++++++++++
MyBatis
++++++++++++++++++
--享受阅读--
==》什么是MyBatis? 【支持普通SQL查询,存储过程和高级映射的"优秀"持久层框架】
#1 Java 类 -映射- 数据库表
==》入门 SqlSessionFactoryBuilder 构建 【SqlSessionFactory】
#1 从XML中构建SqlSessionFactory
## 由工具类很简单的加载资源文件。
String path = ".../xxMapper.xml";
Reader reader = Resources.getResourceAsReader(path);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
#2 不使用XML构建SqlSessionFactory
#3 从SqlSessionFactory获取SqlSession
## SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。
//开启session
SqlSession ss = sqlMapper.openSession();
Blog blog = (Blog) ss.selectOne("...BlogMapper.selectOne",101);
ss.close();
#4 探究已映射的SQL语句
?SqlSession 和 Mapper对象 干了神马事情?
<mapper namespace = "org.mybatis.example.BlogMapper"> //java class
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id=#{id}
</select>
</mapper>
## test
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101); // selectBlog is query id and parameter is 101.
==> 范围和生命周期
#1 SqlSessionFactoryBuilder
一旦创建了SqlSessionFactory之后,这个类就不需要了。属于方法范围(本地变量)。
#2 SqlSessionFactory
整个应用范围。单例模式或者静态单例模式。--》考虑依赖注入容器。
#3 SqlSession
每个线程都应该有它自己的SqlSession实例。最佳:请求或者方法范围。
说白了,基于HTTP请求。Open a SqlSession, after responese, then close it.
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
//TODU
} finally {
sqlSession.close();
} //保持这种模式
#4 Mapper实例
## 最佳范围:方法范围
SqlSession sqlSession = sqlSessionFatory.openSession();
try{
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
//do work
} finally {
sqlSession.close();
}
==>XML 映射文件
- configuration
--properties 【可代替属性】
--settings
--typeAliases
--typeHandlers 类型处理器
--objectFactory
--plugins
--environments
---environment
----transationManager
----datasource
--Mapper映射器
#1 MyBatis加载属性的顺序 a.properties元素体内 b. 类路径下资源或properties元素的url属性加载 c.方法参数
[2012-04-21 周六凌晨]
Settings --> 会修改Mybatis运行时的行为方式。 P11 table.
TypeAliases --> 类型别名是为Java类型命名一个短的名字。
TypeHandlers --> 类型处理器被用来将获取的值转换成Java类型。 example:BlobTypeHandler
objectFactory --> MyBatis每次创建结果对象新的实例时,它使用一个objectFactory来实现。
plugins --> MyBatis运行你在某一点拦截已映射语句执行的调用。【MapperConfig.xml】
environments --> 多种环境,帮助你将SQL映射到多种数据库中。
#每个数据库对应一个sqlSessionFactory.
transationManager --> 有两种事物管理器类型:JDBC||MANAGED
# JDBC 直接使用jdbc的commit和rollback
# MANAGED 从里不提交或回滚一个连接,而它会让容器来管理这个事务的生命周期。比如:spring/JEE服务器的上下文
# 自定义Mybatis对事物的处理:TransationFactory + Transation
dataSource --> dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源。
# 三种内建的数据源配置
unpooled - 每次被请求时简单的打开和关闭。有点慢
Set up parameter: driver+url+username+password; optional parameter: defaultTransationIsolationLevel.
pooled - 避免创建新的连接实例时必要的初始连接和认证时间。
JNDI - 为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源。
initial_context : optional
data_source : 引用数据源实例位置的上下文的路径。
env.encoding = UTF8
mappers --> 定义SQL映射语句 需要告诉Mybatis去哪儿找这些SQL语句。
# 相对于类路径的资源引用 / 字符表示 / url引用的完全限定名(file://urls)
// Using class path relative resources
<mappers>
<mapper resource="com/xx/xxMapper.xml">
<mapper resource="com/xx2/xx2Mapper.xml">
</mappers>
// Using url fully qualified paths
<mappers>
<mapper url="file:///var/AuthorMapper.xml">
</mappers>
--这些语句告诉了MyBatis去哪儿找映射文件。
==》SQL映射的XML文件
MyBatis真正的力量在于映射语句中。
# SQL映射文件的几个顶级元素
- cache 给定命名空间的缓存
- cache-ref
- resultMap 数据库结果集中加载你的对象
- parameterMap 将来会被移除
- sql 重用的SQL块
- insert
- update
- delete
- select
--------------------detail description------------
select --> 查询和结果映射
<select id="selectPerson" parameterType="int" resultType="HasMap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
# HasMap : key是列名,value是列对应的值
# #{id} : 预处理语句参数
insert,update,delete --> easy to understand.
sql --> 定义可重复使用的代码段
<sql id = "userColumns" > id,userName,password</sql>
<select id ="xxx" ...>
select <include refid = "userColumns">
from some_table
</select>
parameters --> 参数 【P24】
==》 缓存
MyBatis 包含了一个非常强大的查询缓存特性。方便配置和定制。
默认情况下不开启缓存的,除了局部的session缓存。
==》 动态SQL [begin page 39]
MyBatis 的动态SQL语言。采用基于OGNL的表达式来消除其他元素。
a. if
b. choose(when,otherwise)
c. trim(where,set)
d. foreach
- if
<if test="author != null and author.name !=null">
and title like #{author.name}
</if>
- choose,when,otherwise 与Java中的switch一样
<choose>
<when test="a != null"> xx1 </when>
<when test="b != null"> xx2 </when>
<otherwise test="c != null">xx3</otherwise>
</choose>
- trim,where,set -->会消除一些不必要的逗号。
- foreach --> 迭代一个集合,通常是构建在In条件中的。
e.g:
where id in
<foreach item="item" index="index" collection="list">
open="(" separator="," close=")">
#{item}
</foreach>
==>Java API [5.1] 【P43】
#1 应用目录结构
#2 SqlSessions
<-- SqlSessionFactory <-- SqlSessionFactoryBuilder
##1 SqlSessionFactoryBuilder [5个方法可以创建]
String resource = "org/mybatis/builder/MapperConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(reader);
##2 SqlSessionFactory [6个方法可以创建]
默认的openSession()方法没有参数,它会创建有如下特性的SqlSession:
>会开启一个事务(也就是不自动提交)
>连接对象会从由活动环境配置的数据源实例中得到。
>事务隔离级别将会使用驱动或数据源的默认设置。
>预处理语句不会被复用,也不会批量处理更新。
##3 SqlSession [20多个方法]
> 语句执行方法
> 事物控制方法
> 清理Sessean级缓存
> 确保SqlSession被关闭
> 使用映射器
> 映射器注解、
#3 SelectBuilder
一个Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。
##1 selectBuilder的秘密
#4 SqlBuilder
[2012-05-01 周二晚] 趁五一有时间,就把剩下的都看完了。
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
××××Reference : http://www.mybatis.org/core/zh/index.html ×××××××
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××