本文共 8085 字,大约阅读时间需要 26 分钟。
问题: 查询角色获取角色下的用户信息
实现: Role 到 User 多对多
需求: 实现查询所有角色并且加载它所分配的用户信息。
分析: 查询角色我们需要用到Role表,但角色分配的用户信息我们不能直接找到用户信息而是要通过中间表(user_role表)才能关联到用户信息。
编写步骤
1、建立两张表:用户表,角色表 让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键, 在中间表中是外键。2、建立两个实体类:用户实体类和角色实体类 让用户和角色的实体类能体现出多对多的关系 各自包含对方一个集合引用 代码部分:添加属性角色实体类包含用户实体类 //多对多的关系映射:一个角色可以赋予多个用户 private Listusers; public void setUsers(List users) { this.users = users; } public List getUsers() { return users; } /3、建立两个配置文件 用户的配置文件 角色的配置文件(角色配置中包含用户配置信息,利用collection标签包含) 4、实现配置 当我们查询用户时,可以同时得到用户所包含的角色信息 当我们查询角色时,可以同时得到角色的所赋予的用户信息(采用左连接将三个表连接起来)
public class User implements Serializable{ private Integer id; private String username; //private Date birthday; private String sex; private String address; ···//}
public class Role implements Serializable{ private Integer roleId; private String roleName; private String roleDesc; //多对多的关系映射:一个角色可以赋予多个用户 private Listusers; public void setUsers(List users) { this.users = users; } public List getUsers() { return users; } ...//}
/** * @author * 用户的持久层接口 * mybatis的映射配置文件位置必须和dao接口的包结构相同 */public interface IRoleDao { /** * 查询所有Role角色 * @return */ ListfindRolelAll();}
package com.song.test;import java.io.IOException;import java.io.InputStream;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.song.dao.IRoleDao;import com.song.domain.Role;public class RoleTest { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private IRoleDao roleDao; @Before public void init() throws IOException { //1、读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2、创建SqlSessionFactory工厂(工厂模式) factory= new SqlSessionFactoryBuilder().build(in); //3、使用工厂生产SqlSesson对象 sqlSession = factory.openSession(true);//手动将事务提交方式改为自动提交 //4、使用SqlSession创建Dao接口的代理对象 roleDao = sqlSession.getMapper(IRoleDao.class); } @After//用于在测试方法执行之后执行 public void destory() throws Exception { //提交事务 //sqlSession.commit(); //6、释放资源 sqlSession.close(); in.close(); } /** * 查询所有角色 */ @Test public void testfindAll() { Listroles = roleDao.findRolelAll(); for(Role role:roles) { System.out.print("这是一条记录:"); System.out.print(role); System.out.println(role.getUsers()); } }}
一个角色对应多个用户,一个用户对应多个角色。
问题: 查询用户获取角色信息
实现: User到 Role 多对多
需求: 实现查询所有对象并且加载它所分配的用户信息。
分析: 查询角色我们需要用到Role表,但角色分配的用户信息我们不能直接找到用户信息而是要通过中间表(user_role表)才能关联到用户信息。
编写步骤
1、建立两张表:用户表,角色表 让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键, 在中间表中是外键。2、建立两个实体类:用户实体类和角色实体类 让用户和角色的实体类能体现出多对多的关系 各自包含对方一个集合引用 代码部分:添加属性用户实体类包含角色实体类 //多对多的关系映射:一个角色可以赋予多个用户 //多对多的关系映射:一个用户可以是多个角色 private Listroles; public void setRoles(List roles) { this.roles = roles; } public List getRoles() { return roles; }3、建立两个配置文件 用户的配置文件(用户配置中包含角色配置信息,利用collection标签包含) 角色的配置文件4、实现配置 当我们查询用户时,可以同时得到用户所包含的角色信息(采用左连接将三个表连接起来) 当我们查询角色时,可以同时得到角色的所赋予的用户信息
public class Role implements Serializable{ private Integer roleId; private String roleName; private String roleDesc; //多对多的关系映射:一个角色可以赋予多个用户 private Listusers; public void setUsers(List users) { this.users = users; } public List getUsers() { return users; } ···//}
public class User implements Serializable{ private Integer id; private String username; private Date birthday; private String sex; private String address; //多对多的关系映射:一个用户可以是多个角色 private Listroles; public void setRoles(List roles) { this.roles = roles; } public List getRoles() { return roles; } ...//}
public interface IRoleDao { /** * 查询所有Role角色 * @return */ ListfindRolelAll();}
/** * * @author 宋强 * 用户的持久层接口 * *mybatis的映射配置文件位置必须和dao接口的包结构相同 */public interface IUserDao { /** * 查询所有操作:同时获取 用户 */ ListfindAll();}
编写IRoleDao.xml
测试类UserTest
package com.song.test;import java.io.IOException;import java.io.InputStream;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.song.dao.IUserDao;import com.song.domain.User;public class UserTest { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private IUserDao userDao; @Before public void init() throws IOException { //1、读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2、创建SqlSessionFactory工厂(工厂模式) factory= new SqlSessionFactoryBuilder().build(in); //3、使用工厂生产SqlSesson对象 sqlSession = factory.openSession(true);//手动将事务提交方式改为自动提交 //4、使用SqlSession创建Dao接口的代理对象 userDao = sqlSession.getMapper(IUserDao.class); } @After//用于在测试方法执行之后执行 public void destory() throws Exception { //提交事务 //sqlSession.commit(); //6、释放资源 sqlSession.close(); in.close(); } /** * 查询账户所有 */ @Test public void testfindAllcount() { Listusers = userDao.findAll(); for(User user:users) { System.out.print("这是一条记录:"); System.out.println(user); System.out.println(user.getAccounts()); } }}
测试结果:
一个用户对应多个角色,一个角色对应多个用户。测试类RoleTest
public class RoleTest { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private IRoleDao roleDao; @Before public void init() throws IOException { //1、读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2、创建SqlSessionFactory工厂(工厂模式) factory= new SqlSessionFactoryBuilder().build(in); //3、使用工厂生产SqlSesson对象 sqlSession = factory.openSession(true);//手动将事务提交方式改为自动提交 //4、使用SqlSession创建Dao接口的代理对象 roleDao = sqlSession.getMapper(IRoleDao.class); } @After//用于在测试方法执行之后执行 public void destory() throws Exception { //提交事务 //sqlSession.commit(); //6、释放资源 sqlSession.close(); in.close(); } /** * 查询所有角色 */ @Test public void testfindAll() { Listroles = roleDao.findRolelAll(); for(Role role:roles) { System.out.print("这是一条记录:"); System.out.print(role); System.out.println(role.getUsers()); } }}
测试结果
一个role对应多个用户,一个用户有多个role转载地址:http://okerz.baihongyu.com/