MyBatis中SQL语句优化小结
摘要:MyBatis 作为一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。
MyBatis 作为一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。它免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。还可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。接下来为大家带来在日常应用的过程中的一些小技巧。
一、MyBatis总结
1.MyBatis查询/更新语句,没有找到符合条件的记录,会返回什么?
返回类型为String的, 实际返回null;
返回类型为对象的:实际返回null ;
返回类型为列表等集合: 实际返回空集合[];
返回类型为Boolean:实际返回false
当数据库语句插入条件不满足,会返回false;比如使用dual的SQL语句;
2.mybatis会抛出哪些常见异常?
不是所有的异常,都认为程序出异常要报错,
比如用户重复收藏商品,可以直接返回成功,这时候对“违反唯一键”异常要特殊处理。
(1) 插入语句
DataIntegrityViolationException: 违反非空约束、数据大小超过约束
DuplicateKeyException:违反唯一键约束
CannotAcquireLockException: for update nowait 超时
(2)更新语句
条件不满足时,会返回false
数据库操作应该判断返回值,比如下面BUG:
(3) bug类,表字段找不到等场景
MyBatisSystemException
BadSqlGrammarException
3.事务里面套用for update,看上去绕过了事务
等for update获取锁后,select出来的是最新的数据
4.for update是一种行级锁,又叫排它锁,
一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行;
如果查询条件带有主键,会锁行数据,如果没有,会锁表。
如果一定要用FOR UPDATE,建议加上NOWAIT 或 for update wait 3
二、SQL优化
1. 约束条件:数据表增加表的约束条件,防止脏数据。
2. limit1:如果我们知道返回结果只有 1 条,就可以使用LIMIT 1,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。
3.拼写风格:SQL保留字使用英文大写,其他使用英文小写;提高可读性。
4.Like:使用like加通配符,可能使得索引失效,会触发全表扫描。如果要让索引生效,那么 LIKE 后面就不能以(%)开头,比如使用LIKE '%太%'或LIKE '%太'的时候就会对全表进行扫描。如果使用LIKE '太%',同时检索的字段进行了索引的时候,则不会进行全表扫描。
5.对常用于搜索的字段添加索引,能极大增加查询效率
6.使用“自连接”优于子查询。
7.使用视图:
视图可以理解成给一个查询SQL起个别名。
只不过提前经过编译,视图不能传入变量,不保存数据
视图的优点是:隔绝数据表操作
8.使用临时表:
http://9.IN/EXIST 使用类似两层for循环,遵循小表驱动大表原则。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)
select * from A where cc in (select cc from B) ;// 效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc) ;// 效率高,用到了B表上cc列的索引。
10.不建议使用索引的情况:
(1)总数据量很少。
(2)数据重复度大,且不同取值分布均匀,比如性别男女比例各接近50%。
11.唯一索引/唯一键有3个字段时,按其中1个字段查询,是否比没有索引效率高?
---- 没有,这种情况创建唯一键,更多的是为了保证数据正确性。
(1)唯一索引和唯一键的区别?
(2)创建联合索引时,我们需要注意创建时的顺序问题,因为联合索引 (x, y, z) 和 (z, y, x) 在使用的时候效率可能会存在差别。比如刚才举例的 (x, y, z),如果查询条件是 WHERE x=1 AND y=2 AND z=3,就可以匹配上联合索引;如果查询条件是 WHERE y=2,就无法匹配上联合索引。
12.连接表:
(1)连接表的数量尽量不要超过 3 张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。
(2)对用于连接的字段创建索引,并且该字段在多张表中的类型必须一致。比如 user_id 在 product_comment 表和 user 表中都为 int(11) 类型,而不能一个为 int 另一个为 varchar 类型。
13.索引失效情况
(1)在 WHERE 子句中,如果在 OR 前的条件列进行了索引,而在 OR 后的条件列没有进行索引,那么索引会失效。
(2)索引列尽量设置为 NOT NULL 约束。
14.数据表字段,不要用bool类型,用int2 代替 bool类型,增加扩展能力
本文分享自华为云社区《mybatis使用及SQL语句优化小结》,原文作者:搬搬砖打打游戏 。
MyBatis中SQL语句优化小结的更多相关文章
- mybatis中sql语句传入多个参数方法
1 使用map <select id="selectRole" parameterType="map" resultType="RoleMap& ...
- MyBatis中sql语句
一.select <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String&qu ...
- mybatis中sql语句必须用${}而不能不用#{}的情况
在mybatis中如果我们使用#{}的方式编写的sql时,#{} 对应的变量自动加上单引号 ' ' 例如: select * from #{param} 当我们给参数传入值为user时,他的sql是这 ...
- Mybatis 中 sql 语句的占位符 #{} 和 ${}
#{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换.#{} 可以有效防止 sql注入. #{} ...
- Mybatis中sql语句中的in查询,一定要判断null的情况
不严谨的写法,可能会报错:in (),这种情况不符合mysql的语法. select from loanwhere LOAN_ID in <foreach item="item&quo ...
- sql语句优化小结
sql的优化技巧. 1.用join进行子查询的优化. 低效的子查询 select a.user_name,a.over,(select over from user2 b where a.user_n ...
- 数据库SQL语句优化小结
网上查找的总结: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null ...
- mybatis中SQL语句运用总结
union 连接查询 连接两个表后会过滤掉重复的值 <resultMap id="BaseResultMap" type="com.sprucetec.pay.e ...
- mybatis中sql语句查询操作
动态sql where if where可以自动处理第一个and. <!-- 根据id查询用户信息 --> <!-- public User findUserById(int id) ...
- Mybatis中sql语句中的in查询,判断null和size为0的情况
不严谨的写法,可能会报错:in (),这种情况不符合SQL的语法,导致程序报错. 如果简单只做非空判断,这样也有可能会有问题:本来in一个空列表,应该是没有数据才对,却变成了获取全部数据! 所以一个比 ...
随机推荐
- Vue之style的用法
Vue中style的用法总结如下: v-bind:style 简写:style 1.基本用法 <!DOCTYPE html> <html lang="en"&g ...
- 栩栩如生,音色克隆,Bert-vits2文字转语音打造鬼畜视频实践(Python3.10)
诸公可知目前最牛逼的TTS免费开源项目是哪一个?没错,是Bert-vits2,没有之一.它是在本来已经极其强大的Vits项目中融入了Bert大模型,基本上解决了VITS的语气韵律问题,在效果非常出色的 ...
- C# 在流行度指数上将超过Java
2023年10月最新的TIOBE编程语言流行指数表明:C#和Java之间的差距从未如此之小,目前,差异仅为1.2%,如果趋势保持这种状态,C#将在大约2个月内超过Java,TIOBE Software ...
- K8s - 安装部署Kafka、Zookeeper集群教程(支持从K8s外部访问)
本文演示如何在K8s集群下部署Kafka集群,并且搭建后除了可以K8s内部访问Kafka服务,也支持从K8s集群外部访问Kafka服务.服务的集群部署通常有两种方式:一种是 StatefulSet,另 ...
- 差异行压缩算法(C#实现)
private byte[] DifferenceRowOrder(int offset, int count, byte[] inbyte)//差异行命令(此处的offset和count都从1开始) ...
- CSP 初赛复习
想要做一些不需要思考也算不得摆烂的事,但发现很难找到符合上述要求的学习内容. 突然想到还剩两天就 CSP 初赛了.虽然在 LN 想过不了初赛纯属搞笑,但为了不让自己的分数太难看还是简单复习一下. 没有 ...
- DFS(深度优先搜索)洛谷P1162
看大佬们dfs一遍就出结果,蒟蒻的我dfs了三遍,当然这题也可以用bfs做,但是dfs不用队列代码短一些. #include <iostream> #include <vector& ...
- Python合并多个Excel文件中的指定sheet
本文将介绍一个用于合并多个Excel文件中指定sheet的Python代码.这个功能可以方便地整理和分析数据.我们将逐步解释代码的每个部分,并提供示例用法. 导入库 首先,我们导入了需要使用的三个库: ...
- JUC并发编程学习(五)集合类不安全
集合类不安全 List不安全 单线程情况下集合类和很多其他的类都是安全的,因为同一时间只有一个线程在对他们进行修改,但是如果是多线程情况下,那么集合类就不一定是安全的,可能会出现一条线程正在修改的同时 ...
- ST-Link v2 刷写 GNUK,年轻人的第一个 OpenPGP 智能卡!
前言 看到了这篇文章 想搞 PGP 智能卡玩,但是 yubikey 死贵 还涉及到某些傻逼政治问题 于是就想找找有无开源实现什么的. 然后就看见了 smartcard 的制作教程,可惜能找到的便宜 j ...