`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語句還可以延遲加載.