package com.regino.dao;import com.regino.domain.User;publicinterfaceUserMapper{// 一对多关联public User findByIdWithOrders(Integer id);}
d. 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"><mappernamespace="com.regino.dao.UserMapper"><resultMapid="userMap"type="User"><idcolumn="id"property="id"></id><resultcolumn="username"property="username"></result><resultcolumn="birthday"property="birthday"></result><resultcolumn="sex"property="sex"></result><resultcolumn="address"property="address"></result><!--
一对多关联 collection标签
property="orderList" 关联实体集合的属性名
ofType="com.regino.domain.Order" 关联实体的java类型(集合泛型的类型)
--><collectionproperty="orderList"ofType="com.regino.domain.Order"><idcolumn="oid"property="id"></id><resultcolumn="ordertime"property="ordertime"></result><resultcolumn="money"property="money"></result></collection></resultMap><!--
一对多关联
--><selectid="findByIdWithOrders"parameterType="int"resultMap="userMap">
SELECT *,o.id AS oid FROM `user` u INNER JOIN orders o ON u.`id` = o.`uid` WHERE u.`id`=#{id}
</select></mapper>
e. 测试
publicclassUserMapperTestextendsBaseMapperTest{// 一对多测试@Testpublicvoidtest01()throws Exception {// 获取代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findByIdWithOrders(41);
System.out.println(user);}}
5. 多对多(由两个一对多组成)
多对多查询的模型:用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用。
多对多查询的需求:查询 用户 同时查询出该用户的所有角色。
在 MyBatis 中多对多实现,跟一对多步骤是一样,区别就在于 SQL 语句。
a. 实体和表关系
SELECT*FROM`user` u
INNERJOIN user_role ur ON u.`id`= ur.`uid`-- 用户连接中间表INNERJOIN role r ON ur.`rid`= r.`id`-- 再根据中间表连接角色WHERE u.id =41-- 用户id 作为条件
// 多对多关联public User findByIdWithRoles(Integer id);
d. UserMapper.xml
<resultMapid="userWithRoleMap"type="User"><idcolumn="id"property="id"></id><resultcolumn="username"property="username"></result><resultcolumn="birthday"property="birthday"></result><resultcolumn="sex"property="sex"></result><resultcolumn="address"property="address"></result><!--
多对多实现步骤和一对多是一样的(区别在于sql语句)
--><collectionproperty="roleList"ofType="com.regino.domain.Role"><idcolumn="rid"property="id"></id><resultcolumn="role_name"property="roleName"></result><resultcolumn="role_desc"property="roleDesc"></result></collection></resultMap><!--
多对多关联
--><selectid="findByIdWithRoles"parameterType="int"resultMap="userWithRoleMap">
SELECT * FROM `user` u
INNER JOIN user_role ur ON u.`id` = ur.`uid` -- 用户连接中间表
INNER JOIN role r ON ur.`rid` = r.`id` -- 再根据中间表连接角色
WHERE u.id = #{id} -- 用户id 作为条件
</select>
e. 测试
@Testpublicvoidtest02()throws Exception{// 获取代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findByIdWithRoles(41);
System.out.println(user);}
6. 多对多补充
以角色为中心,查询多个用户。
a. 实体和表关系
SELECT*FROM`role` r
INNERJOIN user_role ur ON r.`id`= ur.`rid`-- 角色连接中间表INNERJOINUSER u ON ur.`uid`= u.`id`-- 再根据中间表连接用户WHERE r.id =#{id} -- 角色id 作为条件
// 多对多关联public User findByIdWithRoles(Integer id);
d. RoleMapper.xml
<resultMapid="roleWithUserMap"type="Role"><idcolumn="id"property="id"></id><resultcolumn="role_name"property="roleName"></result><resultcolumn="role_desc"property="roleDesc"></result><!--
多对多实现步骤和一对多是一样的(区别在于sql语句)
--><collectionproperty="userList"ofType="com.regino.domain.User"><idcolumn="rid"property="id"></id><resultcolumn="username"property="username"></result><resultcolumn="birthday"property="birthday"></result><resultcolumn="sex"property="sex"></result><resultcolumn="address"property="address"></result></collection></resultMap><!--
多对多关联
--><selectid="findByIdWithUsers"parameterType="int"resultMap="roleWithUserMap">
SELECT * FROM `role` r
INNER JOIN user_role ur ON r.`id` = ur.`rid` -- 角色连接中间表
INNER JOIN USER u ON ur.`uid` = u.`id` -- 再根据中间表连接用户
WHERE r.id = #{id} -- 角色id 作为条件
</select>