javaee mybatis —關係映射,一對一映射

一對一關係就是一個對一個,比方說一個班只有一個班主任,一個班主任只能帶一個班:一個人只有一個身份證號,一個身份證號只代表一個人。。。下面就用班主任和班級來舉例

首先要生成兩張數據表class表和headteacher表

 


教師號作爲了班級表的外鍵

三種方法(三種方法生成不同的生成po類)

1,這種方法只需要定義po類,就是把所有的屬性放在同一個類中

package lu.nynu.po;

public class TClass {
	Integer cId;
	String cName;
	Integer htId;
	String  htName;
	public Integer getcId() {
		return cId;
	}
	public void setcId(Integer cId) {
		this.cId = cId;
	}
	public String getcName() {
		return cName;
	}
	public void setcName(String cName) {
		this.cName = cName;
	}
	public Integer getHtId() {
		return htId;
	}
	public void setHtId(Integer htId) {
		this.htId = htId;
	}
	public String getHtName() {
		return htName;
	}
	public void setHtName(String htName) {
		this.htName = htName;
	}
	
}如果需要輸出還可以重寫tostring方法

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="lu.nynu.mapper.TClassMapper">
	<resultMap type="lu.nynu.po.TClass" id="tClassMap">
		<id column="c_id" property="cId" />
		<result column="c_name" property="cName" />
		<result column="ht_id" property="htId" />
		<result column="ht_name" property="htName" />
		<result column="ht_sex" property="htSex" />
	</resultMap>
	<select id="selectClassById" parameterType="Integer" resultMap="tClassMap">     <!--  parameterType傳入參數類型 -->
		select h.* ,c.c_id , c.c_name from t_headteacher h ,t_class c where
		h.ht_id=c.c_ht_id and c.c_id=#{cId}
	</select>
</mapper>
 

會存在po類定義的屬性和數據庫中的屬性不匹配的情況,所以要用resultmap一一對應

對應Java接口,名字一定要數一

package lu.nynu.mapper;

import lu.nynu.po.TClass;

public interface TClassMapper {
	public  TClass selectClassById(Integer id);

}

測試方法

package lu.nynu.test;

import lu.nynu.mapper.TClassMapper;
import lu.nynu.po.TClass;
import lu.nynu.utils.MybtaisUtils;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class MybatisTest {	
	@Test
	public void test() throws Exception {

		SqlSession sqlSession = MybtaisUtils.getSqlSession();
		
		TClassMapper classMapper=sqlSession.getMapper(TClassMapper.class);
		TClass class1= classMapper.selectClassById(1);
		System.out.println(class1);	
		sqlSession.close();
	}
}

2,嵌套結果查詢

班主任po類

        Integer htId;
	String  htName;
	String htSex;
班級po類
        Integer cId;
	String cName;
	THeadteacher headteacher;//班主任對象

生成get/set,tostring方法

跟第一種方法類似,sql語句一樣,重點是resultmap的對應關係,一對一關係要用association關鍵字

<?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="lu.nynu.mapper.TClassMapper">


	<select id="selectClassById" parameterType="Integer" resultMap="tClassMap">
		select h.* ,c.c_id , c.c_name from t_headteacher h ,t_class c
		where h.ht_id=c.c_ht_id and c.c_id=#{cId}
	</select>

    <!-- 嵌套結果 -->
	<resultMap type="lu.nynu.po.TClass" id="tClassMap">
		<id column="c_id" property="cId" />
		<result column="c_name" property="cName" />
		<association property="headteacher" column="ht_id"
			javaType="lu.nynu.po.THeadteacher">
			<id column="ht_id" property="htId" />			
			<result column="ht_name" property="htName" />
			<result column="ht_sex" property="htSex" />
		</association>
	</resultMap>
</mapper> 

property:在一個類中定義的另一個類的對象名,注意大小寫

column:另一個類的主鍵(班主任)

javaType:對象名所在的類的qualified name

(個人理解,可能會有偏差)

測試方法和java接口跟第一種方法相同。

3,嵌套語句查詢

po類和第二個方法相同,也是分別定義。

第三種方法跟前兩種在sql寫法上跟前兩種都不同

<?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="lu.nynu.mapper.TClassMapper">

	<resultMap type="lu.nynu.po.TClass" id="tClassMap">
		<id column="c_id" property="cId" />
		<result column="c_name" property="cName" />
		
		<association property="headteacher"  
		column="c_ht_id" 
		select="lu.nynu.mapper.TClassMapper.selectHeadteacherById"  
		javaType="lu.nynu.po.THeadteacher"  />	
				
		<!-- 嵌套查詢
		property 班級類中的班主任對象名    
		 column   班級表忠的班主任id 
		 select  班主任xml文件中查詢id(包名+Id) 
		 javaType 班級類中的班主任對象的類型 -->
	</resultMap>

	<select id="selectClassById" parameterType="Integer" resultMap="tClassMap">
		select * from t_class where c_id=#{cId}
	</select>
	
	<resultMap type="lu.nynu.po.THeadteacher" id="tHeadteacherMap">
		<id column="ht_id" property="htId" />
		<result column="ht_name" property="htName" />
		<result column="ht_sex" property="htSex" />		
	</resultMap>	
	<select id="selectHeadteacherById" parameterType="integer" resultMap="tHeadteacherMap">
	    select * from t_headteacher where ht_id=#{htId}
	</select>
</mapper>

要注意第三種的column和第二種的含義是不一樣的,第二種是下面定義的另一個類的對應字段(另一個類的主鍵),第三種是本類的對應的另個類的字段(就是指本類外鍵)。

這種方法都寫在一個xml文件中會造成代碼混亂,如果想要清楚的話可以把不同的查詢語句放到不同的xml文件中,記得生成對應接口,修改一下<select/>中的包名。

測試類的java接口跟之前的相同

(僅供參考,畢竟剛學)

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