zoukankan      html  css  js  c++  java
  • MyBatis之ResultMap的association和collection标签(一)

    1.先说resultMap比较容易混淆的点,

     2.

    Map结尾是映射,Type是类型 
    resultType 和restltMap
    restulyType:
    1.对应的是java对象中的属性,大小写不敏感,
    2.如果放的是java.lang.Map,key是查询语句的列名,value是查询的值,大小写敏感
    resultMap:指的是定义好了的id的,是定义好的resyltType的引用
    注意:用resultType的时候,要保证结果集的列名与java对象的属性相同,而resultMap则不用,而且resultMap可以用typeHander转换
    3.
    type:java 对象对应的类,
    id:在本文件要唯一
    column :数据库的列名或别名,
    protery:对应java对象的属性
    jdbcType:java.sql.Types
    查询语句中,resultMap属性指向上面那个属性的标签的id
    parameterType:参数类型,只能传一个参数,如果有多个参数要封装,如封装成一个类,要写包名加类名,基本数据类型则可以省略
    4.一对1、一对多时,若有表的字段相同必须写别名,不然查询结果无法正常映射,出现某属性为空或者返回的结果与想象中的不同,而这往往是没有报错的。
    5.若有意外中的错误,反复检查以上几点,和认真核查自己的sql语句,mapper.xml文件是否配置正确。
     

    高级结果映射

    MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的。虽然我们希望所有的数据库遵守第三范式或BCNF(修正的第三范式),但它们不是。如果有一个数据库能够完美映射到所有应用程序,也将是非常棒的,但也没有。结果集映射就是MyBatis为解决这些问题而提供的解决方案。

    resultMap

    ·constructor–实例化的时候通过构造器将结果集注入到类中

    oidArg– ID 参数; 将结果集标记为ID,以方便全局调用

    oarg–注入构造器的结果集

    ·id–结果集ID,将结果集标记为ID,以方便全局调用

    ·result–注入一个字段或者javabean属性的结果

    ·association–复杂类型联合;许多查询结果合成这个类型

    o嵌套结果映射– associations能引用自身,或者从其它地方引用,

    ·collection–复杂类型集合

    o嵌套结果映射– collections能引用自身,或者从其它地方引用

    ·discriminator使用一个结果值以决定使用哪个resultMap

    ocase–基于不同值的结果映射

    §嵌套结果映射–case也能引用它自身, 所以也能包含这些同样的元素。它也可以从外部引用resultMap

     注意:

    public class A{
    private B b1;
    private List<B> b2;
    }
    在映射b1属性时用association标签, 映射b2时用collection标签,分别是一对一,一对多的关系

     

    id, result元素

    <id property="id" column="post_id"/>

    <result property="subject" column="post_subject"/>

    这是最基本的结果集映射。id 和result 将列映射到属性或简单的数据类型字段(String, int, double, Date等)。

    这两者唯一不同的是,在比较对象实例时id 作为结果集的标识属性。这有助于提高总体性能,特别是应用缓存和嵌套结果映射的时候。

    Id、result属性如下:

    Attribute

    Description

    property

    映射数据库列的字段或属性。如果JavaBean 的属性与给定的名称匹配,就会使用匹配的名字。否则,MyBatis 将搜索给定名称的字段。两种情况下您都可以使用逗点的属性形式。比如,您可以映射到“username”,也可以映射到“address.street.number”。

    column

    数据库的列名或者列标签别名。与传递给resultSet.getString(columnName)的参数名称相同。

    javaType

    完整java类名或别名(参考上面的内置别名列表)。如果映射到一个JavaBean,那MyBatis 通常会自行检测到。然而,如果映射到一个HashMap,那您应该明确指定javaType 来确保所需行为。

    jdbcType

    这张表下面支持的JDBC类型列表列出的JDBC类型。这个属性只在insert,update或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果您直接编写JDBC代码,在允许为空值的情况下需要指定这个类型。

    typeHandler

    我们已经在文档中讨论过默认类型处理器。使用这个属性可以重写默认类型处理器。它的值可以是一个TypeHandler实现的完整类名,也可以是一个类型别名。


    支持的JDBC类型

    MyBatis支持如下的JDBC类型:

    BIT

    FLOAT

    CHAR

    TIMESTAMP

    OTHER

    UNDEFINED

    TINYINT

    REAL

    VARCHAR

    BINARY

    BLOB

    NVARCHAR

    SMALLINT

    DOUBLE

    LONGVARCHAR

    VARBINARY

    CLOB

    NCHAR

    INTEGER

    NUMERIC

    DATE

    LONGVARBINARY

    BOOLEAN

    NCLOB

    BIGINT

    DECIMAL

    TIME

    NULL

    CURSOR

     

    Constructor元素

    <constructor>

    <idArg column="id" javaType="int"/>

    <arg column=”username” javaType=”String”/>

    </constructor>

    当属性与DTO,或者与您自己的域模型一起工作的时候,许多场合要用到不变类。通常,包含引用,或者查找的数据很少或者数据不会改变的的表,适合映射到不变类中。构造器注入允许您在类实例化后给类设值,这不需要通过public方法。MyBatis同样也支持private属性和JavaBeans的私有属性达到这一点,但是一些用户可能更喜欢使用构造器注入。构造器元素可以做到这点。

    考虑下面的构造器:

    public class User {

    //…

    public User(int id, String username) {

    //…

    }

    //…

    }

    为了将结果注入构造器,MyBatis需要使用它的参数类型来标记构造器。Java没有办法通过参数名称来反射获得。因此当创建constructor 元素,确保参数是按顺序的并且指定了正确的类型。

    <constructor>

    <idArg column="id" javaType="int"/>

    <arg column=”username” javaType=”String”/>

    </constructor>

    其它的属性与规则与id、result元素的一样。

    Attribute

    Description

    column

    数据库的列名或者列标签别名。与传递给resultSet.getString(columnName)的参数名称相同。

    javaType

    完整java类名或别名(参考上面的内置别名列表)。如果映射到一个JavaBean,那MyBatis 通常会自行检测到。然而,如果映射到一个HashMap,那您应该明确指定javaType 来确保所需行为。

    jdbcType

    支持的JDBC类型列表中列出的JDBC类型。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果您直接编写JDBC代码,在允许为空值的情况下需要指定这个类型。

    typeHandler

    我们已经在文档中讨论过默认类型处理器。使用这个属性可以重写默认类型处理器。它的值可以是一个TypeHandler实现的完整类名,也可以是一个类型别名。

     

    Association元素

    <association property="author" column="blog_author_id" javaType=" Author">

    <id property="id" column="author_id"/>

    <result property="username" column="author_username"/>

    </association>

    Association元素处理“has-one”(一对一)这种类型关系。比如在我们的例子中,一个Blog有一个Author。联合映射与其它的结果集映射工作方式差不多,指定property、column、javaType(通常MyBatis会自动识别)、jdbcType(如果需要)、typeHandler。

    不同的地方是您需要告诉MyBatis 如何加载一个联合查询。MyBatis使用两种方式来加载:

    ·Nested Select:通过执行另一个返回预期复杂类型的映射SQL语句(即引用外部定义好的SQL语句块)。

    ·Nested Results:通过嵌套结果映射(nested result mappings)来处理联接结果集(joined results)的重复子集。

    首先,让我们检查一下元素属性。正如您看到的,它不同于普通只有select和resultMap属性的结果映射。

    Attribute

    Description

    property

    映射数据库列的字段或属性。如果JavaBean 的属性与给定的名称匹配,就会使用匹配的名字。否则,MyBatis 将搜索给定名称的字段。两种情况下您都可以使用逗点的属性形式。比如,您可以映射到”username”,也可以映射到更复杂点的”address.street.number”。

    column

    数据库的列名或者列标签别名。与传递给resultSet.getString(columnName)的参数名称相同。

    注意: 在处理组合键时,您可以使用column= “{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。

    javaType

    完整java类名或别名(参考上面的内置别名列表)。如果映射到一个JavaBean,那MyBatis 通常会自行检测到。然而,如果映射到一个HashMap,那您应该明确指定javaType 来确保所需行为。

    jdbcType

    支持的JDBC类型列表中列出的JDBC类型。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果您直接编写JDBC代码,在允许为空值的情况下需要指定这个类型。

    typeHandler

    我们已经在文档中讨论过默认类型处理器。使用这个属性可以重写默认类型处理器。它的值可以是一个TypeHandler实现的完整类名,也可以是一个类型别名。

    联合嵌套选择(Nested Select for Association)

    select

    通过这个属性,通过ID引用另一个加载复杂类型的映射语句。从指定列属性中返回的值,将作为参数设置给目标select 语句。表格下方将有一个例子。注意:在处理组合键时,您可以使用column=”{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套语句。这就会把prop1和prop2设置到目标嵌套语句的参数对象中。

    参考:https://www.cnblogs.com/yansum/p/5774873.html也有自己的总结

    下面是我的对应的association和collection对照截图

     

     

     

     

     

     

     终极杀招config.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">
      <!-- 属性标签 ,引入外部的properties的文件内容
      		resource:引入类路径的
      		url:引入网络路径或者磁盘路径下的资源
      -->
      
      <configuration>
    	
      <!-- setting标签:用来设置每个选项 name:设置选项的名字 value:值 -->		
      <properties resource="jdbc.properties">
      	</properties>
      	
    	<settings>
    	<!-- 驼峰:emp_name-> empName-->
    		<setting name="mapUnderscoreToCamelCase" value="true"/>
     		<setting name="lazyLoadingEnabled" value="true"/><!-- 延迟加载 -->
    		<setting name="aggressiveLazyLoading" value="false"/>
    	</settings>
    	
    	<!-- 起实体类类名简化全类名代码 -->
    <typeAliases>
    <!-- 给java类型起别名 默认首字母小写,指定别名:alias匹配 -->
    	<!-- <typeAlias type="com.tz.domain.Employee" alias="employee"/> -->
    	<!-- 批量起别名 为某个包下的所有类起别名 可以使用@Alias注解	为某个类型指定新的别名,别名不区分大小写 -->
    	<package name="com.tz.domain"/>
    </typeAliases>	  
    
    
    <!-- 环境,mybatis可以配置多种环境 -->
      	<environments default="mysql"><!-- 配置环境的唯一标识 -->
         <environment id="development">
         <!-- 配置事务管理器的类型
         事务管理器(transactionManager)
    
    在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
    
    JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
    MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
    <transactionManager type="MANAGED">
      <property name="closeConnection" value="false"/>
    </transactionManager> 
    	一般用spring的事务管理器	
    -->
          <transactionManager type="JDBC"/>
          <!-- 数据源类型 type="数据源类型"
          
          POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。
          UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。
          JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
           -->
          <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driverClass}"/>
            <property name="url" value="${jdbc.jdbcUrl}"/>
            <property name="username" value="${jdbc.user}"/>
            <property name="password" value="${jdbc.password}"/>
          </dataSource>
        </environment>
        
         <environment id="mysql">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driverClass}"/>
            <property name="url" value="${jdbc.jdbcUrl}"/>
            <property name="username" value="${jdbc.user}"/>
            <property name="password" value="${jdbc.password}"/>
          </dataSource>
        </environment>
      </environments>
      <!-- 数据库厂商标识 type指定数据库标识 -->
    <databaseIdProvider type="DB_VENDOR">
    	<!-- 为不同的数据库厂商标识别名 -->
    	<property name="MySQL" value="mysql"/>
    	<!-- <property name="Oracle" value="oracle"/> -->
    </databaseIdProvider>
    
    <!-- 将sql映射到全局配置文件中 -->
      <mappers>
      	<!-- mapper:指定一个sql映射文件 resource:引用类路径下的sql文件 url:引入网络路径或者磁盘路径下的资源
      		class:引用接口全类名
      		1.有映射文件,文件名必须和ji接口名一致,并且还需要与接口在同一目录下
      		2.没有映射文件,所有的sql语句可以利用注解卸载接口的方法上(不推荐使用)@select(...)
      	 -->
        <!-- <mapper resource="EmployeeMapper.xml"/> -->
        <!-- 批量配置 -->
      <package name="com.tz.dao"/>	
      </mappers>
      </configuration>
      	
    

      这个mybatis的比较重要的总结先这么多

  • 相关阅读:
    QPS、PV和需要部署机器数量计算公式
    libevent 源码深度剖析十三
    libevent源码深度剖析十二
    libevent源码深度剖析十一
    libevent源码深度剖析十
    libevent源码深度剖析九
    libevent源码深度剖析八
    ADO.NET入门教程(三) 连接字符串,你小觑了吗?
    配置文件的使用,如果要跨平台,建议直接用 xml, json, ini 或者本文档,看自己方便
    firemonkey 去掉ios 虚拟键盘上的‘done’toolbar
  • 原文地址:https://www.cnblogs.com/luyuan-chen/p/11592237.html
Copyright © 2011-2022 走看看