一对一关系就是一个对一个,比方说一个班只有一个班主任,一个班主任只能带一个班:一个人只有一个身份证号,一个身份证号只代表一个人。。。下面就用班主任和班级来举例
首先要生成两张数据表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接口跟之前的相同
(仅供参考,毕竟刚学)