一、mybatis动态查询(分页排序搜索)

mybatis框架分页实现,有几种方式,最简单的就是利用原生的sql关键字limit来实现,还有一种就是利用interceptor来拼接sql,实现和limit一样的功能,再一个就是利用PageHelper来实现。
因为我是使用的limit实现,有分页,排序,搜索功能,这里记录一下:

//Mapper.xml
<select id="findXxx" resultType="com.Xxx">SELECT*FROMXxx<where>有其他条件加在这里,先搜索,再排序,最后分页。limit要放最后<include refid="SearchCond"/><include refid="SortCond"/><include refid="PageCond"/></where></select><sql id="PageCond"><if test="@java.util.Objects@nonNull(pageInfo)">limit #{pageInfo.offset, jdbcType = INTEGER}, #{pageInfo.pageSize, jdbcType = INTEGER}</if></sql><sql id="SearchCond"><if test="@java.util.Objects@nonNull(searchRequest)"><if test="searchRequest.fields != null and searchRequest.fields.size() != 0"><foreach collection="searchRequest.fields" item="field" index="index" open="and (" close=")" separator="or">${field} like concat ('%', #{searchRequest.keyword,jdbcType=VARCHAR} ,'%')</foreach></if></if></sql><sql id="SortCond"><if test="@java.util.Objects@nonNull(sortRequest) and @java.util.Objects@nonNull(sortRequest.field)">order by${field}<choose><when test="@java.util.Objects@nonNull(sortRequest.order) and sortRequest.order.toString.equals('DESC')">desc</when><otherwise/></choose></if></sql>//dao层
List<TagSet> findXxx(@Param("pageInfo") PageInfo pageInfo,@Param("searchRequest") SearchRequest searchRequest,@Param("sortRequest") SortRequest sortRequest);//通用类,这个getOffset注意一下,如果不这样写也可以,就在Mapper.xml自己写。
public class PageInfo {private Integer pageIndex;private Integer pageSize;private Integer getOffset () {return (this.pageIndex - 1) * this.pageSize;}
}
public class SearchRequest {/*** 搜索字段名称* 可多选*/private Set<String> fields;/*** 搜索关键字*/private String keyword;
}public class SortRequest {private String field;private String order;public Sort.Direction getOrder() {if ("ascending".equalsIgnoreCase(order)) {return Sort.Direction.ASC;}return Sort.Direction.DESC;}
}

代码很简单,但是还是有很多细节需要注意,比如pageCond中的。如果我不是用的getOffset去获取的话,就只有用类似${(page-1)*size}的方式,当然这就没法防止sql注入。还有就是要考虑好各种情况,有时候参数不传的情况下自己的sql语句是否有语法错误等。

遗留问题:比如排序的时候,我们可能得到前端传过来的是updateTime,但是数据库字段是update_time。这就要自己写if判断然后转换了吗?有没有通用性更好的办法呢?

参考: mybatis三种分页方法

二、分解关联查询

《高性能sql》中有提到:分解了关联查询后,可以让缓存的效率更高;执行单个查询可以减少锁的竞争;在应用层做关联可以更容易做到高性能和可扩展;本身查询效率更高;减少冗余记录等优势。所以我应该减少关联查询。

三、logback 日志配置

日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
springboot默认情况下是利用logback把info级别打印到控制台:
root标签可以改变你想打印的级别,比如debug,就会打印等于和大于该级别的日志。

<root level="DEBUG">

当然,想打印sql语句就需要用到logger标签,把dao层设为:

<logger name="com.xxx.dao" level="DEBUG" />

最后,如果设置了过滤级别,也需要同步修改,不然不生效

 <filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>info</level></filter>

参考:
SpringBoot项目的logback日志配置(包括打印mybatis的sql语句)

四、mybatis新增记录后返回自增的id。批量

单个自增id
这个好理解,直接加上useGeneratedKeys=“true” keyProperty=“user.Id”,就可以。

<insert id="insertXxx" useGeneratedKeys="true" keyProperty="xxx.id">
取这个id的话就:xxx.getId()

不过网上说有坑需要注意:主键要设自增,dao层不要用@param。
批量

我遇到的问题是:批量插入数据,永远只返回最后一个id。
解决:问题出在xml文件的写法上。我写成了<foreach>insert XXXXXX</foreach>。这样会导致只返回最后一个自增id。应该写成insertXXX<foreach>(XX,XX,XX)</foreach>。简单来说就是一个insert就够了,foreach标签位置要放对。如果很多insert的话感觉就会把前面的覆盖掉了。。。(不太懂底层是怎样的)

<insert id="insertList" useGeneratedKeys="true" keyProperty="dbId" keyColumn="dbId">INSERT INTO `aity`.`xxx`(`name`, `color`)<foreach collection="list" item="c" index="index" open="VALUES" separator=",">(#{c.name, jdbcType=VARCHAR},#{c.color, jdbcType=VARCHAR})</foreach></insert>//dao层
void insertList(List<Xxx> list);取的话也好取,同样什么传入的就什么接收id,这里就是list了。for(Xxx l : list){l.getDbId()}

参考:
mybatis插入数据后返回自增主键ID详解

mybatis动态查询(分页排序搜索)+分解关联查询+Logback 日志配置(打印sql到控制台)+mybatis新增记录后返回自增的id。批量=11/2~11/20相关推荐

  1. mysql一对多关联查询分页_mysql一对多关联查询分页错误问题的解决方法

    xml问价中查询数据中包含list,需要使用collection .... .... 这样的查询系统封装的通用分页查询是不对的,所以需要自己sql中加入分页解决 SELECT you.nick_nam ...

  2. MyBatis 如何实现一个多对多的关联查询呢?

    转自: MyBatis 如何实现一个多对多的关联查询呢? 下文将通过示例的方式,讲述多对多的关联查询,如下所示: 例 ,一个订单可以有多种商品, 一种商品可以对应多个订单, 订单与商品就是多对多的级联 ...

  3. 使用resultMap定义查询结果集,实现关联查询

    接下来介绍resultMap定义查询结果集,实现关联查询 1 首先在接口中定义操作的方法 public interface EmployeeMapperPlus { public Employee g ...

  4. oracle多表关联查询报表,oracle多表关联查询和子查询

    oracle多表关联查询和子查询 一.多表关联查询 例子: sql> create table student1 ( sid varchar(3), sname varchar(6), sage ...

  5. mybatis plus 格式话_mybatis plus3.3.2配置打印sql

    如何配置mybatis plus配置打印sql,控制台输出配置显示sql语句进行调试程序如何配置,如何配置mybatis,实测使用mybatis-plus-boot-starter3.3.2成功打印. ...

  6. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询

    上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...

  7. MyBatis复习(五):获取多表关联查询结果

    Map保存查询结果 <select id="selectBlogMap" resultType="java.util.Map">select b.* ...

  8. mysql 子表 关联查询语句_mysql查询语句 和 多表关联查询 以及 子查询

    1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 from ...

  9. mysql多表查询语句_mysql查询语句 和 多表关联查询 以及 子查询

    1.查询一张表:select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select字段1,字段2,字段3 frome ...

最新文章

  1. IDEA一定要改的八条配置
  2. Rhel5.6下构建在线邮件服务系统并实现不同网段不同域名间的邮件互发
  3. 如果征信有这些行为,申请房贷直接被拒绝
  4. 一键清除 打印机内无法清除作业
  5. linus开启snmp_【snmp】Linux开启snmp及查询
  6. 用纯css3和html实现一些复杂的泡沫对话框
  7. sqlserver日志文件在哪_用友SQL SERVER数据库置疑修复实例
  8. [转载][HASS.IO] 【HASSOS安装】成功安装HASSOS 1.9(避开了大部分坑版)
  9. c语言 美元符号,汇编语言 美元符号
  10. Python 编程的最好搭档—VSCode 实用指南
  11. matlab表格数据输入方式,matlab输入excel表格数据-matlab怎么把数据写入excel
  12. 如何把计算机组成原理、操作系统、数据结构和计算机网络融会贯通,相互联系起来?
  13. Oracle中 Alter Table 语句的使用
  14. python中base64库用法详解
  15. OSChina 周二乱弹 —— 糟糕 是喵动的感觉
  16. 面试官:你了解 QPS、TPS、RT、吞吐量 这些高并发性能指标吗?
  17. 中国天气网 天气预报API 国家气象局 根据城市名称抓取城市ID,XML格式、JSON格式、图片代码...
  18. 用java定义中国象棋的棋子_java大神 求帮忙 我坐的中国象棋怎样移动棋子
  19. android 微信朋友圈微博分享
  20. MySQL进阶系列: 一文详解explain各字段含义

热门文章

  1. 09组织安全:为 MFA 的采用实施基于风险降低的激励模型
  2. Pythom爬取网站方案实现探讨(附完整代码)
  3. 09C语言高级篇之头文件的编写
  4. 伊顿车辆集团荣获通用汽车“2021年度最佳供应商”称号
  5. [RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结
  6. 汇编语言debug命令与指令机器码
  7. android+.9尺寸大小,华为Mate 9的屏幕尺寸是多少?分辨率是多少?
  8. 人工蜂群算法(Artificial Bee Colony Algorithm,ABC)
  9. P2356 弹珠游戏题解
  10. ARC060 E Tak and Hotels 倍增