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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章