mybatis中一对一关系association标签的使用

网友投稿 565 2022-10-22

mybatis中一对一关系association标签的使用

mybatis中一对一关系association标签的使用

目录一对一关系association标签使用1、嵌套的resultMap2、嵌套的select语句association标签三种用法association的用法一association的用法二associathttp://ion的用法三

一对一关系association标签使用

association字面翻译为联合之意,java项目开发中常遇到一对一关系的结果,例如,一个商品对应一个生产商,在查询结果中如果某两个对象是一对一关系一般使用association标签,用法有两种:

1、嵌套的resultMap

一次性查询出所有结果的相关字段,结果把所有字段映射到不同的对象的类变量中

...

...

select ...最多查询出Model01,Model02所对应的所有字段

from table1(,table2可能需要)

where ...

order by ...

说明:

分别有两个类Model01,Model02,但Model01中有一个类变量的数据类型为Model02 ,id为 select01 的SQL语句所查询的结果映射到 map01 的对应 Model01 对象的各类变量中,因 map01 中使用 association 标签,其 property属性 指定 Model01 中的数据类型为 Model02 的类变量,JavaType属性指定该类变量的数据类型,即Model02,resultMap属性指定对应的结果映射为 map02,map02中列出了相应的表子段和类变量的映射关系,所以一次查出所有需要的字段,只是按不同形式映射到相应各个类的类变量中

2、嵌套的select语句

这种方式实为嵌套一个子查询语句查出关联的实体数据(会产生N+1问题,在多次循环中不好,建议在java层面进行业务分离)

例子如下:

...

...

select ...最多查询出Model03所对应的所有(不含Model04对应的字段)字段

from table1

where ...

order by ...

select ...最多查询出Model04所对应的所有字段

from table2

where ...

order by ...

说明:

分别有两个类 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

ID, NAME

select

from father

where ID = #{id,jdbcType=INTEGER}

SonMapper.xml

ID, FATHER_ID, NAME

select

from son

where ID = #{id,jdbcType=INTEGER}

association的用法一

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

son.ID, son.NAME, father.ID AS F_ID, father.NAME AS F_NAME

parameterType="java.lang.Integer">

select

from son, father

where son.FATHER_ID=father.ID AND son.ID = #{id,jdbcType=INTEGER}

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

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

association的用法二

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

son.ID, son.NAME, father.ID AS F_ID, father.NAME AS F_NAME

parameterType="java.lang.Integer">

select

from son, father

where son.FATHER_ID=father.ID AND son.ID = #{id,jdbcType=INTEGER}

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

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

association的用法三

给association传入一个select

ID, NAME, FATHER_ID

parameterType="java.lang.Integer">

select

from son

where ID = #{id,jdbcType=INTEGER}

这种方式相当于将原来的

替换成

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:CF500B
下一篇:bzoj2938 [Poi2000]病毒
相关文章

 发表评论

暂时没有评论,来抢沙发吧~