MyBatis的SQL语句映射文件详解

SQL 映射XML 文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用

<mapper namespace="com.mybaits.bean.User">
    <!-- 将结果集转化成对象 -->
    <resultMap type="" id=""></resultMap>
    
    <!-- 配置缓存 -->
    <cache></cache>
    
    <!-- 引用其他模式中的缓存 -->
    <cache-ref namespace=""/>
    
    <!--可以被其他SQL语句复用的SQL块  -->
    <sql id=""></sql>
    
    <!-- CRUD操作语句 -->
    <insert id=""></insert>
    <select id=""></select>
    <update id=""></update>
    <delete id=""></delete>
</mapper>
<resultMap type="" id=""></resultMap>

resultMap 是MyBatis 中最重要最强大的元素了。你可以让你比使用JDBC 调用结果集省掉90%的代码,也可以让你做许多JDBC 不支持的事。现实上,要写一个等同类似于交互的映射这样的复杂语句,
可能要上千行的代码。ResultMaps 的目的,就是这样简单的语句而不需要多余的结果映射,更多复杂的语句,除了只要一些绝对必须的语句描述关系以外,再也不需要其它的。
resultMap属性:type为java实体类;id为此resultMap的标识。

resultMap 元素的概念

          1. constructor – 用来将结果反射给一个实例化好的类的构造器

  a) idArg – ID 参数;将结果集标记为ID,以方便全局调用
  b) arg –反射到构造器的通常结果
2. id – ID 结果,将结果集标记为ID,以方便全局调用
3. result – 反射到JavaBean 属性的普通结果
4. association – 复杂类型的结合;多个结果合成的类型

5. collection –复杂类型集合a collection of complex types
6. discriminator – 使用一个结果值以决定使用哪个resultMap

  a) case – 基本一些值的结果映射的case 情形

一个case 情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap。

  id,result详解

    id、result是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。

        <resultMap type="com.mybaits.bean.User" id="userResult">
            <id property="id" column="id" />
            <result property="username" column="username"/>
            <result property="usernumber" column="usernumber"/>
            <result property="loginname" column="loginname"/>
            <result property="loginpassword" column="loginpassword"/>
            <result property="sex" column="sex"/>
            <result property="birthday" column="birthday" />
        </resultMap>

id、result语句属性配置细节:

属性

描述

property

需要映射到JavaBean 的属性名称。

column

数据表的列名或者标签别名。

javaType

一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。

jdbcType

数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。

typeHandler

使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。

 

 

 

 

 

 

 

 

 

 

 

constructor

我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的

构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的。

上面使用id、result实现的功能就可以改为:

<resultMap type="com.mybaits.bean.User" id="userResult">
        <!--  
            <id property="id" column="id" />
            <result property="username" column="username"/>
            <result property="usernumber" column="usernumber"/>
            <result property="loginname" column="loginname"/>
            <result property="loginpassword" column="loginpassword"/>
            <result property="sex" column="sex"/>
            <result property="birthday" column="birthday" />
        -->
            <constructor>
                    <idArg javaType="Integer" column="id"/>
                    <arg javaType="String" column="username"/>            
                    <arg javaType="String" column="usernumber"/>
                    <arg javaType="String" column="loginname"/>
                    <arg javaType="String" column="loginpassword"/>
                    <arg javaType="String" column="sex"/>
                    <arg javaType="Date" column="birthday"/>                
            </constructor>
        </resultMap>
    

需定义User实体类的构造方法

public User(Integer id,String username, String usernumber, String loginname,
                String loginpassword, String sex,Date birthday) {
            this.username = username;
            this.usernumber = usernumber;
            this.loginname = loginname;
            this.loginpassword = loginpassword;
            this.sex = sex;
            this.birthday=birthday;
        }

 association联合

     联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。

collection聚集

     聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis 如何加载一个聚集。

    对于实体间联系,在后续中会有具体解释。

discriminator鉴别器

   有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句。

 

 

 

 

 

 

 

posted @ 2015-07-30 17:23  wandy丶  阅读(1066)  评论(0编辑  收藏  举报