1、一对一查询(多对一)
如查询所有账户信息管理查询下单用户信息,相当于连表查询。进行user和account两个表进行一对一查询,我们查询account账户时需要把对应有的用户信息查询出来。
这里我们需要新增Account实体类、AccountDao数据持久层、以及对应的映射配置文件 AccountDao.xml
实体类和数据持久层我们就不多说了,和user的相同,这里我们说明下映射配置文件配置如下:
<?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.shenqiang.dao.AccountDao">
<!--建立对应关系-->
<resultMap id="accountMap" type="account">
<id column="aid" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
<!--它是用来指定从表的引用实体属性的-->
<association property="user" javaType="user">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</association>
</resultMap>
<!--一对一连表查询 用户对应有账户的用户信息-->
<select id="findAll" resultMap="accountMap">
select a.*,u.username,u.address from account a,user u where a.uid =u.id;
</select>
</mapper>
在配置文件中,我们可以看到需要进行查询数据关联,将结果包装成我们需要使用的内容。
association – 一个复杂类型的关联;许多结果将包装成这种类型
2、一对多查询
一对多查询实现如我们需要查询用户信息时同时查询出对应的账户信息,不管用户是否有账户都需要查询出来。
这里我们在User实体类中加入 变量 List<Account> accounts;并生成set和get方法。
在对应UserDao.xml映射文件中修改我们的查询所有方法,具体如下:
<resultMap id="userMap" type="user">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="address" property="userAddress"/>
<result column="sex" property="userSex"/>
<result column="birthday" property="userBirthday"/>
<!--collection 是用于建立与一对多中集合属性的对应关系ofType用与指定集合元素的数据类型-->
<collection property="accounts" ofType="account">
<id column="id" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
</collection>
<!--
collection
部分定义了用户关联的账户信息。表示关联查询结果集
property="accList" :accounts 是一个存储 Account 的 ArrayList 集合
关联查询的结果集存储在 User 对象的上哪个属性。
ofType="account" :它用来将 JavaBean(或字段)属性的类型和集合存储的类型区分开来
指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。
-->
</resultMap>
<!--查询所有用户-->
<select id="findAll" resultMap="userMap">
select u.*,a.id ,a.uid,a.money 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(user);
System.out.println(user.getAccounts());
}
}
3、多对多查询
我们新增加role和user_role表,为了查询所有用户信息的角色。而查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到用户信息,而是要通过中间表(USER_ROLE 表)才能关联到用户信息。
这里我们在Role实体类中加入 变量 List<User> users;并生成set和get方法。
在对应UserDao.xml映射文件中修改我们的查询所有方法,具体如下:
<mapper namespace="com.shenqiang.dao.RoleDao">
<resultMap id="roleMap" type="role">
<id property="roleId" column="rid"/>
<result property="roleName" column="role_name"/>
<result property="roleDesc" column="role_desc"/>
<collection property="users" ofType="user">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</collection>
</resultMap>
<select id="findAll" resultMap="roleMap">
SELECT r.*,u.id uid,u.username username,u.birthday birthday,u.sex sex,u.address address FROM ROLE r INNER JOIN USER_ROLE ur ON ( r.id = ur.rid) INNER JOIN USER u ON (ur.uid = u.id);
</select>
在测试类中进行调用如下:
@Test
public void testFindAll(){
List<Role> roles = roleDao.findAll();
for (Role role:roles){
System.out.println(role);
System.out.println(role.getUsers());
}
}