1.对个人和身份证这种一对一关联关系,来演示MyBatis的关联映射查询的使用;
(1)创建数据表
USE mybatis
CREATE TABLE tb_idcard(
id INT PRIMARY KEY AUTO_INCREMENT,
CODE VARCHAR(18));
INSERT INTO tb_idcard(CODE) VALUES('152221198711020624');
INSERT INTO tb_idcard(CODE) VALUES('152201199008150317);
CREATE TABLE tb_person(
id INT PRIMARY KEY AUTO INCREMENT,
name VARCHAR (32),
age INT,
sex VARCHAR(8),
card_id INT UNIQUE,
FOREIGN KEY(card_id) REFERENCES tb_idcard(id));
INSERT INTO tb_person(name,age,sex,card_id) VALUES('Cwy',19,'Girl',1);
INSERT INTO tb_person(name,age,sex,card_id) VALUES('Jon',19,'Boy',2);
(2)在项目com.itheima.pojo包下创建持久化类IdCard,用于封装身份证信息。
package com.itheima.pojo;
/**
* 身份证持久化类
*/
public class IdCard {
private Integer id;
private String code;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@Override
public String toString() {
return "IdCard{" +
"id=" + id +
", code='" + code + '\'' +
'}';
}
}
(3)在项目com.itheima.pojo包下创建持久化类Person,用于封装人员信息。
package com.itheima.pojo;
public class Person {
private Integer id;
private String name;
private Integer age;
private String sex;
private IdCard card;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public IdCard getCard() {
return card;
}
public void setCard(IdCard card) {
this.card = card;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", card=" + card +
'}';
}
}
(4)在mapper包中,创建身份证映射文件IdCardMapper.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.itheima.mapper.IdCardMapper">
<select id="findCodeById"
parameterType="Integer"
resultType="IdCard">
select * from tb_idcard where id=#{id}
</select>
</mapper>
(5)在mapper包中,创建身份证映射文件PersonMapper.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.itheima.mapper.PersonMapper">
<!--嵌套结果:-->
<select id="findPersonById2"
parameterType="Integer"
resultMap="IdCardWithPersonResult2">
select p.*,idcard.code
from tb_person p,tb_idcard idcard
where p.card_id=idcard.id
and p.id=#{id}
</select>
<resultMap id="IdCardWithPersonResult2" type="Person">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="sex" column="sex"/>
<association property="card"
javaType="IdCard">
<id property="id" column="card_id"/>
<result property="code" column="code"/>
</association>
</resultMap>
</mapper>
(6)核心配置文件mybatis-config.xml中,引入IdCardMapper.xml和PersonMapper.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="db.properties"/>
<typeAliases>
<package name="com.itheima.pojo"></package>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/IdCardMapper.xml"/>
<mapper resource="mapper/PersonMapper.xml"/>
</mappers>
</configuration>
(7)创建一个工具类在com.itheima.utils包下
package com.itheima.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.Reader;
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
Reader reader =
Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(reader);
}catch (Exception e){
e.printStackTrace();
}
}
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
(8)在测试类MyBatisTest中编写测试方法findPersonByIdTest2()
package com.itheima.test;
import com.itheima.pojo.Person;
import com.itheima.pojo.Users;
import com.itheima.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class MyBatisTest {
/**
* 嵌套结果
*/
@Test
public void findPersonByIdTest2(){
SqlSession session = MyBatisUtils.getSession();
Person person = session.selectOne("com.itheima.mapper.PersonMapper.findPersonById2",1);
System.out.println(person);
session.close();
}
}
(9)运行结果: