实现高级映射的两种方式
- 通过xml文件配置,实现方式有两种。
第一种是继承方式,即新建一个类中包含需要查询结果的数据的属性。
第二种是连接方式,通过resultMap定义属性,在实体类中包含你的引用数据类型。 - 通过注解方式实现。
本次实验主要使用注解方式来实现一对一的高级映射。
实验步骤
背景描述:
一个用户只能拥有一张身份证。
项目结构:
1. 定义实体类
主表中必须要有一个字段对应从表中的字段,还有从表的实体。
Person类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Person {
private Integer p_id;
private String p_name;
private Integer p_age;
//对应从表的主键cid
private Integer cid;
//从表的实体
private Card card;
}
Card类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Card {
private Integer cid;
private String cname;
private Date year;
}
2. 定义mapper接口
在主表中的接口写映射results把我们这个主表中的所有属性都对应到这个result里面。
public interface PersonDao {
@Select("select * from person where p_id=#{p_id}")
@Results({
@Result(id=true,column = "p_id",property = "p_id"),
@Result(column = "p_name" ,property = "p_name"),
@Result(column = "p_age" ,property = "p_age"),
@Result(column = "cid",property = "card",
one=@One(select = "com.rg.mapper.CardDao.getCardById",fetchType = FetchType.EAGER)
)
})
Person getPersonById(Integer p_id) throws Exception;
}
public interface CardDao {
//通过id查询卡
@Select("select * from card where cid=#{cid}")
Card getCardById(Integer cid) throws Exception;
}
3. 在config.xml中配置接口
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<properties resource="jdbc.properties"></properties>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.rg.mapper.CardDao"></mapper>
<mapper class="com.rg.mapper.PersonDao"></mapper>
</mappers>
</configuration>
4. 测试
public class Test {
public static void main(String[] args) throws Exception {
InputStream inputstream = Resources.getResourceAsStream("config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
SqlSession session = sqlSessionFactory.openSession(true);
System.out.println(session);
PersonDao mapper = session.getMapper(PersonDao.class);
Person person = mapper.getPersonById(1001);
System.out.println(person);
}
}
运行截图: