MyBatis的SQL语句映射文件详解

摘要:
SQL映射XML文件是放置所有SQL语句的位置。编写SQL语句映射文件后,需要引用<mappernamespace=“com.mybaits.bean.User”><!在MyBATis配置文件的mappers标记中!ResultMaps的目的是这样简单的语句不需要冗余的结果映射,而更复杂的语句除了绝对必要的语句之外,不需要其他任何东西来描述关系。ResultMap属性:type是一个java实体类;ID是resultMap的IDid、result语句的属性配置详细信息:属性描述属性需要映射到JavaBean的属性名称。如果您匹配JavaBean,MyBatis通常会自己检测它。这对于JDBC是必需的,但对于MyBatis则不是。

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语句。

 

免责声明:文章转载自《MyBatis的SQL语句映射文件详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇《操作系统》课程笔记(Ch08-内存管理策略)几种常见随机过程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Golang的高级数据类型-切片(slice)实战篇

          Golang的高级数据类型-切片(slice)实战篇                              作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。        切片(slice)是Go中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合,切片是围绕动态数组的概念构建的,可以按需自动增长。   ...

python__007内置函数

本文摘自:https://docs.python.org/3/library/functions.html?highlight=built#ascii            内置功能     abs() delattr() hash() memoryview() set() all() dict() help() min() s...

WPF学习笔记:ComboBox的数据绑定

UI <UserControl x: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"...

VB创建类模块DLL文件

最近需要调用MSCOMM32.OCX控件,但是ABAP调用过程中发现无法同时发送多条记录,则需调整实现方式:   a.创建DLL文件封装MSCOMM控件相关属性及方法   b.系统注册DLL文件   c.ABAP调用DLL文件相关属性及方法 这一部分内容主要是将VB类模块的创建过程记录下: 1.打开VB,创建ActiveX DLL文件   2.修改工程名为...

[SoapUI] Java转换各种日期格式

date为原始日期,orignalFormat为原始日期格式,expectedFormat为预期日期格式 def convertDate(String date, String originalFormat, String expectedFormat){ SimpleDateFormat dateFormat1 = newSimpleDa...

winform使用Barcodex控件预览和打印一维码

1、控件下载。   http://files.cnblogs.com/files/masonblog/barcodex.zip 。   包含barcodex.ocx控件、barcodex帮助文档、两个winform控件的dll文件。 2、控件的注册。 (1)检测控件是否注册(方法不唯一)。   本例使用的是判断注册表中 HKEY_CLASSES_ROOTT...