一對一關係就是一個對一個,比方說一個班只有一個班主任,一個班主任只能帶一個班:一個人只有一個身份證號,一個身份證號只代表一個人。。。下面就用班主任和班級來舉例
首先要生成兩張數據表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接口跟之前的相同
(僅供參考,畢竟剛學)