1. 数据库表结构
- 在我们的生活中有许多的关联关系,我们大致可以分为三类,一对一,一对多,多对多三种,在这里我们借助Mybatis较为详细的介绍一下,一对一的关联实现
- 我们这里就以身份证和人的一对一关系为例,使用mybatis来处理这个关联关系
- 首先是idcard的数据库的设计,这里我的id设置了自增
4. 再就是myperson数据表的设计,我的id设置了自增
其中cid为外键关联的是idcard里面的id
2. 实体类结构
- 对于实体类的设计,我们正常生活中身份证应该是人的一个属性,所以我们的MyPerson类中应该把IdCard类作为一个私有属性,所以如下设计:
public class MyPerson {
private Integer id;
private String name;
private Integer age;
private String sex;
private IdCard idcard;//注意这里是实体类和数据库表有所不同的地方
//set和get方法这里省略
@Override
public String toString() {
return "MyPerson{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", idcard.id=" + idcard.getId() +
'}';
}
}
- 对于IdCard类的设计没有什么特别的,就是和数据库属性完全对应
public class IdCard {
private Integer id;
private String cno;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCno() {
return cno;
}
public void setCno(String cno) {
this.cno = cno;
}
}
3. Mapper.xml
- mybatis里面的Mapper.xml,就是为了描述我们的sql语句和结果如何映射到实体类的,这里为了设计方便,只展示查询方面的SQL语句,对于IdCard的,我们这里就做如下的设计:
<?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="xzw.dao.IdCardMapper">
<!-- 这个需要对应我们的对应的接口Mapper类-->
<select id="findIdCardById" parameterType="int" resultType="xzw.bean.IdCard">
select * from idcard where id = #{id}
</select>
<!-- 这里的id是SQL语句唯一的标识符,和对应的方法名需要保持相同,这样mybatis就能自动帮我们对应-->
</mapper>
在这里我也放上我的接口代码:
public interface IdCardMapper {
IdCard findIdCardById(int id);//注意和我们的id是对应的
}
这是注解版:
public interface IdCardMapper {
@Select("select * from idcard where id = #{id}")
IdCard findIdCardById(int id);
}
2.接着就是我们如何设计一些我们MyPersonMapper.xml的语句和怎么将查询出来的结果保存到我们的实体类(因为和数据库表不一样),我们这里采取的策略就是在查询的时候,我们查出来的cid属性,我们接着查询对应的IdCard类,然后将对应的结果放入我们的MyPerson类中
<?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="xzw.dao.MyPersonMapper">
<select id="findPersonById" parameterType="int" resultMap="MyPersonMap">
select * from myperson where id = #{id}
</select>
<resultMap id="MyPersonMap" type="xzw.bean.MyPerson">
<association property="idcard" javaType="xzw.bean.IdCard" column="cid" select="xzw.dao.IdCardMapper.findIdCardById"/>
</resultMap>
<!-- 因为这个查询出来的结果并不能直接对应赋值,所以我们需要使用resultMap标签指定它如何对应-->
<!-- 这里mybatis也为我们提供相应的标签实现,这里association标签会将cid属性,赋值到select语句对应的里面,然后赋值在-->
<!-- property标签也就是实体类属性名,这里的原理就是查出来的cid属性,会再进行一次查询,这个查询可以是你之间写好的-->
<update id="UpdatePerson" parameterType="xzw.bean.MyPerson">
update myperson set name=#{name},age=#{age},sex=#{sex},cid=#{idcard.id} where id=#{id}
</update>
<insert id="addPerson" parameterType="xzw.bean.MyPerson">
insert into myperson(name,age,sex,cid) values (#{id},#{name},#{age},#{idcard.id})
</insert>
<delete id="deletePersonById" parameterType="int">
delete from myperson where id= #{id}
</delete>
</mapper>
注解版:
@Select("select * from myperson where id = #{id} ")
@Results({
@Result(column = "cid",property = "idcard",one = @One(select = "xzw.dao.IdCardMapper.findIdCardById"))
})
MyPerson findPersonById(int id);