六. 员工去查询角色
UserMapper.java 的接口:
public User getUserRoleById(int id);
UserMapper.xml sql语句:
<resultMap type="user" id="userResultMapWithUserRole"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="age" column="age"/> <result property="description" column="description"/> <!--引入集合为userRole的集合--> <collection property="userRole" javaType="ArrayList" ofType="userRole" column="id" select="com.yjl.mapper.UserRoleMapper.findByUserId"> </collection> </resultMap> <select id="getUserRoleById" parameterType="int" resultMap="userResultMapWithUserRole"> select * from user where id=#{id} </select>
UserRoleMapper.java 的接口为:
package com.yjl.mapper; import org.apache.ibatis.annotations.Param; import com.yjl.pojo.UserRole; /** @atuhor:yuejl @Description: 类描述 */ public interface UserRoleMapper { public UserRole findByUserId(@Param(value="userId") int userId); }
UserRoleMapper.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.yjl.mapper.UserRoleMapper"> <resultMap type="userRole" id="userRoleMap"> <result property="created_by" column="created_by" javaType="string"/> <result property="created_date" column="created_date" javaType="date"/> <!-- 关联一下,相应的角色信息,为一对一的形式 --> <association property="role" javaType="role" column="roleId" select="com.yjl.mapper.RoleMapper.findById"></association> </resultMap> <select id="findByUserId" parameterType="int" resultMap="userRoleMap"> select t.* from user_role t where t.userId=#{userId} </select> </mapper>
RoleMapper.java 的接口为:
public Role findById(int id);
RoleMapper.xml 的sql语句为:
<resultMap type="role" id="roleResultMap"> <id property="id" column="id"/> <result property="name" column="name"/> </resultMap> <select id="findById" parameterType="int" resultMap="roleResultMap"> select * from role t where t.id=#{id} </select>
测试方法:
@Test public void getUserRoleByIdTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //查询该员工所具有的角色 User user=userMapper.getUserRoleById(1); List<UserRole> roleList=user.getUserRole(); System.out.println(user); for (UserRole userRole : roleList) { System.out.println("输出创建人:"+userRole.getCreated_by()); System.out.println("输出创建日期:"+userRole.getCreated_date()); Role role=userRole.getRole(); System.out.println(role); } }
这是员工找角色的,也可以角色去找员工。 与上面的思路差不多,就不讲解了。 当然,也有对应的result 的形式。
UserMapper.java 接口:
public User getUserRoleByIdWithResult(int id);
UserMapper.xml sql语句:
<resultMap type="user" id="userResultMapWithUserRoleResult"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="age" column="age"/> <result property="description" column="description"/> <collection property="userRole" ofType="userRole" javaType="arrayList"> <result property="created_by" column="created_by" javaType="string"/> <result property="created_date" column="created_date" javaType="date"/> <!-- 对角色的一对一 --> <association property="role" javaType="role"> <id property="id" column="rId" javaType="int"/> <result property="name" column="rName" javaType="string"/> </association> </collection> </resultMap> <select id="getUserRoleByIdWithResult" parameterType="int" resultMap="userResultMapWithUserRoleResult"> select u.id as id,u.name as name,u.sex as sex,u.age as age,u.description as description, ur.created_by as created_by,ur.created_date as created_date, r.id as rId,r.name as rName, ur.userId as userId,ur.roleId as roleId from user u,role r,user_role ur where u.id=ur.userId and r.id=ur.roleId and u.id=#{id} </select>
测试方法:
@Test public void getUserRoleByIdWithResultTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //查询该员工所具有的角色 User user=userMapper.getUserRoleByIdWithResult(1); List<UserRole> roleList=user.getUserRole(); System.out.println(user); System.out.println("长度是:"+roleList.size()); for (UserRole userRole : roleList) { System.out.println("输出创建人:"+userRole.getCreated_by()); System.out.println("输出创建日期:"+userRole.getCreated_date()); Role role=userRole.getRole(); System.out.println(role); } }
查询的时候,会发现只查询出一条数据。
显示的是查询出3条,为什么只显示一条呢? 查了很多资料,最后发现可能跟数据有关。 user 表中的数据是一样的,给处理成了一条,那么 userrole 表中的数据也是一样的,也可以被处理成了一条。 故改变userrole 表中的数据。
这个时候,运行为:
将userrole 中的数据再次改变,使其中有相同的。
再次运行为:
故可知,与数据是否相同有很大的关系。 如果实例化的数据都一样,MyBatis会将其当成一个对象,不会再重新初始化。
谢谢!!!