mybatis设计大接口的坑以及做法

2023-11-15

先说一些注意事项:

1.注:mybatis一个mapper.java文件只能对应一个mapper.xml文件,所以不能一个mapper.java对应两个xml(一个默认的,一个自己拓展的)

2.注:如果表中有字段是text,selectByExample是不能返回该字段的,最终结果该字段为null;如需返回,则使用selectByExampleWithBLOBs方法

3.注:updateByExampleWithBLOBs使用的时候需要注意,需要传入全部的字段进行替换,否则会覆盖成null

4.注:自定义的mapper方法,如果参数一个可以不写 @Param,如果多个参数,则参数名前必须写上,如果是example也需要写上@Param

 

一个大查询接口的设计:

1.一个查询接口要能够支持所有的表

传入的参数定义:

//指定表
  @JsonProperty("table")
  private String table;

//指定查询条件
  @JsonProperty("query")
  private JSONObject query;

//指定返回属性
  @JsonProperty("fields_return")
  private List<String> fieldsReturn;

  @JsonProperty("limit")
  private Integer limit;

  @JsonProperty("start")
  private Integer start;

  @JsonProperty("order")
  private String order;

注:更新与查询设计类似,不再赘述

设计接口如下:所有impl实现该接口(类似于责任链)

public interface DbService<TRes> {
    /**
     * 获取表中数据
     * @param req
     * @return
     */
    List<TRes> get(DbQueryReq req);

    /**
     * 更新表中数据
     * @param req
     * @return
     */
    void update(DbUpdateReq req);

    /**
     * 新增表中数据
     * @param req
     * @return
     */
    void add(DbAddReq req);

    /**
     * 删除后表中数据
     * @param req
     * @return
     */
    void delete(DbDeleteReq req);
}

 

2.传入/返回 的json为下划线,接收的对象为驼峰

接收和返回的类字段全部加上注解:

@JsonProperty("id")
private String id;

 

3.返回值必须设计成Object,返回的时候fastjson会将值为null的key直接屏蔽,不返回,需要做到支持返回null

/**
     * 该配置将驼峰转化为下划线
     *
     * SerializerFeature.WriteMapNullValue 将NULL值返回
     */
    static SerializeConfig serializeConfig = new SerializeConfig();
    static {
        serializeConfig.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
    }


返回的时候使用以上两个配置:

jsons = NotNull.getList(Res).stream().map(r -> JSONObject.parseObject(JSON.toJSONString(r, serializeConfig, SerializerFeature.WriteMapNullValue))).collect(Collectors.toList());

4.更新的时候只传入要更新的字段可以使用updateByExampleSelective,如果需要set 属性 为null,则无法支持了,该如何支持?

xml:

<update id="updateColumnByExampleSelective" parameterType="map">
    update paas_host
    <set>
      <foreach collection="map.entrySet()"  item="item" index="key" separator=",">
        ${key} =  #{item}
      </foreach>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>


Java:

/**
     * 自定义update方法
     * 实现更新字段可选
     * 可set列为null
     * update的查询条件为所有字段且可为null
     * @param map
     * @param example
     * @return
     */
    void updateColumnByExampleSelective(@Param("map") Map<String, Object> map, @Param("example") DbExample example);

 

5.查询的时候需要查询某列为null,需要如何支持?

// get\update\delete的查询复用以下方法:


    private boolean setSearchExample(JSONObject query, DbExample.Criteria criteria) {

        boolean hasValidQuery = false;
        if(query != null){
            if(query.containsKey("ids")){
                hasValidQuery = true;
                if(query.getJSONArray("ids") != null){
                    List<Integer> ids = JSONObject.parseArray(query.getJSONArray("ids").toJSONString(), Integer.class);
                    criteria.andIdIn(ids);
                } else {
                    criteria.andIdIsNull();
                }
            }
            if(query.containsKey("id")){
                hasValidQuery = true;
                if(query.getInteger("id") != null){
                    criteria.andIdEqualTo(query.getInteger("id"));
                } else {
                    criteria.andIdIsNull();
                }
            }          

        }
        return hasValidQuery;
    }

6.如何设计支持大接口的指定返回值?-----暂未找到好的方案

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis设计大接口的坑以及做法 的相关文章

  • 导入 CSV 以更新表中的行

    大约有 26K 个产品 帖子 每个产品都有如下元值 post id 列是数据库中的产品 ID sku meta key 是每个产品的唯一 ID 我收到了一个新的 CSV 文件 该文件更新了每个产品的 sale price meta key
  • PHP:使用输入和输出参数(不是“INOUT”)调用 MySQL 存储过程

    我想从 PHP 调用 MySQL 中的存储过程 该过程需要输入and输出参数 not INOUT 参数 举一个简单的例子 假设我在 MySQL 中有以下存储过程 DELIMITER DROP PROCEDURE IF EXISTS test
  • 不唯一的表/别名

    因此 我尝试使用多个联接来运行此查询 以获得我想要的精确行 但我不断收到此错误 不唯一的表 别名 ss prices 我正在运行的查询 select ss accounts id ss accounts bot acc id ss acco
  • 为什么 sql 字段名称中不应该包含逗号?

    人们一直告诉我列名中不应包含空格 我只是想知道 这是为什么 这是我为学校创建的一些数据库表遇到的问题 字段名称包括 Preble 和 Darke 相反 它们需要是 普雷布尔县 俄亥俄州 和 达克县 俄亥俄州 如果它们是行名称 我只需创建一个
  • MySQL中是否有类似Oracle中“level”的函数[重复]

    这个问题在这里已经有答案了 我面临一个场景 如果输入是 10 我想要一个数字序列 1 2 3 10 在甲骨文中levelfunction 提供了该功能 我想知道如何在 MySQL 中执行相同的任务 谢谢 您可以在 mysql 中使用此查询
  • 如何在 Windows 上安装 PHP 的 PDO 驱动程序?

    我在 Windows 服务器上安装了 Apache PHP 5 6 和 MySQL 5 7 在 php ini 中 我启用了以下内容 extension php mysql dll extension php mysqli dll exte
  • 如何在 MariaDB 10 中启用大索引?

    在 Debian Jessie 中 我安装了 MariaDB 服务器 10 0 30 并尝试增加最大密钥长度 AFAIU 这取决于配置参数innodb large prefix正在启用 根据docs https mariadb com kb
  • 使用 pip3 安装 mysqlclient 时遇到问题

    我正在尝试使用 Django 设置 python 3 6 环境 安装说明说我应该安装 mysqlclient 才能连接到 mySQL 我明白了 dennis django sudo H pip3 install mysqlclient Co
  • Oracle:如何查找模式中上次更新(任何表)的时间戳?

    有一个Oracle数据库模式 数据很小 但仍然有10 15个表左右 它包含一种配置 路由表 有一个应用程序必须不时轮询此架构 不得使用通知 如果架构中没有数据更新 应用程序应使用其当前的内存版本 如果任何表有任何更新 应用程序应将所有表重新
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • 仅当变量不为空时 SQL 添加过滤器

    您好 我有疑问如下 SELECT route id ROUTE ID FROM route master NOLOCK WHERE route ou 2 AND route query l s query AND lang id 1 这里
  • PHP 中的异步数据库/服务调用:Gearman 与 pthreads

    在我们的 LAMP 站点上 我们遇到一些服务必须多次调用数据库才能提取数据的问题 通常在 PHP 中完成此操作的方式 至少我的经验 是串行的 这显然是低效的 我们可以通过使用缓存和聚合一些查询来缓解一些低效率的问题 但在某些情况下我们仍然需
  • 使用 mysql2 gem 获取最后插入的 id

    我有这样的代码 require mysql2 db query insert into clients Name values client 我可以通过 1 个查询返回最后插入的 ID 吗 您可以使用last id客户端实例的方法 clie
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • PDO fetch() 失败时会抛出异常吗?

    有没有方法PDO语句 fetch http php net manual en pdostatement fetch php如果 PDO 错误报告系统设置为抛出异常 则在失败时抛出异常 例如 如果我设置 PDO ATTR ERRMODE g
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • Spark SQL/Hive 查询通过 Join 永远持续下去

    所以我正在做一些应该很简单的事情 但显然它不在 Spark SQL 中 如果我在 MySQL 中运行以下查询 查询将在不到一秒的时间内完成 SELECT ua address id FROM user u inner join user a
  • 将列的值添加到 LIKE 语句中?

    我有 3 个标签表 标签类别和使用过的标签 我想要获取所有标签的列表以及已使用标签的计数 所使用标签的格式是每个具有标签的文档 ID 的逗号分隔值 我一直在尝试类似的方法 但无法将tags tag 字段的值插入到LIKE 语句中 SELEC
  • RMySQL fetch - 找不到继承的方法

    使用 RMySQL 我想将数据从数据库加载到 R 中的数据帧中 为此 我使用以下代码 R连接数据库 con lt dbConnect MySQL user root password password dbname prediction h

随机推荐

  • Vue 高德地图实现添加标记,AMap.PlaceSearch 地点搜索,根据页面主题修改地图样式

    Vue 高德地图实现添加标记 AMap PlaceSearch 地点搜索 根据页面主题修改地图样式 效果图 成为开发者并创建key 详细请查阅官方文档 https developer amap com api jsapi v2 guide
  • 分布式锁实现方案3、基于Redis的SET操作实现的分布式锁

    在我的上一篇文章中 关于redis分布式锁的写法 释放锁还有些缺陷 细节见评论部分 本文进一步做了完善 分布式锁实现方案2 基于Redis的SET操作实现的分布式锁 package com alioo common lock import
  • 【leetcode.283】——移动零

    题目 注意 解析 思路 定义left和right指针 都初始化在数组的第一个位置 right指针一直向右走 如果right走到指向的值不为0时 那么right指针指向的值与left指针指向的值进行交换 然后left指针再向后走一步 如此循环
  • c++十大排序——快速排序

    算法基本知识铺垫 有些人可能不知道什么是稳定排序 原地排序 时间复杂度 空间复杂度 我这里先简单解释一下 1 稳定排序 如果 a 原本在 b 的前面 且 a b 排序之后 a 仍然在 b 的前面 则为稳定排序 2 非稳定排序 如果 a 原本
  • nodejs高大上的部署方式-PM2

    如果直接通过node app来启动 如果报错了可能直接停在整个运行 supervisor感觉只是拿来用作开发环境的 再网上找到pm2 目前似乎最常见的线上部署nodejs项目的有forever pm2这两种 使用场合 supervisor是
  • 旋转链表——快慢指针法的实践

    一 题目 给你一个链表的头节点 head 旋转链表 将链表每个节点向右移动 k 个位置 示例1 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL k 2 输出 4 gt 5 gt 1 gt 2 gt 3 gt NULL 解释
  • matlab灵敏度分析操作,灵敏度分析 使用MATLAB编写.doc

    灵敏度分析 使用MATLAB编写 实验二 线性规划的灵敏度分析 实验目的 1 线性规划求解的单纯形法的灵敏度分析的编程实现 2 掌握使用matlab Lingo Excel的规划求解功能求解 并利用 敏感性报告 进行分析 二 实验内容 课本
  • wazuh中的规则编写以及日志分析

    目录 什么是wazuh 如何搭建wazuh 实验环境 wazuh的规则 配置代理 wazuh中的配置了解 ssh的暴力破解 用户自定义规则 SQL注入的检测 什么是wazuh Wazuh是一个免费 开源和企业级的安全监控解决方案 用于威胁检
  • 【2223sW2】LOG2

    写在前面 好好学习 走出宿舍 走向毕设 一些心路历程记录 很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧 还是不要给自己的查重挖坑罢了 23 3 2 检验FFT 早上师兄帮忙看了一眼我画的丑图 说样子应该是对的 增加了检查的精
  • D3DXMESHOPT_ATTRSORT

    Mesh的顶点和索引能够被重组以便能更有效的渲染mesh 当我们这样做时 我们说我们优化了一个mesh 我们可以使用下面的方法来进行优化 HRESULT ID3DXMesh OptimizeInplace DWORD Flags CONST
  • DbVisualizer数据库管理工具

    一款数据库管理工具 推荐使用 安装包及破解方法见盘附件 百度云盘 http pan baidu com share link shareid 253466598 uk 1629211176
  • 【Unity3D日常开发】Unity3D中比较string字符串的常用方法

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好 我是佛系工程师 恬静的小魔龙 不定时更新Unity开发技巧 觉得有用记得一键三连哦 一 前言 字符串string的比较有很多方法 比如 E
  • vlc实现PC与树莓派的视频流传输

    目录 一 使用vlc实现PC与树莓派之间的视频流传输 一 Windows 二 树莓派 二 树莓派与Windows系统之间的聊天 三 非堵塞方式传输图像 视频文件 一 使用vlc实现PC与树莓派之间的视频流传输 一 Windows 安装下载v
  • opencv双目视觉标定,激光结构光提取,指定特征点获取世界坐标

    双目视觉标定 激光结构光提取 指定特征点获取世界坐标 标定方面 校正 结构光提取 二维点转换为三维点 总结 这学期在做双目视觉方面的事情 因为没人带 自己一个人踩了很多坑 因此在这写一点自己的总结心得 标定方面 首先标定主要就是为了确定左右
  • Qt5下串口编程中“QIODevice::write (QSerialPort): device not open”问题的分析处理总结

    一 实现功能说明 在主窗口中先配置好串口并 打开串口 在菜单中点击 测量 子窗口 进入子窗口画面 点击子窗口的 测量 按钮 实现读取传感器指令的数据发送 二 程序说明 主窗口 1 MainWidget h 定义类MainWidget 构造函
  • 数据库行锁

    数据库行锁 仅作为笔记 码字不易 转载请标明出处 文章目录 数据库行锁 前言 一 数据库行锁 前言 仅作为笔记 一 数据库行锁 两阶段锁 在 InnoDB 事务中 锁是在需要的时候才加上的 但并 是 需要 就立刻释放 而是要等到事务结束时才
  • Mongdb查询 - 比较运算符、逻辑运算符、$type、游标

    目录 一 比较运算符 Mongo查询条件和SQL查询对照表 比较运算符示例 二 逻辑操作符 逻辑操作符示例 not用法 and用法 eq用法 or用法 三 type操作符 四 文档游标 基本操作 游标的执行顺序 limit skip sor
  • CGAL的编译与配置

    CGAL的编译与配置 网上已经有一些配置的步骤 但是在具体配置过程中 发现有很多问题 折腾了两天后终于配置成功 在此做更详细的记录 准备 CGAL CGAL4 7和CGAL4 9的库 分别编译成功了 BOOST boost1 59的版本 C
  • 2022经典前端面试题大全 h5 +cs +js

    一 页面布局 三栏布局 题目 假设高度已知 请写出三栏布局 其中左栏 右栏宽度各为 300px 中间自适应 解答 可以有很多种布局方式 这里列出五种 float布局 absolute布局 flex布局 table布局 grid布局 代码如下
  • mybatis设计大接口的坑以及做法

    先说一些注意事项 1 注 mybatis一个mapper java文件只能对应一个mapper xml文件 所以不能一个mapper java对应两个xml 一个默认的 一个自己拓展的 2 注 如果表中有字段是text selectByEx