Mybatis 笔记

-支持普通SQL查询,存储过程和高级映射的优秀持久层框架。

-消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。

-使用简单的XML或注解用于配置和原始映射,将接口和JAVA的POJOS(Plan Old Java Objects)即普通的Java对象映射成数据库中的记录。

总体来说,Mybatis主要完成两件事:

--根据JDBC规范建立与数据库的连接

--通过Annotation/XML+JAVA反射技术,实现JAVA对象与关系数据库之间相互转化。

Mybatis是一种典型的交互式框架:

准备交互的必要条件 构建会话环境
构建一个交互的环境 交换数据

类层次结构:

SqlSessionFactory->DefaultSqlSessionFactory->SqlSessionFactoryBuilder->Configuration

                                                                  |

                                                   SqlSession->DefaultSqlSession->Executor->CachingExecutor

                                                                                                                |->BaseExecutor->(BatchExecutor, SimpleExecutor, ReaseExecutor)

文件组成:Configuration.xml由<configuration>和<mappers>组成:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <configuration>
 3     <environments default="development">
 4         <environment id="development">
 5             <transactionManager type="JDBC" />
 6             <dataSource type="POLLED">
 7                 <property name="driver" value="${driver}" />
 8                 <property name="url" value="${url}" />
 9                 <property name="user" value="${username}" />
10                 <property name="password" value="${password}" />
11             </dataSource>
12         </environment>
13     </environments>
14 </configuration>
15 <mappers>
16     <mapper resource="org.mybatis.builder.AuthorMapper.xml" />
17     <!-- <mapper url="file://var/samples/AuthorMapper.xml" /> -->
18 </mappers>

Mapper.xml: 定义具体SQL映射语句的文件,文件结构:

-cache:配置给定命名空间的缓存

-cache-ref:从其他命名空间引用缓存配置

-resultMap:最复杂,也是最具力量的元素,用来描述如何从数据库结果集中来加载对象

-resultType:从语句中返回的期望类型的类的完全限定名或别名

-sql:可以重用的SQL块,也可以被其他语句引用

-insert:映射插入语句

-update:映射更新语句

-delete:映射删除语句

-select:映射查询语句

输出属性参数:resultType,resultMap,二者不能同时使用

resultType-返回的期望类型的类的完全限定名或别名,注意集合情况,应该是集合可以包含的类型,而不是集合本身

resultMap-命名引用外部的resultMap,返回map是mybatis最具力量的特性,对其有一个很好的理解的话,许多复杂的映射的情况就能被解决了

二者的区别:

<resultMap id="BaseResultMap" type="com.garinzhang.vo.Area">
    <id column="area_id" jdbcType="INTEGER" property="areaId" />
    <id column="code" jdbcType="VARCHAR" property="code" />
    <id column="parent" jdbcType="INTEGER" property="parent" />
</resultMap>
<select id="selectUsers" paramenterType="int" resultType="com.garinzhang.model.User">
    SELECT ID, USERNAME, PASSWORD FROM USER WHERE ID=#{id}
</select>
<mapper namespace="org.mybatis.example.BlogMapper">
    <select id="selectBlog" parameterType="int" resultType="Blog" >
        SELECT * FROM Blog WHERE ID="#{id}"
    </select>
</mapper>

调用方式:

// 1. 使用完全限定名词调用映射语句
Bolg b = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 1);

// 2. 采用映射接口调用映射语句
BlogMapper m = session.getMapper(BlogMapper.class);
Blog blog = m.selectBlog(1);

Insert: 如果User表已经对id使用了自动生成的列类型

<insert id="insertUser" parameterType="com.garinzhang.model.User" userGeneratedKeys="true" keyProperty="id">
    INSERT INTO USER(USERNAME, PASSWORD, EMAIL, PHONE)
        VALUES(#{username}, #{password}, #{email}, #{phone})
</insert>

Insert: 如果User表主键生成策略采用OID, Sequence

<insert id="insertUser" parameterType="com.garinzhang.model.User">
    <selectKey resultType="long" keyProperty="id" order="BEFORE">
        SELECT nextval FOR SEQ_USER FROM DUAL
    </selectKey>
    INSERT INTO USER(ID, USERNAME, PASSWORD, EMAIL, PHONE)
        VALUES(#{id}, #{username}, #{password}, #{email}, #{phone})
</insert>

Update: 

<udpate id="updateUser" parameterType="com.garinzhang.model.User">
    UPDATE USER SET USERNAME=#{username}, PASSWORD=#{password}, EMAIL=#{email}, PHONE=#{phone}
        WHERE ID=#{id}
</udpate>

Delete:

<delete id="deleteUser" parameterType="int">
    DELETE FROM USER WHERE ID=#{id}
</delete>

动态SQL: Mybatis的一个强大的特性之一,通常是它的动态SQL能力

SQLSessionFactory:

SqlSessionFactory有三个方法可以用来创建SqlSession实例

       SqlSession openSession(ExecuterType execType)

       SqlSession openSession(ExecutorType execType, boolean autoCommit)

       SqlSession openSession(ExecutorType execType, Connection conn)

Configuration getConfiguration();

默认的openSession方法没有参数:它会创建有如下特性的sqlSession:

1. 会开启一个事务,也就是不会自动提交

2. 连接对象会从由活动环境配置的数据源实例中得到

3. 事务隔离级别将会使用驱动或数据源的默认设置

4. 预处理语句不会被复用,也不会批量处理

posted @ 2013-03-10 20:33  我是小菜鸟  阅读(350)  评论(0编辑  收藏  举报