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接口跟之前的相同

(仅供参考,毕竟刚学)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值