接口形式
package com.hspedu.mapper;
import com.hspedu.entity.Person;
public interface PersonMapper {
//通过person的id获取到Person,包括这个Person关联的IdenCard对象【级联查询】
public Person getPersonById(Integer id);
//通过person的id获取到Person,包括这个Person关联的IdenCard对象【级联查询】 方式2
public Person getPersonById2(Integer id);
//需要在PersonMapper新建一个方法来解决idenCard反向查询得到Person对象/数据
public Person getPersonByCardId(Integer cardId);
}
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 xml 文件
2.该文件可以去实现对应接口的方法
3.namespace 指定该xml文件和哪个接口对应
<mapper namespace="com.hspedu.mapper.MonsterMapper"> 别乱写 重建项目的时候卡在这里
-->
<mapper namespace="com.hspedu.mapper.PersonMapper">
<!-- 配置实现 getPersonById 通过personid 获取Person 并且实现级联
resultType="Person"如果简单的配置 就会把IdenCard card =》置空
使用resultMap 搞定
因为getPersonById 最终返回的是Person对象【只是有级联属性】
-->
<resultMap id="PersonResult" type="Person">
<!-- 可优化 标记出作为ID的结果可以提高整体性能 <result property="id" column="id"/>-->
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- association 复杂的关联类型 property="card"表示对Person的card属性-->
<association property="card" javaType="IdenCard">
<result property="id" column="id"/>
<result property="card_sn" column="card_sn"/>
</association>
</resultMap>
<!-- 必须用resultMap=-->
<select id="getPersonById" parameterType="Integer" resultMap="PersonResult">
SELECT * FROM `person`,`idencard` WHERE person.id = #{id} AND person.card_id = idencard.id
</select>
<!-- 第二种一对一-->
<resultMap id="PersonResultMap2" type="Person">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 1.第二种方式核心思想就是将多表联查分解成单表操作 简洁 易于维护 而且可以复用已经写好的方法 建议用这种
2.property="card" 表示person对象的card属性
3.column="card_id" 表示 card_id字段
4.返回的 字段 card_id 信息数据 作为getIdenCardById入参
-->
<association property="card" column="card_id"
select="com.hspedu.mapper.IdenCardMapper.getIdenCardById"/>
</resultMap>
<select id="getPersonById2" parameterType="Integer" resultMap="PersonResultMap2">
SELECT * FROM `person` WHERE `id` = #{id}
</select>
<!-- =========================homework需要配置的方法===================================-->
<!-- //需要在PersonMapper新建一个方法来解决idenCard反向查询得到Person对象/数据-->
<select id="getPersonByCardId" parameterType="Integer" resultType="Person">
SELECT * FROM person WHERE `card_id` = #{id}
</select>
</mapper>
下面是idenCard的接口形式
public interface IdenCardMapper {
//根据id获取到身份证序列号
public IdenCard getIdenCardById(Integer id);
//根据id级联查询到Person【作业】
public IdenCard getIdenCardById2(Integer id);
}
下面是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 xml 文件
2.该文件可以去实现对应接口的方法
3.namespace 指定该xml文件和哪个接口对应
<mapper namespace="com.hspedu.mapper.MonsterMapper"> 别乱写 重建项目的时候卡在这里
-->
<mapper namespace="com.hspedu.mapper.IdenCardMapper">
<!-- 配置实现 public IdenCard getIdenCardById(Integer id); IdenCard可以直接写的原因-->
<select id="getIdenCardById" parameterType="Integer" resultType="IdenCard">
SELECT * FROM idencard WHERE `id` = #{id}
</select>
<!--=-===================================作业======================================-->
<resultMap id="IdenCardResultMap" type="IdenCard">
<id property="id" column="id"/>
<result property="card_sn" column="card_sn"/>
<!--
需要column="id"
需要 SELECT * FROM idencard WHERE id =#{id} 返回的id字段的值作为入参传递给
我们的一个方法,通过这个方法可以返回该idenCard对应的person
-->
<association property="person" column="id"
select="com.hspedu.mapper.PersonMapper.getPersonByCardId"/>
</resultMap>
<select id="getIdenCardById2" parameterType="Integer" resultMap="IdenCardResultMap">
SELECT * FROM idencard WHERE id =#{id}
</select>
</mapper>