MyBatis框架-ResultMap节点
需求:查询结果要求显示用户名,用户密码,用户的角色
因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表smbms_role表中,这时我们就需要联表查询了。
之前我们使用的是给查询结果字段取别名的方式来和实体类中的属性进行映射。现在我们换一种写法,使用ResultMap节点。
先介绍一下resultMap节点的神奇,总所周知,在实际的项目开发过程中,总会存在实体类和数据库中的列名不对应的情况,如果都是通过sql取别名来影射的话,那一个sql将会写的又臭又长,根本就没有办法阅读了,不便于后期的维护,这里ResultMap恰好解决了这个问题,
这样是代码容易阅读和后期维护,进而,提高了开发效率。
总结:
<resultMap id="给ID名" type="实体类" >
<result column="数据库字段名" property="实体类属性" jdbcType="数据库字段类型" />
</resultMap>
UserMapper.xml
1 <!--查询结果要显示用户名,密码和用户的角色名称,需要连表查询 注意:roleName最后运行程序的结果是null 2 原因是:数据库中的字段名和User实体类中的属性名是不一致的,现在我们使用ResultMap节点 3 resultMap节点放在要映射的select的节点的上方和下方都是可以的,对结果是没有影响的--> 4 <select id="getUserListByUserName5" parameterType="map" resultMap="UserListMap"> 5 select a.*,r.roleName from smbms_user a,smbms_role r 6 where username like CONCAT ('%',#{userName1},'%') 7 and userRole = #{userRole1} and a.userRole=r.id 8 </select> 9 <resultMap type="User" id="UserListMap" > 10 <result property="userName" column="userName" /> 11 <result property="userRoleName" column="roleName" /> 12 </resultMap>
UserMapper.java
编写对应的测试方法:
1 @Test 2 public void test9() { 3 Map<String, String> map = new HashMap<String, String>(); 4 map.put("userName1", "赵"); 5 map.put("userRole1", "3"); 6 7 SqlSession sqlSession = null; 8 java.util.List<User> userList2 = new ArrayList<User>(); 9 try { 10 sqlSession = MyBatisUtil.createSqlSession(); 11 //使用mapper映射的方式实现 12 //userList2 = sqlSession.selectList("cn.smbms.dao.user.UserMapper.getUserListByUserName",userNameString); 13 //调用mapper接口的方式实现 14 userList2 = sqlSession.getMapper(UserMapper.class).getUserListByUserName5(map); 15 int size = userList2.size(); 16 mlogger.info("获取到的记录数是:" + size); 17 18 } catch (Exception e) { 19 // TODO: handle exception 20 } finally { 21 // 最后一定要注意:关闭会话 22 MyBatisUtil.closeSqlSession(sqlSession); 23 24 } 25 for (User user2 : userList2) { 26 mlogger.info("用户名:" + user2.getUserName() + ",密码:" + user2.getUserPassword()+",用户角色:"+user2.getUserRoleName()); 27 } 28 29 }
运行结果:
1 [DEBUG] 2019-11-02 21:01:00,291 cn.smbms.dao.user.UserMapper.getUserListByUserName5 - ==> Preparing: select a.*,r.roleName from smbms_user a,smbms_role r where username like CONCAT ('%',?,'%') and userRole = ? and a.userRole=r.id 2 [DEBUG] 2019-11-02 21:01:00,433 cn.smbms.dao.user.UserMapper.getUserListByUserName5 - ==> Parameters: 赵(String), 3(String) 3 [INFO] 2019-11-02 21:01:00,504 cn.smbms.dao.test.UserMapperTest - 获取到的记录数是:1 4 [DEBUG] 2019-11-02 21:01:00,505 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@51a19458] 5 [DEBUG] 2019-11-02 21:01:00,505 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@51a19458] 6 [DEBUG] 2019-11-02 21:01:00,506 org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1369543768 to pool. 7 [INFO] 2019-11-02 21:01:00,506 cn.smbms.dao.test.UserMapperTest - 用户名:赵燕,密码:0000000,用户角色:普通员工