一对多查询
需求:查询所有用户信息及用户关联的账户信息。
分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息查询出来,我们想到了左外连接查询比较合适。
1.实体类User加入 List< Account >
// get 和 set 方法省略,自己加,还有toString方法
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
private List<Account> accounts; //一对多关系映射,主表实体应该包含从表实体的集合引用
}
2.用户持久层 Dao 接口中加入查询方法
public interface IUserDao {
/**
* 查询所有用户信息及用户关联的账户信息。
* @return
*/
List<User> findAll();
}
3.Sql语句
SELECT user.*,account.id aid,uid,money
FROM USER LEFT OUTER JOIN account ON (user.`id`= account.`UID`)
4.用户持久层 Dao 映射文件配置
<?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.xd.dao.IUserDao">
<!--定义User的resultMap-->
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
<!--配置User对象中accounts集合的映射-->
<!-- collection 是用于建立一对多中集合属性的对应关系 ofType 用于指定集合元素的数据类型-->
<collection property="accounts" ofType="account">
<id column="aid" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
</collection>
</resultMap>
<!--配置查询所有用户信息及用户关联的账户信息-->
<select id="findAll" resultMap="userAccountMap">
SELECT user.*,account.id aid,uid,money FROM USER LEFT OUTER JOIN account ON (user.`id`= account.`UID`)
</select>
</mapper>
5.测试
public class MybatisTestRole {
InputStream in;
SqlSession sqlSession;
IRoleDao roleDao;
@Before //用于执行测试方法之前
public void init() throws IOException {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.创建SqlSession
sqlSession = factory.openSession();
//4.创建Dao接口的代理对象
roleDao = sqlSession.getMapper(IRoleDao.class);
}
@After //用于执行测试方法之后执行
public void destory() throws IOException {
//提交事务
sqlSession.commit();
sqlSession.close();
in.close();
}
@Test //配置查询所有账户
public void testFindAll(){
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
System.out.println(user.getAccounts());
}
}
}
多对多查询
需求:实现查询所有对象并且加载它所分配的用户信息。
分析:查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到用户信息,而是要通过中间表(USER_ROLE 表)才能关联到用户信息。
角色表是中间表,一个角色有多个用户,一个用户有多个角色,多对多
1.Sql语句
SELECT role.`ID` AS rid,role.role_name,role.`ROLE_DESC`,user.*
FROM role LEFT OUTER JOIN user_role ON (role.`ID`=user_role.`RID`)
LEFT OUTER JOIN USER ON (user.`id`=user_role.`UID`)
2.角色实体类
// get 和 set 方法省略,自己加,还有toString方法
public class Role implements Serializable {
private Integer roleId;
private String roleName;
private String roleDesc;
//多对多的关系映射,一个角色可以赋予多个用户
private List<User> users;
}
3.编写 Role 持久层接口
public interface IRoleDao {
List<Role> findAll();
}
4.Role接口的映射文件
<?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.xd.dao.IRoleDao">
<resultMap id="roleMap" type="role">
<id property="roleId" column="rid"></id>
<result property="roleName" column="ROLE_NAME"></result>
<result property="roleDesc" column="ROLE_DESC"></result>
<collection property="users" ofType="user">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="birthday" property="birthday"></result>
<result column="sex" property="sex"></result>
<result column="address" property="address"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="roleMap">
SELECT role.`ID` AS rid,role.role_name,role.`ROLE_DESC`,user.*
FROM role LEFT OUTER JOIN user_role ON (role.`ID`=user_role.`RID`)
LEFT OUTER JOIN USER ON (user.`id`=user_role.`UID`)
</select>
</mapper>
5.测试
@Test //配置查询所有账户
public void testFindAll(){
List<Role> roles = roleDao.findAll();
for (Role role : roles){
System.out.println(role);
System.out.println(role.getUsers());
}
}