- 例子:一个人可以有多条狗,所以person表和dog表,就有一对多的关系。在多的一方外键关联少的一方,也就是dog表里的pid关联person表的id,如下:张三有两条狗,旺财和旺旺。那么mybatis里是如何将这种关系映射到对象上的呢?
- 数据库表person和dog
package com.yicha.entity;
//Person2.java
import java.util.List;
public class Person2 {
private int id;
private String name;
private List<Dog> dogList;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Dog> getDogList() {
return dogList;
}
public void setDogList(List<Dog> dogList) {
this.dogList = dogList;
}
}
package com.yicha.entity;
//Dog.java
public class Dog {
private int id;
private String name;
private int pid;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
}
Person2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD SQL Map 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.yicha.entity.Person2">
<!-- 自定义结果映射 -->
<resultMap type="Person2" id="myMap">
<result property="id" column="id"/>
<result property="name" column="pname"/>
<collection property="dogList" ofType="Dog">
<result property="name" column="dname"/>
</collection>
</resultMap>
<select id="find1" resultMap="myMap">
SELECT a.id,a.name AS pname,b.name AS dname
FROM person a
LEFT JOIN dog b
ON a.id=b.pid
WHERE a.id=1
</select>
</mapper>
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<!-- 配置懒加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!-- 取别名 -->
<typeAliases>
<typeAlias type="com.yicha.entity.Person" alias="Person"/>
<typeAlias type="com.yicha.entity.Card" alias="Card"/>
<typeAlias type="com.yicha.entity.Dog" alias="Dog"/>
<typeAlias type="com.yicha.entity.Person2" alias="Person2"/>
</typeAliases>
<!-- 配环境 -->
<environments default="e1">
<environment id="e1">
<!-- 先配事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root1205"/>
</dataSource>
</environment>
</environments>
<!-- 实体类映射文件 -->
<mappers>
<mapper resource="com/yicha/entity/Person.xml"/>
<mapper resource="com/yicha/entity/Card.xml"/>
<mapper resource="com/yicha/entity/Person2.xml"/>
</mappers>
</configuration>
测试类
package com.yicha.test;
//Demo1.java
import java.io.IOException;
import java.io.Reader;
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 com.yicha.entity.Person;
public class Demo1 {
public static void main(String[] args) {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = null;
SqlSession session = null;
try {
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
factory = builder.build(reader);
session = factory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
// Person p = session.selectOne("find1");
// System.out.println(p.getCard().getCardNum());
session.selectOne("com.yicha.entity.Person2.find1");
//注意这里仍然用的是selectOne,实际上查询结果是两条数据,但是封装到一个Person2对象里了
//这种封装避免了冗余封装
}
}
结果: