需求:查詢結果要求顯示用戶名,用戶密碼,用戶的角色
因為在用戶表中只有用戶角色碼值,沒有對應的名稱,角色名稱是在碼表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,用戶角色:普通員工