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

因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表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. GitHub: Oracle Database on Docker 为测试 改天试试

    Oracle Database on Docker https://github.com/oracle/docker-images/tree/master/OracleDatabase/SingleI ...

  2. Linux基础(09)aio高级编程

    1.出于安全性 Linux有一个机制 应用层和内核层是无法互相直接读取内存的, 他们要互相读取数据是有一个拷贝过程的, 如: 应用层要读取内核层的数据就调用read(), 内核就会先把数据copy到一 ...

  3. jdbc 简单示例和优缺点

    一个使用JDBC的例子: Class.forName("com.mysql.cj.jdbc.Driver"); //加载驱动 Connection connection = Dri ...

  4. python_操作linux上的mysql

    在编写初期,遇见一个问题,发现怎么连接不上mysql,一直报错1045: 最后发现,只要下面的,连接写正确,不会出现这个问题, 只要你保证你的user.pwd是正确的, import pymysqld ...

  5. 引用和自包含令牌(Reference Tokens and Introspection)

    访问令牌可以有两种形式:自包含的和引用的. 自包含令牌(Self-contained tokens): 使用受保护的.有时间限制的数据结构,该结构包含元数据,并声明通过网络传递用户或客户机的身份.一种 ...

  6. System.Web.NullPointerException

    在.Net异步webApi中我们需要记录日志信息,需要获取客户端的ip地址,我们需要使用:HttpContext.Current.Request.ServerVariables["REMOT ...

  7. java之 代理设计模式

    1. 设计一个案例来实现租房功能.分析:在租房的过程中涉及到了3个对象,房东,中介,房客. 中介和房客具有相同的功能--租房. 可以设计如下: 2.上图的设计实际上就是一个代理设计模式---静态代理设 ...

  8. linq 注意事项

    //linq分组需要注意的是into是在原表的基础上创建新的表进行排序 //new 是新表的字段,可以创建新的字段可以获取当前分组的没一个组的条数 var q = from p in list gro ...

  9. ajax 传递数组参数

    一.ajax 传递数组参数 需要添加: traditional: true, let typeIDArr = [,,,,,]; var that = this; var url = '@Url.Act ...

  10. 注入 Istio sidecar

    注入 Istio sidecar 网格中的每个 Pod 都必须伴随一个 Istio 兼容的 Sidecar 一同运行. 下文中将会介绍两种把 Sidecar 注入到 Pod 中的方法:使用 istio ...