`

6、mybatis

    博客分类:
  • mvc
 
阅读更多
<转>http://blog.csdn.net/hupanfeng/article/category/1443955
Mybatis的功能架构分为三层:

1)       API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

2)       数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

3)      基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。


SqlSessionFactoryBuilder
每一个MyBatis的应用程序的入口是SqlSessionFactoryBuilder,它的作用是通过XML配置文件创建Configuration对象(当然也可以在程序中自行创建),然后通过build方法创建SqlSessionFactory对象。没有必要每次访问Mybatis就创建一次SqlSessionFactoryBuilder,通常的做法是创建一个全局的对象就可以了。示例程序如下:
private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;  
private static SqlSessionFactory sqlSessionFactory;  
private static void init() throws IOException {  
    String resource = "mybatis-config.xml";  
    Reader reader = Resources.getResourceAsReader(resource);  
    sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();  
    sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);  
}  


SqlSessionFactory
SqlSessionFactory对象由SqlSessionFactoryBuilder创建。它的主要功能是创建SqlSession对象,和SqlSessionFactoryBuilder对象一样,没有必要每次访问Mybatis就创建一次SqlSessionFactory,通常的做法是创建一个全局的对象就可以了。SqlSessionFactory对象一个必要的属性是Configuration对象,它是保存Mybatis全局配置的一个配置对象,通常由SqlSessionFactoryBuilder从XML配置文件创建。这里给出一个简单的示例:
<?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">  
[color=olive]<configuration>  
[/color]    <!-- 配置别名 -->  
    <typeAliases>  
        <typeAlias type="org.iMybatis.abc.dao.UserDao" alias="UserDao" />  
        <typeAlias type="org.iMybatis.abc.dto.UserDto" alias="UserDto" />  
    </typeAliases>       
    <!-- 配置环境变量 -->  
    <environments default="development">  
        <environment id="development">  
            <transactionManager type="JDBC" />  
            <dataSource type="POOLED">  
                <property name="driver" value="com.mysql.jdbc.Driver" />  
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/iMybatis?characterEncoding=GBK" />  
                <property name="username" value="iMybatis" />  
                <property name="password" value="iMybatis" />  
            </dataSource>  
        </environment>  
    </environments>  
      
    <!-- 配置mappers -->  
    <mappers>  
        <mapper resource="org/iMybatis/abc/dao/UserDao.xml" />  
    </mappers>  
</configuration>  

mappers元素是包含所有mapper(映射器)的列表,这些mapper的XML文件包含SQL代码和映射定义信息

SqlSession
SqlSession对象的主要功能是完成一次数据库的访问和结果的映射,它类似于数据库的session概念,由于不是线程安全的,所以SqlSession对象的作用域需限制方法内。SqlSession的默认实现类是DefaultSqlSession,它有两个必须配置的属性:Configuration和Executor。Configuration前文已经描述这里不再多说。SqlSession对数据库的操作都是通过Executor来完成的。

SqlSession有一个重要的方法getMapper,这个方式是用来获取Mapper对象的。Mapper对象是存放接口的包路径下需要配置同名的XML配置文件。SqlSession的getMapper方法是联系应用程序和Mybatis纽带,应用程序访问getMapper时,Mybatis会根据传入的接口类型和对应的XML配置文件生成一个代理对象,这个代理对象就叫Mapper对象。应用程序获得Mapper对象后,就应该通过这个Mapper对象来访问Mybatis的SqlSession对象,这样就达到操作数据库目的。示例代码如下:
SqlSession session= sqlSessionFactory.openSession();  
UserDao userDao = session.getMapper(UserDao.class);  
UserDto user = new UserDto();  
user.setUsername("iMybatis");  
List<UserDto> users = userDao.queryUsers(user);  

public interface UserDao {  
    public List<UserDto> queryUsers(UserDto user) throws Exception;  
}  


Executor
Executor对象在创建Configuration对象的时候创建,并且缓存在Configuration对象里。Executor对象的主要功能是调用StatementHandler访问数据库,并将查询结果存入缓存中(如果配置了缓存的话)。

StatementHandler
StatementHandler是真正访问数据库的地方,并调用ResultSetHandler处理查询结果。

ResultSetHandler
处理查询结果。

mapper文件:
mapper配置文件是配置sql映射的地方,它看起来就像下面这个样子:
<?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.iMybatis.abc.dao.UserDao">  
    <cache type="PERPETUAL" eviction="LRU" flushInterval="60000"  
        size="512" readOnly="true" />  
    <resultMap id="userResultMap" type="UserDto">  
        <id property="userid" column="userid" />  
        <result property="username" column="username" />  
        <result property="password" column="password" />  
    </resultMap>  
    <sql id="userColumns"> userid,username,password </sql>  
    <select id="queryUsers" parameterType="UserDto" resultType="UserDto"  
        useCache="false">  
        select <include refid="userColumns" />  
        from t_user t where t.username = #{username}  
    </select>  
    <insert id="insertUser" parameterType="UserDto"  
        useGeneratedKeys="true" keyProperty="userid">  
        insert into t_user (userid,username,password)  
        values (#{userid},#{username},#{password})  
    </insert>  
    <update id="updateUser" parameterType="UserDto">  
        update t_user set  
        username= #{username},  
        password = #{password},  
        where userid = #{userid}  
    </update>  
    <delete id="deleteUser" parameterType="UserDto">  
        delete from t_user where userid = #{userid}  
    </delete>  
</mapper>  


Mapper元素只有一个属性namespace,它有两个作用:一是用于区分不同的mapper(在不同的mapper文件里,子元素的id可以相同,mybatis通过namespace和子元素的id联合区分),二是与接口关联(应用程序通过接口访问mybatis时,mybatis通过接口的完整名称查找对应的mapper配置,因此namespace的命名务必小心一定要某接口同名)。此外,mapper配置文件还有几个顶级子元素(它们须按照顺序定义):

l cache -配置本定命名空间的缓存。

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

l resultMap –结果映射,用来描述如何从数据库结果集映射到你想要的对象。

l parameterMap –已经被废弃了!建议不要使用,本章也不会对它进行讲解。

l sql –可以重用的SQL块,可以被其他数据库操作语句引用。

l insert|update|delete|select–数据库操作语句

Mapper的解析在XMLMapperBuilder里完成,主要通过configurationElement方法完成解析,在configurationElement内部调用各个元素的子解析方法完成解析。


子元素之cache
1.       配置示例
<cache type="PERPETUAL" eviction="LRU"flushInterval="60000" size="512"readOnly="true" /> 
l        type-cache实现类,默认为PERPETUAL,可以使用自定义的cache实现类(别名或完整类名皆可)

l        eviction-回收算法,默认为LRU,可选的算法有:

                  LRU– 最近最少使用的:移除最长时间不被使用的对象。

                 FIFO– 先进先出:按对象进入缓存的顺序来移除它们。

                 SOFT– 软引用:移除基于垃圾回收器状态和软引用规则的对象。

                 WEAK– 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

l        flushInterval-刷新间隔,默认为1个小时,单位毫秒

l        size-缓存大小,默认大小1024,单位为引用数

l        readOnly-只读

2.        解析
cacheElement方法负责解析cache元素,它通过调用CacheBuilder的相应方法完成cache的创建。每个cache内部都有一个唯一的ID,这个id的值就是namespace。创建好的cache对象存入configuration的cache缓存中(该缓存以cache的ID属性即namespace为key,这里再次体现了mybatis的namespace的强大用处)。


子元素之cache-ref
1.       配置示例
<cache-ref namespace="com.someone.application.data.SomeMapper"/> 
如果你不想定义自己的cache,可以使用cache-ref引用别的cache。因为每个cache都以namespace为id,所以cache-ref只需要配置一个namespace属性就可以了。需要注意的是,如果cache-ref和cache都配置了,以cache为准。

2.        解析
cacheRefElement方法负责解析cache-ref元素,它通过调用CacheRefResolver的相应方法完成cache的引用。创建好的cache-ref引用关系存入configuration的cacheRefMap缓存中。

子元素之resultMap
1.       配置示例
<resultMap id="userResultMap" type="User"> 
    <id property=" userid " column="userid" /> 
    <result property="username" column="username" /> 
    <result property="password" column="password" /> 
      </resultMap> 
resultMap提供了从数据库表列名到java对象属性的映射管理,示例只是提供了最简单的情况,resultMap能做的不仅仅是示例中这么点(作者不喜欢使用resultMap完成结果的复杂映射,相反更喜欢结果和对象的直接映射)。在mapper配置文件中可以配置多个resultMap,不同的resultMap用id加以区分。type属性标记java类型(别名)。子元素中的property指带java中的属性,column指带数据库表的列名。

2.        解析
resultMapElement方法负责解析resultMap元素,它通过调用ResultMapResolver的相应方法完成resultMap的解析。创建好的resultMap存入configuration的resultMaps缓存中(该缓存以namespace+resultMap的id为key,这里再次体现了mybatis的namespace的强大用处)。

子元素之sql
1.       配置示例
<sql id="userColumns"> userid,username,password</sql> 
这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中。例如:
<select id="queryUsers" parameterType="UserDto" resultType="UserDto" useCache="false"> 
    select <include refid="userColumns"/> from t_user t where t.username = #{username} 
       </select> 
2.        解析
sqlElement方法负责解析sql元素。id属性用于区分不同的sql元素,在同一个mapper配置文件中可以配置多个sql元素。

子元素之statement
1.       配置示例
作为数据库访问的statement元素包含4种类型:insert、update、delete、query。其中前3者可以归为一类,query单独为一类,下面分开讲解。

1)       select
<select id="queryUsers" parameterType="UserDto" resultType="UserDto" useCache="false"> 
    select <include refid="userColumns"/> from t_user t where t.username = #{username} 
      </select> 
select元素有很多属性允许配置,来决定每条语句的作用细节,如下:


selectKey
<selectKey keyProperty="userid" resultType="int" order="BEFORE"> 
     select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 
</selectKey>
selectKey给了你一个简单的行为在你的数据库中来处理自动生成的主键,而不需要使你的Java代码变得复杂。在上面的示例中,selectKey元素将会首先运行,userid会被设置,然后插入语句会被调用。另外,selectKey节点生成的KeyGenerator优先级高于statement节点的useGeneratedKeys属性生成的KeyGenerator对象,也就是说配置了SelectKey子节点就不需要再配置useGeneratedKeys属性了。



注册mapper类型
我们知道每个mapper配置文件的namespace属性对应于某个接口,应用程序通过接口访问mybatis时,mybatis会为这个接口生成一个代理对象,这个对象就叫mapper对象,在生成代理对象前mybatis会校验接口是否已注册,未注册的接口会产生一个异常。为了避免这种异常,就需要注册mapper类型。这个步骤是在XMLMapperBuilder的bindMapperForNamespace方法中完成的。它通过调用Configuration对象的addMapper方法完成,而Configuration对象的addMapper方法是通过MapperRegistry的addMapper方法完成的,它只是简单的将namespace属性对应的接口类型存入本地缓存中。

Configuration对象提供了一个重载的addMappers(StringpackageName)方法,该方法以包路径名为参数,它的功能是自动扫描包路径下的接口并注册到MapperRegistry的缓存中,同时扫描包路径下的mapper配置文件并解析之。解析配置文件是在MapperAnnotationBuilder类的parse方法里完成的,该方法先解析配置文件,然后再解析接口里的注解配置,且注解里的配置会覆盖配置文件里的配置,也就是说注解的优先级高于配置文件,这点需要注意。采用自动扫描会大大简化配置,只不过需要应用程序自己调用,mybatis默认是不会调用这个方法的。

Sqlsession
Sqlsession对应着一次数据库会话。由于数据库回话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。创建Sqlsession的地方只有一个,那就是SqlsessionFactory的openSession方法:
创建sqlsession经过了以下几个主要步骤:

1)       从配置中获取Environment;
2)       从Environment中取得DataSource;
3)       从Environment中取得TransactionFactory;
4)       从DataSource里获取数据库连接对象Connection;
5)       在取得的数据库连接上创建事务对象Transaction;
6)       创建Executor对象(该对象非常重要,事实上sqlsession的所有操作都是通过它完成的);
7)       创建sqlsession对象。

Executor与Sqlsession的关系就像市长与书记,Sqlsession只是个门面,真正干事的是Executor,Sqlsession对数据库的操作都是通过Executor来完成的。与Sqlsession一样,Executor也是动态创建的:

如果不开启cache的话,创建的Executor只是3中基础类型之一,BatchExecutor专门用于执行批量sql操作,ReuseExecutor会重用statement执行sql操作,SimpleExecutor只是简单执行sql没有什么特别的。开启cache的话(默认是开启的并且没有任何理由去关闭它),就会创建CachingExecutor,它以前面创建的Executor作为唯一参数。CachingExecutor在查询数据库前先查找缓存,若没找到的话调用delegate(就是构造时传入的Executor对象)从数据库查询,并将查询结果存入缓存中。

Executor对象是可以被插件拦截的,如果定义了针对Executor类型的插件,最终生成的Executor对象是被各个插件插入后的代理对象

mapper是一个代理对象,传入接口类型,这就是为什么mapper对象可以通过接口直接访问。同时还可以看到,创建mapper代理对象时传入了sqlsession对象,这样就把sqlsession也关联起来了。
returnMapperProxy.newMapperProxy(type, sqlSession);
newMapperProxy(Class<T> mapperInterface, SqlSession sqlSession) {  
    ClassLoader classLoader = mapperInterface.getClassLoader();  
    Class<?>[] interfaces = new Class[]{mapperInterface};  
    MapperProxyproxy = new MapperProxy(sqlSession);  
    return (T) Proxy.newProxyInstance(classLoader,interfaces, proxy);  
}  

  • 大小: 91.7 KB
  • 大小: 18.7 KB
  • 大小: 15.4 KB
  • 大小: 15.7 KB
分享到:
评论

相关推荐

    U3-6MyBatis框架.rar

    在这个"U3-6MyBatis框架.rar"压缩包中,我们可能会看到一系列关于MyBatis学习的资料,包括教程、示例代码以及可能的练习项目。 1. **ORM原理**:ORM(Object-Relational Mapping)是对象关系映射,它允许开发者用...

    mybatis和spring的整合包(完整版).rar

    MyBatis和Spring的整合是Java开发中常见的一种技术栈,被称为SSM(Spring、SpringMVC、MyBatis)框架。这个整合包提供了一整套的库文件,使得开发者可以快速搭建基于MyBatis与Spring的Web应用程序。在本文中,我们将...

    mybatis demo mybatis 实例

    6. 与其他框架的集成:MyBatis可以轻松地与Spring等其他框架集成,实现更复杂的系统架构。 在压缩包“MyBatis-master”中,通常会包含以下内容: 1. POM.xml:Maven项目配置文件,列出了项目依赖,包括MyBatis库和...

    mybatis-3-mybatis-3.2.6

    6. **MappedStatement**:封装了SQL语句及其相关信息,如ID、参数映射、结果映射等。它是MyBatis执行SQL的依据。 7. **ParameterHandler**:处理SQL参数,将Java对象转化为JDBC能识别的参数,通常使用ParameterMap...

    MyBatis 官方笔记 + MyBatis 3.5.10 官方英文文档

    6. **插件(Plugins)** - MyBatis 允许开发者创建自定义插件,拦截 Executor、StatementHandler、ParameterHandler 和 ResultSetHandler 等执行过程。 7. **缓存** - MyBatis 内置了本地缓存和二级缓存,可以...

    mybatis中文离线文档

    6. **参数映射**:MyBatis支持多种类型的参数映射,包括基本类型、复杂类型(如自定义对象)以及Map等。它可以自动将Java对象的属性值转换为SQL语句中的参数。 7. **结果映射**:结果映射用于将查询结果转换为Java...

    mybatisx.zip

    6. **Mapper方法快速定位**:可以快速跳转到对应Mapper接口的方法定义,便于代码间的导航。 7. **XML与Mapper接口关联**:自动识别并关联Mapper接口与Mapper XML文件,使得开发过程中保持良好的代码组织。 8. **...

    Mybatis用到的资料

    6. 插件支持:Mybatis允许开发者编写拦截器插件,对SQL执行的全过程进行拦截和修改,如性能监控、日志记录等。 Mybatis的使用通常包括以下步骤: 1. 配置:创建mybatis-config.xml文件,配置数据源、事务管理器、...

    MyBatis入门到精通

    6. **MyBatis的Mapper接口** Mapper接口是Java类,它是SQL操作的抽象层。通过实现这些接口,可以在Service层直接调用,MyBatis会自动处理SQL的执行和结果的映射。 7. **参数绑定** MyBatis支持多种参数绑定,如#...

    MyBatis-3.4.6.zip

    6. 支持插件:MyBatis允许开发人员通过拦截器插件自定义扩展,对MyBatis的行为进行修改,如性能监控、日志记录等。 7. 分页插件:MyBatis官方提供了PageHelper插件,可以方便地实现分页查询,无需手动编写分页代码...

    mybatis 3.2.6

    6. **灵活的XML或注解配置**:用户可以选择使用XML配置文件或注解来定义SQL语句和映射规则。 在实际应用中,MyBatis可以与Spring框架配合使用,实现依赖注入和事务管理。此外,MyBatis也支持自定义拦截器,可以实现...

    Spring整合Mybatis与SpringBoot整合Mybatis原理分析

    **Spring整合Mybatis原理分析** 在Java Web开发中,Spring框架以其强大的依赖注入和面向切面编程能力,成为了事实上的核心框架。Mybatis则是一个轻量级的持久层框架,它简化了数据库操作,提供了直观的SQL映射。将...

    idea 15 mybatis插件

    6. **使用技巧**:使用MyBatis插件可以提升开发效率,例如,通过插件可以快速生成Mapper接口和XML配置文件,同时在编写SQL时能获得代码提示,减少出错概率。 7. **版本兼容性**:IDEA 15.02版本的插件可能不适用于更...

    mybatisX-idea插件

    6. **优化开发流程**: 通过使用MybatisX-idea插件,开发者可以更专注于业务逻辑,减少在基础框架设置上的时间消耗。它提升了开发效率,使得团队协作更为流畅,有助于项目进度的推进。 7. **持续学习与进阶**: ...

    MyBatis详解_与配置MyBatis

    6. 测试 建立 MySql 数据库的步骤包括: 1. 建立学生选课管理数据库 2. 创建学生表、班级表、教师表、课程表、学生选课表 3. 插入学生数据 搭建 MyBatis 环境的步骤包括: 1. 创建实体类 2. 创建映射文件 3. ...

    mybatis离线插件包

    MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。这款框架避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    mybatis,mybatis+mysql

    6. **事务管理**:MyBatis的事务管理可以手动或自动进行。在Service层,你可以使用try-catch-finally结构手动管理,或者配置MyBatis的事务管理器,使其自动处理事务的提交和回滚。 7. **日志跟踪**:为了便于调试,...

    mybatis-3.4.5.jar

    6. 插件支持:MyBatis 提供插件扩展机制,可以通过自定义插件实现日志、性能分析等功能。 7. 强大的文档:压缩包中的PDF文档应该是MyBatis的官方用户手册,包含了详细的API参考和教程,对于理解和使用MyBatis非常有...

    idea插件MybatisX-1.6.1

    6. 映射文件与Java接口关联: 在Mapper接口上右键点击,可以选择“Associate with XML”来关联XML映射文件,使得在编辑接口时,可以快速跳转到对应的XML文件,反之亦然。 7. 集成Mybatis Generator: MybatisX...

    mybatis3.4.5完整jar包下载

    6. **执行SQL操作**:通过SqlSession实例调用Mapper接口的方法,执行对应的SQL并处理结果。 MyBatis以其简洁、灵活的特性深受开发者喜爱,它允许开发者更专注于SQL的编写,同时通过强大的映射机制减少了对象与...

Global site tag (gtag.js) - Google Analytics