一、引入
在数据库的多表查询中,难免会出现查询到的多条从表数据的外键字段对应主表的同一条数据,举一例在购物网站的用户数据库中,用户数据表内的一个数据可能对应多条地址表内的数据,也有可能只有一个,本篇就简单聊一聊MyBatis多表查询中一对一及一对多的问题。
二、MyBatis多表查询
(1)一对多问题
定义UserInfo类:
public class UserInfo {
private int id;
private String UserName;
private String password;
private String realName;
private int age;
private List<Address> list ;//定义地址集合,即一个用户对应多个地址
public List<Address> getList() {
return list;
}
public void setList(List<Address> list) {
this.list = list;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
定义Address类:
public class Address {
private int id;
private int userId;
private String realName;
private String mobile;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
在mapper文件中配置SQL语句:
<?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.jd.userInfo.dao.IUserInfoDao">
<resultMap type="com.jd.vo.UserInfo" id="ui">
<id column="ui_id" property="id"/>
<result column="user_name" property="userName"/>
<result column="password" property="password"/>
<result column="ui_real_name" property="realName"/>
<result column="age" property="age"/>
<collection property="list" ofType="com.jd.vo.Address"><!--一对多时采用collection标签,oftype属性用于设置集合泛型-->
<id column="address_id" property="id"/>
<result column="addr_real_name" property="realName"/>
<result column="mobile" property="mobile"/>
<result column="address" property="address"/>
</collection>
</resultMap>
<select id="get" resultMap="ui">
select
ui.id ui_id,user_name,password,ui.real_name ui_real_name,age,
addr.id address_id,addr.real_name addr_real_name,mobile,address
from user_info ui
LEFT JOIN address addr on addr.user_id=ui.id
where ui.id=#{id}
</select>
</mapper>
定义Test类:
import java.io.IOException;
import java.io.InputStream;
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.jd.userInfo.dao.IUserInfoDao;
import com.jd.vo.UserInfo;
public class Test {
public static void main(String[] args) {
try {
InputStream inputStream = Resources.getResourceAsStream("myBatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
IUserInfoDao userInfoDao = sqlSession.getMapper(IUserInfoDao.class);
UserInfo ui = new UserInfo();
ui.setId(1);
UserInfo userInfo = userInfoDao.get(ui);
System.out.println(userInfo.getList().size());//输出id值为1用户的地址集合容量
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
(2)一对一 问题
更改UserInfo类:
public class UserInfo {
private int id;
private String UserName;
private String password;
private String realName;
private int age;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
更改mapper配置:
<?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.jd.userInfo.dao.IUserInfoDao">
<resultMap type="com.jd.vo.UserInfo" id="ui">
<id column="ui_id" property="id"/>
<result column="user_name" property="userName"/>
<result column="password" property="password"/>
<result column="ui_real_name" property="realName"/>
<result column="age" property="age"/>
<association property="address" javaType="com.jd.vo.Address"><!--一对一时使用association标签,javatype属性用于设置对象类型-->
<id column="address_id" property="id"/>
<result column="addr_real_name" property="realName"/>
<result column="mobile" property="mobile"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="get" resultMap="ui">
select
ui.id ui_id,user_name,password,ui.real_name ui_real_name,age,
addr.id address_id,addr.real_name addr_real_name,mobile,address
from user_info ui
LEFT JOIN address addr on addr.user_id=ui.id
where ui.id=#{id}
</select>
</mapper>
更改Test类:
import java.io.IOException;
import java.io.InputStream;
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.jd.userInfo.dao.IUserInfoDao;
import com.jd.vo.UserInfo;
public class Test {
public static void main(String[] args) {
try {
InputStream inputStream = Resources.getResourceAsStream("myBatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
IUserInfoDao userInfoDao = sqlSession.getMapper(IUserInfoDao.class);
UserInfo ui = new UserInfo();
ui.setId(1);
UserInfo userInfo = userInfoDao.get(ui);
System.out.println(userInfo.getAddress().getAddress());
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果: