摘要: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语句优化小结的更多相关文章

  1. mybatis中sql语句传入多个参数方法

    1 使用map <select id="selectRole" parameterType="map" resultType="RoleMap& ...

  2. MyBatis中sql语句

    一.select <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String&qu ...

  3. mybatis中sql语句必须用${}而不能不用#{}的情况

    在mybatis中如果我们使用#{}的方式编写的sql时,#{} 对应的变量自动加上单引号 ' ' 例如: select * from #{param} 当我们给参数传入值为user时,他的sql是这 ...

  4. Mybatis 中 sql 语句的占位符 #{} 和 ${}

    #{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换.#{} 可以有效防止   sql注入. #{}  ...

  5. Mybatis中sql语句中的in查询,一定要判断null的情况

    不严谨的写法,可能会报错:in (),这种情况不符合mysql的语法. select from loanwhere LOAN_ID in <foreach item="item&quo ...

  6. sql语句优化小结

    sql的优化技巧. 1.用join进行子查询的优化. 低效的子查询 select a.user_name,a.over,(select over from user2 b where a.user_n ...

  7. 数据库SQL语句优化小结

    网上查找的总结: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null ...

  8. mybatis中SQL语句运用总结

    union 连接查询  连接两个表后会过滤掉重复的值 <resultMap id="BaseResultMap" type="com.sprucetec.pay.e ...

  9. mybatis中sql语句查询操作

    动态sql where if where可以自动处理第一个and. <!-- 根据id查询用户信息 --> <!-- public User findUserById(int id) ...

  10. Mybatis中sql语句中的in查询,判断null和size为0的情况

    不严谨的写法,可能会报错:in (),这种情况不符合SQL的语法,导致程序报错. 如果简单只做非空判断,这样也有可能会有问题:本来in一个空列表,应该是没有数据才对,却变成了获取全部数据! 所以一个比 ...

随机推荐

  1. 【matplotlib 实战】--饼图

    饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表.在饼图中,每个扇形的弧长(以及圆心角和面积)大小,表示该种类占总体的比例,且这些扇形合在一起刚好是一个完全的圆形. 饼图最显著的功能在于表现&qu ...

  2. Maze 1D 题解

    题目大意 在数轴上给定一串行动指令,类型有两种:向左移动一个单位 / 向右移动一个单位.要求最后一步到达一个没有到达过的位置.可以在数轴上放置若干个障碍物阻碍移动,问在放置的障碍物最少的情况下有多少放 ...

  3. gson如何序列化子类

    需求 目前有一个需求,不同对象有一些公共属性,分别也有一些不同的属性.对方传过来的json字符串中,把这些对象组成了一个数组返回过来的.这样该如何反序列化呢? 举例 定义Person类.Student ...

  4. SpringBoot如何缓存方法返回值?

    目录 Why? HowDo annotation MethodCache MethodCacheAspect controller SpringCache EnableCaching Cacheabl ...

  5. kafka和zookeeper安装

    一.Kafka简介 Kafka 被称为下一代分布式消息系统,是非营利性组织ASF(Apache Software Foundation,简称为ASF)基金会中的一个开源项目,比如HTTP Server ...

  6. ruoyi框架里面设置登录超时时间不能生效

    问题 项目使用到了ruoyi框架,给登录超时限制了12小时,但是每次几个小时后就提示过期,要求再登录一次. 首先怀疑是不是redis内存淘汰策略出现了问题. 先使用一下的命令 systemctl st ...

  7. ALSA Compress-Offload API

    概述 从 ALSA API 的早期开始,它就被定义为支持 PCM,或考虑到了 IEC61937 等固定比特率的载荷.参数和返回值以帧计算是常态,这使得扩展已有的 API 以支持压缩数据流充满挑战. 最 ...

  8. (Good topic)压缩字符串 (3.16 leetcode每日打卡)

    字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后的字符串没有变短,则返回原先的字符 ...

  9. .NET周刊【11月第3期 2023-11-19】

    国内文章 .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试 https://www.cnblogs.com/FreeSql/p/17836 ...

  10. 什么是cursor?怎么使用cursor?

    Cursor 在Android查询数据时就是通过Cursor类来实现的.当我们使用SQLiteDatabase.query()方法时,就会得到Cursor对象,Cursor所指向的就是每一条数据. 举 ...