关于mybatis:mybatis使用及SQL语句优化小结

8次阅读

共计 2074 个字符,预计需要花费 6 分钟才能阅读完成。

【摘要】MyBatis 作为一款优良的长久层框架,它反对自定义 SQL、存储过程以及高级映射。

一、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. 应用长期表:

 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 类型。

14. 索引生效状况

(1)在 WHERE 子句中,如果在 OR 前的条件列进行了索引,而在 OR 后的条件列没有进行索引,那么索引会生效。

(2)索引列尽量设置为 NOT NULL 束缚。

15. 数据表字段,不要用 bool 类型,用 int2 代替 bool 类型,减少扩大能力

本文分享自华为云社区《mybatis 应用及 SQL 语句优化小结》,原文作者:搬搬砖打打游戏。

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0