- 在整个的数据库关系中可以分为三类关系:分别为一对一、一对多和多对多的关系。此篇主要使用使用者和账户的关系以及角色和使用者的关系作为例子来说明这三种关系如何实现。
-
- 使用者(User)和账户(Account)的关系:
-
-
- 对于使用者来说,一个人可以拥有多个账户,这就是典型的一对多的关系。
- 对于账户来说,一个账户只能属于一个人,所以可以认为这就是一个一对一的关系。
-
-
- 角色(Role)和使用者(User)的关系:
-
-
- 对于角色来说,用户可以拥有多个角色;同样的,多个用户可以拥有多个角色。
-
使用实体类实现一对一的关系模型
- 在开始进行学习之前,创建Account表,然后导入相关的数据和操作。在实体类里面进行相关操作。
/** * 一对一关系映射,从表实体应当包含一个主表实体类 */ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }
- 然后编写AccountDao接口类
public interface AccountDao { /** * 查询所有账户内容 */ List<Account> findAll(); }
- 然后编写相关的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.mybatis.dao.AccountDao"> <!-- 定义封装account和user的resultMap --> <resultMap id="accountMap" type="com.mybatis.Account"> <id property="id" column="aid"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> <association property="user" column="uid" javaType="com.mybatis.User"> <id property="id" column="id"></id> <result property="username" column="username"></result> <result property="address" column="address"></result> <result property="sex" column="sex"></result> <result property="birthday" column="birthday"></result> </association> </resultMap> <!-- 查询所有信息 --> <select id="findAll" resultMap="accountMap"> select u.*,a.id as aid,a.uid,a.money from account a,user u where u.id=a.uid; </select> </mapper>
- 测试用例
@Test public void TestfindAll(){ //5.使用代理方法执行查询所有的方法 List<Account> accounts =accountDao.findAll(); for(Account account:accounts){ System.out.println("------------------"); System.out.println(account); System.out.println(account.getUser()); } }
使用实体类实现一对多的关系模型
- 首先在实体类内进行相关的对象实现
/** * 一对多的映射关系,应该在主表实体类里面附带 */ private List<Account> accounts; public List<Account> getAccounts() { return accounts; }
- 然后在配置文件中实现相关代码
<!-- 定义User的resultMap --> <resultMap id="userAccountMap" type="com.mybatis.User"> <id property="id" column="id"></id> <result property="username" column="username"></result> <result property="address" column="address"></result> <result property="sex" column="sex"></result> <result property="birthday" column="birthday"></result> <!-- 配置User对象中的Accounts对象--> <collection property="accounts" ofType="com.mybatis.Account"> <id property="id" column="aid"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> </collection> </resultMap> <select id="findAll" resultMap="userAccountMap"> select * from user u left outer join account a on u.id=a.uid; </select>
- 测试用例
@Test public void TestfindAll(){ //5.使用代理方法执行查询所有的方法 List<User> users=userDao.findAll(); for(User user:users){ System.out.println("------------------------"); System.out.println(user); System.out.println(user.getAccounts()); } }
使用实体类实现多对多的关系模型
- 首先在实体类内进行相关的对象实现
/** * 多对多的关系映射:一个角色可以赋予多个用户 */ private List<User> users; public List<User> getUsers() { return users; }
- 编写关于RoleDao接口
public interface RoleDao { List<Role> findAll(); }
- 编写相关的配置文件
<?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.mybatis.dao.RoleDao"> <!-- 定义role的roleMap --> <resultMap id="roleMap" type="com.mybatis.Role"> <id property="roleId" column="rid"></id> <result property="roleName" column="role_name"></result> <result property="roleDesc" column="role_desc"></result> <!-- 配置User对象中的Accounts对象--> <collection property="users" ofType="com.mybatis.User"> <id property="id" column="id"></id> <result property="username" column="username"></result> <result property="address" column="address"></result> <result property="sex" column="sex"></result> <result property="birthday" column="birthday"></result> </collection> </resultMap> <select id="findAll" resultMap="roleMap"> select u.*,r.id as rid,r.role_name,r.role_desc from role r left outer join user_role ur on r.id=ur.rid left outer join user u on u.id=ur.uid </select> </mapper>
- 测试用例
@Test public void TestfindAll(){ //5.使用代理方法执行查询所有的方法 List<Role> roles =roleDao.findAll(); for(Role role:roles){ System.out.println("------------------"); System.out.println(role); System.out.println(role.getUsers()); } }