需求:查询结果要求显示用户名,用户密码,用户的角色

因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表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的节点的上方和下方都是可以的,对结果是没有影响的-->
<select id="getUserListByUserName5" parameterType="map" resultMap="UserListMap">
select a.*,r.roleName from smbms_user a,smbms_role r
where username like CONCAT ('%',#{userName1},'%')
and userRole = #{userRole1} and a.userRole=r.id
</select>
<resultMap type="User" id="UserListMap" >
<result property="userName" column="userName" />
<result property="userRoleName" column="roleName" />
</resultMap>

UserMapper.java

编写对应的测试方法:

     @Test
public void test9() {
Map<String, String> map = new HashMap<String, String>();
map.put("userName1", "赵");
map.put("userRole1", "3"); SqlSession sqlSession = null;
java.util.List<User> userList2 = new ArrayList<User>();
try {
sqlSession = MyBatisUtil.createSqlSession();
//使用mapper映射的方式实现
//userList2 = sqlSession.selectList("cn.smbms.dao.user.UserMapper.getUserListByUserName",userNameString);
//调用mapper接口的方式实现
userList2 = sqlSession.getMapper(UserMapper.class).getUserListByUserName5(map);
int size = userList2.size();
mlogger.info("获取到的记录数是:" + size); } catch (Exception e) {
// TODO: handle exception
} finally {
// 最后一定要注意:关闭会话
MyBatisUtil.closeSqlSession(sqlSession); }
for (User user2 : userList2) {
mlogger.info("用户名:" + user2.getUserName() + ",密码:" + user2.getUserPassword()+",用户角色:"+user2.getUserRoleName());
} }

运行结果:

 [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
[DEBUG] 2019-11-02 21:01:00,433 cn.smbms.dao.user.UserMapper.getUserListByUserName5 - ==> Parameters: 赵(String), 3(String)
[INFO] 2019-11-02 21:01:00,504 cn.smbms.dao.test.UserMapperTest - 获取到的记录数是:1
[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]
[DEBUG] 2019-11-02 21:01:00,505 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@51a19458]
[DEBUG] 2019-11-02 21:01:00,506 org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1369543768 to pool.
[INFO] 2019-11-02 21:01:00,506 cn.smbms.dao.test.UserMapperTest - 用户名:赵燕,密码:0000000,用户角色:普通员工

MyBatis框架-ResultMap节点的更多相关文章

  1. Mybatis框架-update节点元素的使用

    今天我们学习一下mybatis框架中的update节点元素的使用 需求:修改用户表中的一条数据记录,修改编号为21的用户的密码 UserMapper.xml UserMapper.java 编写测试方 ...

  2. mybatis框架-resultMap的自动映射级别-partial 和full的探讨

    现在我们做一个小实验,输出一下上一个案例中没有匹配的属性,注意哦,现在user类中是有内部嵌套的复杂数据类型的 运行结果: 注意到:现在居然连userPassword都打印不出来了,原因就是user类 ...

  3. Mybatis框架-resultMap元素的自动映射级别

    resultMap的自动映射级别:分为三种:NONE  PARTIAL  FULL 其中默认的属性是:PARTIAL:开启自动匹配,会自动匹配数据库中的字段名和实体类中的属性名,如果一致,就能匹配上, ...

  4. Mybatis框架-Delete节点元素的使用

    这个就也比较简单,需求:将我们最新插入的那条数据删除掉,从用户表中. UserMapper.xml UserMapper.java 编写测试方法: @Test public void testDele ...

  5. MyBatis框架的insert节点-向数据库中插入数据

    需求:使用mybatis框架中的insert元素节点向数据库中插入数据 UserMapper.xml UserMapper.java 编写测试方法: @Test public void testAdd ...

  6. 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)

    此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...

  7. 初识Mybatis框架,实现增删改查等操作

    此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...

  8. MyBatis框架及原理分析

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 MyBatis的主要设计目的就 ...

  9. 深入理解MyBatis框架的的配置信息

    面对一个框架,最重要的不是说回用其代码就可以了,我们需要了解其思想,这样才能更快更好的掌握这个框架.而对于一个框架,最重要的就是其配置文件的作用及功能了.下面,我就来谈一谈我今天遇到的这个MyBati ...

随机推荐

  1. JVM的基本结构和JVM的内存结构

    这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型. 1.JVM的基本结构 ...

  2. Java高频面试题--单例设计模式

  3. 关于于c++中的类型转换

    隐藏式类型转换 void test() { ; ; a = b; //此时发生的是默认的类型转 //(据说编译器是微软的编译器是不允许编译通过) std::cout << a <&l ...

  4. Linux基础(10)AIO项目设计与POSIX文件操作和目录管理

    实现fast-cp :拷贝文件到目标对象 Linux的七种文件类型 :https://blog.csdn.net/linkvivi/article/details/79834143 ls -al :h ...

  5. Django开发之登陆和登出

    使用django自带的验证模块 1.首先使用python manage.py startapp models为当前项目添加一个应用. 2.在setting.py中INSTALLED_APPS后面添加' ...

  6. 什么才是JavaEE基础

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  7. [转]Go语言string,int,int64 ,float之间类型转换方法

    1 正文 (1)int转string s := strconv.Itoa(i) 等价于s := strconv.FormatInt(int64(i), 10) (2)int64转string i := ...

  8. Spring Data Solr入门小Demo

    package com.offcn.pojo; import java.io.Serializable; import java.math.BigDecimal; import java.util.D ...

  9. Net实现阿里云开放云存储服务(OSS)

    1 第一步框架搭建新建一个全新的MVC项目 (项目参考文档https://docs.aliyun.com/?spm=5176.383663.9.6.5OJI07#/pub/oss/sdk/sdk-do ...

  10. 【面试突击】- sql语句的优化分析

    开门见山,问题所在 原文地址:http://www.cnblogs.com/knowledgesea/p/3686105.html sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种 ...