[05-01] Read Mybatis3 User Guide

[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 ×××××××

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××


猜你喜欢

转载自2012-for-review.iteye.com/blog/1506542
今日推荐