-
关系举例
- 一对多:比如说一个班级有很多学生,可是这个班级只有一个班主任。在这个班级中随便找一个人,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪几个学生。这里班主任和学生的关系就是一对多。
- 多对一:比如说一个班级有很多学生,可是这个班级只有一个班主任。在这个班级中随便找一个人,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪几个学生。这里学生和班主任的关系就是多对一。
- 一对一:比如说一个班级有很多学生,他们分别有不同的学号。一个学生对应一个学号,一个学号对应一个学生;通过学号能找到学生,通过学生也能得到学号,不会重复。这里学生和学号的关系就是一对一。
- 多对多:比如说一个班级有很多学生,他们有语文课、数学课、英语课等很多课。一门课有很多人上,一个人上很多门课。这里学生和课程的关系就是多对多。
注:1.一对一的使用方法:
(1)使用嵌套结果映射来处理重复的联合结果的子集 。
(2)通过执行另外一个SQL映射语句来返回预期的复杂类型。
2.一对多的实现方法:在多的一方的表里面,添加外键。
3.多对多的实现方法:必须要通过单独的一张表来表示。
-
ResultMap
resultMap是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。resultMap解决了当POJO类中的属性与数据库字段不一致的情况,通过resultMap,两者间形成映射关系,从而省去了sql语句中的 'as' 关键字,起到简化的作用。
<resultMap type="com.shxt.model.User" id="UserBaseResultMap" autoMapping="true">
<!-- 映射主键 -->
<id property="userId" column="user_id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<!-- 映射结果集 -->
<result property="userName" column="user_name"/>
<result property="pwd" column="password"/>
<result property="account" column="account"/>
<result property="fk_role_id" column="fk_role_id"/>
</resultMap>
注:数据类型详见http://www.mybatis.org/mybatis-3/zh/configuration.html中XML配置中的类型处理器。
-
多对一
关联的嵌套 Select 查询 :
UserMapper.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.shxt.model.User">
<resultMap type="com.shxt.model.User" id="UserBaseResultMap" autoMapping="true">
<!-- 映射主键 -->
<id property="userId" column="user_id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<!-- 映射结果集 -->
<result property="userName" column="user_name"/>
<result property="pwd" column="password"/>
<result property="account" column="account"/>
<result property="fk_role_id" column="fk_role_id"/>
<!-- 映射关联对象 -->
<association property="role" column="fk_role_id" select="com.shxt.model.Role.load"></association>
</resultMap>
<select id="load" parameterType="integer" resultMap="UserBaseResultMap">
select * from user where user_id=#{user_id}
</select>
</mapper>
RoleMapper.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.shxt.model.Role">
<resultMap type="com.shxt.model.Role" id="RoleBaseResultMap">
<id column="role_id" property="role_id"/>
<result property="role_name" column="role_name"/>
</resultMap>
<select id="load" parameterType="Integer" resultMap="RoleBaseResultMap">
select * from role where role_id=#{role_id}
</select>
</mapper>
User对应的POJO类:
package com.shxt.model;
public class User {
//注意:数据库里面的字段名,类里面的属性名,input标签name值要一致
private Integer userId;
private String userName;
private String pwd;
private String account;
private Integer fk_role_id;
private Role role;
public Integer getFk_role_id() {
return fk_role_id;
}
public void setFk_role_id(Integer fk_role_id) {
this.fk_role_id = fk_role_id;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", pwd=" + pwd + ", account=" + account
+ ", fk_role_id=" + fk_role_id + ", role=" + role + "]";
}
}
Role对应的POJO类:
package com.shxt.model;
public class Role {
private Integer role_id;
private String role_name;
public Integer getRole_id() {
return role_id;
}
public void setRole_id(Integer role_id) {
this.role_id = role_id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
@Override
public String toString() {
return "Role [role_id=" + role_id + ", role_name=" + role_name + "]";
}
}
测试类;
package com.shxt.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.shxt.dao.RoleDao;
import com.shxt.dao.UserDao;
import com.shxt.dao.impl.RoleDaoImpl;
import com.shxt.dao.impl.UserDaoImpl;
import com.shxt.model.Role;
import com.shxt.model.User;
public class MybatisTest {
UserDao userDao = null;
RoleDao roleDao = null;
@Before
public void init() {
userDao = new UserDaoImpl();
roleDao = new RoleDaoImpl();
}
@Test
public void load1() {
User user = userDao.load(1);
System.out.println(user);
}
}
还有对应的UserDao,UserDaoImpl;RoleDao,RoleDaoImpl就不在详细赘述。
程序运行结果: