MyBatis实操进阶版(一)

  目前而言,持久层框架中,在业务实现灵活性上,无可出MyBatis之右者.具体原因,后续将逐步展开

  ResultMap元素的设置

  配置文件中,ResultMap元素的作用临时存储sql执行结果集与Java对象之间的映射,用以实现数据的持久性.基于此,sql返回结果集更加多样/不必局限于表关系,同时接收对象更加灵活多变,可以自由根据数据需求,设置接收字段,搭配association和collection标签,可以灵活设置数据子集的配置,而且进一步降低了业务层与数据库间的交互次数,尤其是在处理复杂业务逻辑sql设置的时候,完成这一套配置后,唯一的感觉--爽.

  示例 :  业务逻辑省略,直接上代码

    Java对象设置: -- 包含集合

public class CameraTrackInfo {

    private Integer personId;
private String faviconUrl;
private String name;
private Long startTime;
private Long endTime;
private String cameraId;
private List<CameraTrack> cameraTracks; ... ... }

    xml配置(resultMap & sql)

  resultMap设置,其中包含子元素集获取多参传输的问题,博客后半部分详解

<resultMap id="rightListMap" type="com.rosetta.face.entity.CameraTrackInfo">
<result column="person_id" property="personId" jdbcType="INTEGER" />
<result column="favicon_url" property="faviconUrl" jdbcType="VARCHAR" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="start_time" property="startTime" jdbcType="BIGINT" />
<result column="end_time" property="endTime" jdbcType="BIGINT" />
<result column="camera_id" property="cameraId" jdbcType="VARCHAR" />
<collection property="cameraTracks" column="{startTime=start_time,endTime=end_time,cameraId=camera_id,personId=person_id}" select="selectTracksById" />
</resultMap>

  子结果集获取

<select id="selectTracksById" parameterType="java.util.Map" resultMap="BaseResultMap">
SELECT c.id,c.camera_id,c.person_id,c.now_timestamp,c.url
FROM camera_track c
<where>
<if test="personId != null">
AND c.person_id = #{personId}
</if>
<if test="startTime != null and endTime != null">
AND c.now_timestamp &gt;= #{startTime} AND c.now_timestamp &lt;= #{endTime}
</if>
<if test="cameraId != null">
AND c.camera_id = #{cameraId}
</if>
</where>
ORDER BY c.now_timestamp
</select>

  结果集获取,此处包含参数传递的设置,下文详解

<select id="queryBossCameraTracks" resultMap="rightListMap" parameterType="java.util.Map">
SELECT DISTINCT c.person_id,p.favicon_url,p.name,#{params.startTime} AS start_time,#{params.endTime} AS end_time,#{params.area} AS camera_id
FROM camera_track c
LEFT OUTER JOIN person p ON c.person_id = p.person_id
<where>
<if test="params.personId != null">
AND c.person_id = #{params.personId}
</if>
<if test="params.personName != null">
AND p.name=#{params.personName}
</if>
<if test="params.startTime != null and params.endTime != null">
AND c.now_timestamp &gt;= #{params.startTime} AND c.now_timestamp &lt;= #{params.endTime}
</if>
<if test="params.area != null">
AND c.camera_id = #{params.area}
</if>
</where>
ORDER BY c.now_timestamp
</select>

  Mapper接口实现,同上,下文详解

List<CameraTrackInfo> queryBossCameraTracks(@Param("params")Map<String,Object> map);

  概述,上述代码用以实现结果集中某字段为条件进一步获取子结果集,组合获取最终结果集的过程.

  MyBatis参数设置为Map

  实际开发中,不可能因为请求参数多个就随意新增实体类,Map的使用尤其关键,这里不同于表现层Map参数获取运行期报错,MyBatis支持Map传参.

  1) 使用 @Param注解,并设置唯一性key,故Map可以是多个,用key加以区分即可

  2) xml中,key.column的形式传递参数

  ResultMap子结果集获取多参传递

  子结果集的获取单个和多个出现的频率都很高,同时,有些参数并不在原有的结果集中就有,需要更上一级来传递,这时候就需要在select的返回结果中做文章,这就是前文代码的逻辑.

  1) select 'param' as column from dual . 自定义设置返回结果,设置结果中字段column的值为param

  2)<collection column="{aa=bb,cc=dd....}">,aa/cc为自定义key,并根据结果集字段<result>中的 column属性设置value(bb/dd).

  3)子结果集查询sql在接收参数时,无需设置key,直接引用字段即可.

MyBatis实操进阶版(一)的更多相关文章

  1. ElasticSearch7.2简单命令实操(postman版)

    使用postman访问操作ElasticSearch数据库,数据格式均为json 目录 使用postman访问操作ElasticSearch数据库,数据格式均为json 一.集群设置 1.查看集群设置 ...

  2. Docker安装MySql完整教程、实操

    docker:官网 docker:镜像官网:        镜像官网可以所有应用,选择安装环境:会给出安装命令,例如:docker pull redis 默认拉取最新的版本(指定版本:docker p ...

  3. QVM 实操记 - 18.12.28

    视频回放地址:https://i.iamlj.com/mp4/QVM-IMC-12.27-1080P.mp4 目录 目录 常规开发部署流程 准备工作 开发准备 网站部署 操作步骤 重装系统 LANP环 ...

  4. 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)

    如约而至,Java 10 正式发布!   3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...

  5. 百度NLP预训练模型ERNIE2.0最强实操课程来袭!【附教程】

    2019年3月,百度正式发布NLP模型ERNIE,其在中文任务中全面超越BERT一度引发业界广泛关注和探讨.经过短短几个月时间,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基 ...

  6. 从零实操基于WSL2 Docker部署Asp.Net Core项目

    前言 平日在公司里都是基于阿里Teambition中的飞流进行Docker部署Api项目或服务,已经习惯了那一套成熟的操作流程,开发和部署确实快捷方便,但是还没在自己的电脑上进行操作过,特别是Wind ...

  7. Iptables 实操

    目录 Iptables之实操 简介 名称概念: 四表中常用的表 Nat表 Filter表 iptables表和链的工作流程图 iptables过滤图 Iptables安装 Iptables 命令说明 ...

  8. 生产环境搭建高可用Harbor(包括恢复演练实操)

    生产环境搭建高可用Harbor(包括恢复演练实操) 前言 因资源成本问题,本Harbor高可用架构为最小开销方案,如果资源充足,可以将PG.Redis全部使用使用云厂商集群模式. 同时为了配置简单,并 ...

  9. jmeter & 性能测试:从0到实战(实操易用、面试造火箭、升职加薪必备)

    [性能基础] 性能测试概念.术语:https://www.cnblogs.com/uncleyong/p/10706519.html 性能测试流程(新):https://www.cnblogs.com ...

随机推荐

  1. [SHOI2006]color 有色图[群论、组合计数]

    题意 用 \(m\) 种颜色,给 \(n\) 个点的无向完全图的 \(\frac{n(n-1)}{2}\) 条边染色,两种方案相同当且仅当一种方案交换一些点的编号后可以变成另一种方案.问有多少本质不同 ...

  2. NCC Meetup 2018 Shanghai 活动小结(含PPT与视频)

    NCC Meetup 2018 上海的活动于2018年6月30日在微软上海港汇办公室进行.原本计划30人规模的小型活动,结果收到了逾60人的报名,其中大部均来到现场参加了活动. 本次活动得到了微软公司 ...

  3. DSL 系列(1) - 扩展点的论述与实现

    前言 DSL 全称为 domain-specific language(领域特定语言),本系列应当会很长,其中包含些许不成熟的想法,欢迎私信指正. 1. DSL 简述 我理解的 DSL 的主要职能是 ...

  4. Pandas基础使用

    Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的. 1.导入pandas import pandas as pd 2.pandas数据类型: 1)Series:一维数据类型 ...

  5. dcoker搭建wordpress

    下载wordpress镜像 docker pull wordpress 创建wordpress容器 docker run -d --name wordpress --link mysql:mysql ...

  6. H5 文本属性

    06-文本属性 我是文字 我是文字 我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是段落我是 ...

  7. Python类与对象的理解

    注意python的类对象与实例对象的区分 类对象与实例对象是相对的,例如:a=1,那么a就是int的一个实例对象,这里的a相对于int来说,a是实例对象,int是类对象.但是int同时又是type的实 ...

  8. Yii框架的增删改查总结分析

    一.查询数据 1.findAll(根据一个条件查询一个集合) $admin=Admin::model()->findAll($condition,$params); $admin=Admin:: ...

  9. iOS--LaunchImage启动页设置及问题解决

    在Assets.xcassets中使用LaunchImage来设置启动图:   一.根据不同屏幕尺寸的需求设置不同的图片,可以参照下图: 1.点击Image.xcassets 进入图片管理,然后右击, ...

  10. 第五章 动态SQL 批量操作

    用于实现动态SQL的元素主要有 if trim where set choose(when.otherwise) foreach MyBatis  缓存 一级缓存 在test类中 调用相同的方法 第二 ...