MyBatis(3)-- Mapper映射器
  
一、select元素
1.select元素的应用
id为Mapper的全限定名,联合称为一个唯一的标识
paremeterType标识这条SQL接收的参数类型
resultType标识这条SQL返回的结果类型
<select id="getRole" parameterType="long" resultType="role">
select id,
role_name as roleName, note from t_role where id = #{id}
</select>
只有这条SQL还不够,还需要给一个接口方法程序才能运行起来,即与之对应的是
public Role getRole(Long id);
2.自动映射和驼峰映射
MyBatis提供了自动映射功能,在默认的情况下自动映射是开启的,使用它的好处是能有效地较少大量的映射配置,从而减少工作量。
例如:原来的列名role_name被别名roleName代替了,这样就和POJO属性名称private String roleName;保持一致了。此时MyBatis就会将这个结果集映射到POJO的属性roleName上,自动完成映射,而无须再进行任何配置,明显减少了工作量。
<select id="getRole" parameterType="long" resultType="role">
select id,
role_name as roleName, note from t_role where id = #{id}
</select>
如果将mapUnderscoreToCamelCase设置为true,那么将按照驼峰映射(即数据库字段为role_name,则POJO属性名为roleName;数据库字段为user_name,则POJO属性名为userName),即上面的例子中的select语句将改成:
select id, role_name, note from t_role where id = #{id}
3.传递多个参数
(1)使用map接口传递多个参数
声明接口方法:
public List<Role> findRolesByMap(Map<String, Object> parameterMap);
在XML中设置使用map传递多个参数:
<select id="findRolesByMap" parameterType="map" resultType="role">
select id, role_name as roleName, note from t_role
where role_name like
concat('%', #{roleName}, '%')
and note like concat('%', #{note}, '%')
</select>
使用findRolesByMap方法:
    public static void testFindRolesByMap() {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionFactoryUtils.openSqlSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Map<String, Object> parameterMap = new HashMap<String, Object>();
            parameterMap.put("roleName", "1");
            parameterMap.put("note", "1");
            List<Role> roles = roleMapper.findRolesByMap(parameterMap);
            System.out.println(roles.size());
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
不推荐这种方式,是因为:1.map是一个键值对应的集合,使用者要通过阅读它的键,才能明白其作用;2.使用map不能限定其传输的数据类型,因此业务性不强,可读性差。
(2)使用注释传递多个参数
接口方法定义为:
public List<Role> findRolesByAnnotation(@Param("roleName") String rolename, @Param("note") String note);
xml配置文件修改为:
<select id="findRolesByAnnotation" resultType="role">
select id,
role_name as roleName, note from t_role
where role_name like
concat('%', #{roleName}, '%')
and note like concat('%', #{note}, '%')
</select>
使用findRolesByAnnotation方法:
    public static void testFindRolesByAnnotation() {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionFactoryUtils.openSqlSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            List<Role> roles = roleMapper.findRolesByAnnotation("1", "1");
            System.out.println(roles.size());
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
通过改写使可读性大大提高,使用者也方便了,但是这会带来一个麻烦,如果SQL很复杂,拥有大于10个参数,那么接口方法的参数个数就多了,使用起来就很不容易。
(3)使用Java Bean传递多个参数
先定义一个参数的POJO-RoleParams
package com.ssm.chapter5.param;
public class RoleParams {
    private String roleName;
    private String note;
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
}
将接口方法定义为:
public List<Role> findRolesByBean(RoleParams roleParam);
在xml中使用下面的配置:
<select id="findRolesByBean" parameterType="com.ssm.chapter5.param.RoleParams"
resultType="role">
select id, role_name as roleName, note from t_role
where
role_name like
concat('%', #{roleName}, '%')
and note like concat('%',
#{note}, '%')
</select>
使用findRolesByBean方法时:
    public static void testFindRolesByBean() {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionFactoryUtils.openSqlSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            RoleParams roleParam = new RoleParams();
            roleParam.setNote("1");
            roleParam.setRoleName("1");
            List<Role> roles = roleMapper.findRolesByBean(roleParam);
            System.out.println(roles.size());
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
Java Bean的属性roleName代表角色名称,而note代表备注。
首先引入Java Bean定义的属性作为参数,然后进行查询。
(4)混合使用
如果,查询一个角色,可以通过角色名称和备注进行查询,与此同时还需要支持分页,而分页的POJO的实现如下:
package com.ssm.chapter5.param;
public class PageParams {
    private int start;
    private int limit;
    public int getStart() {
        return start;
    }
    public void setStart(int start) {
        this.start = start;
    }
    public int getLimit() {
        return limit;
    }
    public void setLimit(int limit) {
        this.limit = limit;
    }
}
接口设计如下:
public List<Role> findByMix(@Param("params") RoleParams roleParams, @Param("page") PageParams PageParam);
xml配置如下:
<select id="findByMix" resultType="role">
select id, role_name as
roleName, note from t_role
where role_name like
concat('%',
#{params.roleName}, '%')
and note like concat('%', #{params.note}, '%')
limit #{page.start}, #{page.limit}
</select>
使用findByMix方法:
    public static void testFindByMix() {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionFactoryUtils.openSqlSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            RoleParams roleParam = new RoleParams();
            roleParam.setNote("1");
            roleParam.setRoleName("1");
            PageParams pageParams = new PageParams();
            pageParams.setStart(0);
            pageParams.setLimit(100);
            List<Role> roles = roleMapper.findByMix(roleParam, pageParams);
            System.out.println(roles.size());
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
4.使用resultMap映射结果集
自动映射和驼峰映射规则比较简单,无法定义多的属性。为了支持复杂的映射,select元素提供了resultMap属性。
先定义resultMap属性,然后再在select中使用resultMap属性:
<resultMap id="roleMap" type="role">
<id property="id" column="id" />
<result property="roleName" column="role_name" />
<result property="note" column="note" />
</resultMap> <select id="getRoleUseResultMap" parameterType="long" resultMap="roleMap">
select id, role_name, note from t_role where id = #{id}
</select>
resultMap元素顶一个roleMap,type代表的是作为映射的POJO类,意思也就是,POJO类的id名对应数据库的id,POJO类的roleName名对应数据库的role_name,POJO类的note名对应数据库的note。然后在select元素中的水性resultMap中制定了采用哪个resultMap作为其映射规则。
5.分页参数RowBounds
二、insert元素
三、update元素和delete元素
四、sql元素
五、参数
六、resultMap元素
七、级联
八、缓存
九、存储过程
MyBatis(3)-- Mapper映射器的更多相关文章
- Spring集成MyBatis的使用-使用Mapper映射器
		
Spring集成MyBatis使用 前面复习MyBatis时,发现在测试时,需要手动创建sqlSessionFactory,Spring将帮忙自动创建sqlSessionFactory,并且将自动扫描 ...
 - MyBatis数据库连接的基本使用-补充Mapper映射器
		
补充 Mapper映射器的使用: Mapper映射器,google添加.Mapper映射器是将mapper.xml中配置的sql id,parameterType和resultMap按照规则一一映射到 ...
 - MyBatis02 MyBatis基础知识之Mapper映射器
		
1 Mapper映射器是什么 是符合映射文件要求的接口 接口要求 a. 方法名要与sql的id一致. b. 方法的参数类型要与parameterType一致. c. 方法的返回类型要与resultTy ...
 - Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
		
封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...
 - MyBatis实战之映射器
		
映射器是MyBatis最强大的工具,也是我们使用MyBatis时用得最多的工具,因此熟练掌握它十分必要.MyBatis是针对映射器构造的SQL构建的轻量级框架,并且通过配置生成对应的JavaBean返 ...
 - Mapper映射器
		
在两个独立的对象之间建立通信的对象 需要在两个必须相互隔离的子系统间建立通信. 可能是因为无法修改已有的子系统,或者不愿意在两者之间建立依赖关系.甚至不愿意这两个子系统与另一个部件间建立依赖关系. 运 ...
 - mybatis的mapper映射文件
		
1概述1.1应用架构 mybatis框架用于支持对关系数据库的操作,该体系的应用架构如下图所示: 在mybatis框架体系中,主要的组件是:SqlSessionFactoryBean和Mapp ...
 - Mybatis里Mapper映射sql文件里insert的主键返回selectKey使用
		
有时候新增一条数据,知道新增成功即可,但是有时候,需要这条新增数据的主键,以便逻辑使用,再将其查询出来明显不符合要求,效率也变低了. 这时候,通过一些设置,mybatis可以将insert的数据的主键 ...
 - xml 文件不给提示(以mybatis 的 mapper映射文件为例)
		
在xxx.xml 映射文件的头部可以看到 如下: (mybatis generate 自动生成) <!DOCTYPE mapper PUBLIC "-//mybatis.org//DT ...
 
随机推荐
- web前端开发面试题(附答案)-3
			
1.用纯css创建一个三角形的原理: .demo{ width:0; height: 0; border: 5px solid transparent; border-left-color: red; ...
 - [python]python的异常处理
			
异常处理:首先了解异常,程序出现逻辑错误或者用户输入不合法都会引发异常,而这些异常并不是致命的所以不会导致程序崩溃死掉.可以利用Python提供的异常处理机制在异常出现时及时捕获,并从内部自我消化. ...
 - Hbase入门(三)——数据模型
			
Hbase最核心但也是最难理解的就是数据模型,由于与传统的关系型数据库不同,虽然Hbase也有表(Table),也有行(Row)和列(Column),但是与关系型数据库不同的是Hbase有一个列族(C ...
 - mysql 对返回字段进行拼接
			
使用concat函数进行拼接:示例如下: select id,username,concat( id, '-' , username) as idName from user;
 - Yii2.0怎么设置时区?
			
在config文件夹下,main.php 中, return [ 'charset' => 'utf-8', 'language' => 'zh-CN', 'timeZone' => ...
 - Android的各大框架整理
			
OpenDanmaku :一个Android的弹幕控件 地址:https://github.com/linsea/OpenDanmaku AndroidViewAnimations:Andorid视 ...
 - 02-12 Logistic(逻辑)回归
			
目录 逻辑回归 一.逻辑回归学习目标 二.逻辑回归引入 三.逻辑回归详解 3.1 线性回归与逻辑回归 3.2 二元逻辑回归的假设函数 3.2.1 让步比 3.2.2 Sigmoid函数图像 3.3 二 ...
 - Spring 注册BeanPostProcessor 源码阅读
			
回顾上一篇博客中,在AbstractApplicationContext这个抽象类中,Spring使用invokeBeanFactoryPostProcessors(beanFactory);执行Be ...
 - 在C#中调用Python中遇到的坑(No module named xxx)
			
例如Python的代码是这个样子的. # coding=<utf-> # -*- coding: utf- *- import requests import urllib def Cle ...
 - 异常:微信小程序tabBar不生效
			
app.json全局tabBar设置tabBar不显示 由于小程序的机制问题,首页的tabBar第一个导航必须是首页 "pages": [ "pages/index/in ...