mybatis association用法,mybatis association作用

  mybatis association用法,mybatis association作用

  00-1010一对一关系关联标签使用1、嵌套resultMap2、嵌套select语句关联标签三种用法——关联用法一、关联用法二、关联用法三

  

目录

协会字面翻译为联盟。在Java项目开发中经常会遇到一对一的关系结果。比如一个商品对应一个厂家。在查询结果中,如果两个对象是一对一的,一般使用关联标签。有两种用法:

 

  00-1010一次性查询所有结果的相关字段,结果所有字段映射到不同对象的类变量。

  结果映射id=map01 类型=Model01 id列= . 属性=“.”/result column= . 属性=“.”.- Model01和Model02有一对一的关系-association property= model 01中数据类型为Model02的类变量的名称 Java type= model 02 result map= map 02 //resultMapresultMap id= map 02 type= model 02 id column= . 属性=“.”/result column= . 属性=“.”./result map select id= select 01 result map= map 01 select.最多,对应于模型01和模型02的所有字段可以从表1中找到(并且表2可能需要它),其中.以.排序./选择说明:.

  有两个类,分别是Model01和Model02,但是Model01中一个类变量的数据类型是Model02,id为select01的SQL语句的查询结果映射到map01中对应Model01对象的各个变量。因为在map01中使用了association标签,所以它的property属性指定了Model01中数据类型为Model02的class变量,JavaType属性指定了这个class变量的数据类型,即Model02,resultMap属性指定了对应的结果映射到map02。map02列出了对应的表段和类变量之间的映射关系,所以所有的必填字段都一下子找了出来,只以不同的形式映射到对应类的类变量上。

  00-1010这种方法实际上是嵌套一个子查询语句来找出相关的实体数据(会造成N 1的问题,多循环不好,建议在java层面把业务分开)

  例子如下:

  结果映射id=map03 类型=Model03 id列= . 属性=“.”/Column= . 属性=“.”.association property= model 03中类变量的名称 Java type= Model04 column=对应于map03查询结果的某个字段,而该字段正是参数值 select= X namespace . select 04 //resultmapresultmap id= map 04 type= model 04 id column= . 属性=“.”/result column= . 属性=“.”./Resultmapselect id= select03 参数type= Java数据类型 resultMap=map03 select.最多可以从表1中找到对应于模型03的所有字段(不包括对应于模型04的字段),其中.排序依据。/selectselect id= select04 参数类型= Java数据类型 resul

  tMap="map04">    select ...最多查询出Model04所对应的所有字段     from table2     where ...     order by ...</select>说明:

  分别有两个类 Model03,Model04,但Model03中有一个类变量的数据类型为Model04 ,id 为 select03 的SQL语句所查询的结果映射到 map03 的对应 Model03 对象的各类变量中,因 map03 中使用 association 标签,其 property属性 指定 Model03 中的数据类型为 Model04 的类变量,column属性为 map03 中的某字段,该字段值正是子查询select04所需的参数,select属性为指定需要的子查询,即ID为select04的子查询,map04中列出本查询结果相应的表子段和类变量的映射关系,所以首先查出父对象所有需要的所有字段,完成映射,同时使用嵌套的子查询查出所需的字段并映射到相应的类,再把该类付给父级对象对应的变量

  

 

  

association标签三种用法

`father`表

 

  

CREATE TABLE `father` (  `ID` int(11) NOT NULL,  `NAME` varchar(255) DEFAULT NULL,  PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `father` VALUES (1, 李靖);INSERT INTO `father` VALUES (2, 康熙);

`son`表

 

  

CREATE TABLE `son` (  `ID` int(11) NOT NULL,  `FATHER_ID` int(11) DEFAULT NULL,  `NAME` varchar(255) DEFAULT NULL,  PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `son` VALUES (1, 2, 雍正);INSERT INTO `son` VALUES (2, 1, 哪吒);

Father.java

 

  

public class Father {    private Integer id;     private String name;     public Integer getId() {        return id;    }     public void setId(Integer id) {        this.id = id;    }     public String getName() {        return name;    }     public void setName(String name) {        this.name = name == null ? null : name.trim();    }}

Son.java

 

  

public class Son {    private Integer id;     private Father father;     private String name;     public Integer getId() {        return id;    }     public void setId(Integer id) {        this.id = id;    }     public Father getFather() {        return father;    }     public void setFather(Father father) {        this.father = father;    }     public String getName() {        return name;    }     public void setName(String name) {        this.name = name == null ? null : name.trim();    }}

FatherMapper.xml

 

  

<?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="com.ksy.kuaishiyan.mapper.FatherMapper" >    <resultMap id="BaseResultMap" type="com.ksy.kuaishiyan.entity.Father" >    <id column="ID" property="id" jdbcType="INTEGER" />    <result column="NAME" property="name" jdbcType="VARCHAR" />  </resultMap>    <sql id="Base_Column_List" >    ID, NAME  </sql>    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >    select     <include refid="Base_Column_List" />    from father    where ID = #{id,jdbcType=INTEGER}  </select>  </mapper>

SonMapper.xml

 

  

<?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="com.ksy.kuaishiyan.mapper.SonMapper" >   <resultMap id="BaseResultMap" type="com.ksy.kuaishiyan.entity.Son" >    <id column="ID" property="id" jdbcType="INTEGER" />    <result column="FATHER_ID" property="fatherId" jdbcType="INTEGER" />    <result column="NAME" property="name" jdbcType="VARCHAR" />  </resultMap>    <sql id="Base_Column_List" >    ID, FATHER_ID, NAME  </sql>    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >    select     <include refid="Base_Column_List" />    from son    where ID = #{id,jdbcType=INTEGER}  </select> </mapper>

 

  

association的用法一

直接在SonMapper.xml中的association标签里写对应的列名, 且列明需要写别名, 例如: father.ID AS F_ID

 

  

<?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="com.ksy.kuaishiyan.mapper.SonMapper">   <resultMap id="BaseResultMap" type="com.ksy.kuaishiyan.entity.Son">    <id column="ID" property="id" jdbcType="INTEGER" />    <result column="NAME" property="name" jdbcType="VARCHAR" />        <association property="father" javaType="com.ksy.kuaishiyan.entity.Father">       <id column="F_ID" property="id" jdbcType="INTEGER" />        <result column="F_NAME" property="name" jdbcType="VARCHAR" />    </association>  </resultMap>   <sql id="Base_Column_List">    son.ID, son.NAME, father.ID AS F_ID, father.NAME AS F_NAME  </sql>   <select id="selectByPrimaryKey" resultMap="BaseResultMap"    parameterType="java.lang.Integer">    select    <include refid="Base_Column_List" />    from son, father    where son.FATHER_ID=father.ID AND son.ID = #{id,jdbcType=INTEGER}  </select> </mapper>

调用selectByPrimaryKey传入id=2, 查询结果如下

 

  

{ "id": 2, "father": { "id": 1, "name": "李靖" }, "name": "哪吒"}

 

  

 

  

association的用法二

association传入一个ResultMap, 改写SonMapper.xml

 

  

<?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="com.ksy.kuaishiyan.mapper.SonMapper">   <resultMap id="BaseResultMap" type="com.ksy.kuaishiyan.entity.Son">    <id column="ID" property="id" jdbcType="INTEGER" />    <result column="NAME" property="name" jdbcType="VARCHAR" />        <association property="father" javaType="com.ksy.kuaishiyan.entity.Father" resultMap="com.ksy.kuaishiyan.mapper.FatherMapper.BaseResultMap"></association>  </resultMap>   <sql id="Base_Column_List">    son.ID, son.NAME, father.ID AS F_ID, father.NAME AS F_NAME  </sql>   <select id="selectByPrimaryKey" resultMap="BaseResultMap"    parameterType="java.lang.Integer">    select    <include refid="Base_Column_List" />    from son, father    where son.FATHER_ID=father.ID AND son.ID = #{id,jdbcType=INTEGER}  </select> </mapper>

association 标签中resultMap属性指向FatherMapper.xml中的BaseResultMap, 这种情况下要求father表和son表没有相同名字的字段, 否则会失败. 调用selectByPrimaryKey传入id=2, 查询结果失败如下:

 

  

{ "id": 2, "father": { "id": 2, "name": "哪吒" }, "name": "哪吒"}

 

  

 

  

association的用法三

给association传入一个select

 

  

<?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="com.ksy.kuaishiyan.mapper.SonMapper">   <resultMap id="BaseResultMap" type="com.ksy.kuaishiyan.entity.Son">    <id column="ID" property="id" jdbcType="INTEGER" />    <result column="NAME" property="name" jdbcType="VARCHAR" />        <association column="FATHER_ID" property="father" javaType="com.ksy.kuaishiyan.entity.Father" select="com.ksy.kuaishiyan.mapper.FatherMapper.selectByPrimaryKey"></association>  </resultMap>   <sql id="Base_Column_List">    ID, NAME, FATHER_ID  </sql>   <select id="selectByPrimaryKey" resultMap="BaseResultMap"    parameterType="java.lang.Integer">    select    <include refid="Base_Column_List" />    from son    where ID = #{id,jdbcType=INTEGER}  </select> </mapper>

这种方式相当于将原来的

 

  

<result column="FATHER_ID" property="fatherId" jdbcType="INTEGER" />

替换成

 

  

<association column="FATHER_ID" property="father" javaType="com.ksy.kuaishiyan.entity.Father" select="com.ksy.kuaishiyan.mapper.FatherMapper.selectByPrimaryKey"></association>

改动最小, 需要assonciation标签放到所有result标签之后, select语句还可以延迟加载.

 

  在一个<resultMap/>中,属性出现的先后顺序必须是:constructor-->id --> result--> association-->collection -->discriminator。

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: