Mybatis关联映射(一对一)
数据库中表与表之间的关系或者说是实体与实体之间的关系,例如学生与班级,从学生的角度看。
数据表二张:
班级
tb_clazz( id, // 班级号 cname) // 班级名称
学生
tb_student( id, loginname, password, username, clazz_id) // clazz_id 引用班级表中的id,是一个外键
实体类二个:
班级
Clazz{ id, cname; }
学生
student{ id; loginname; password; username; Clazz clazz; //班级类作为成员变量 }
ClazzMapper.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.mapper.ClazzMapper">
<select id = "selectClazzById" parameterType="int" resultType="clazz">
select * from tb_clazz where id=#{id}
</select>
</mapper>
<select>元素实现了根据id对tb_clazz表的查询,返回的是clazz对象,即为一条记录。
这一段代码实现了tb_class与Clazz类之间的映射。
StudentMapper.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.mapper.StudentMapper">
<select id="selectStudentById" resultMap="studentMap">
select * from tb_student where id = #{id}
</select>
<resultMap type="student" id="studentMap">
<id property = "id" column="id"/>
<result property = "loginname" column="loginname"/>
<result property = "password" column="password"/>
<result property = "username" column="username"/>
<association property="clazz" column="clazz_id"
select="com.mapper.Clazzmapper.seleceClazzById"
javaType="clazz"/>
</resultmap>
</mapper>
<select>实现了id对学生表的查询,返回值为resultMap,下面是定义,其类型又为一个student,实现了student类与tb_student的映射(因为类中的clazz是个类,而表中的clazz_id为intger,所以用resultMap表达复杂的查询结果)
是这样实现的:
当查询学生id时,会查询所有的信息,loginname三个简单的数据能直接得到,后面的clazz类是这样得到的:把clazz_id传给了clazzy映射文件的查询语句。
总之:
要用mybatis操作一对一关联的表,需要数据库二个表通过外键关联。二,有外键的表对应的类中要有宁外一个类的实体类作为成员变量(属性)。分别为2个表创建映射文件,在有外键的表对应的映射文件,将<resultmap>元素中的<association>与宁外一个表的映射文件中有关的<select>元素关联起来。