【摘要】 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优化
- 约束条件:数据表减少表的约束条件,避免脏数据。
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语句优化小结》,原文作者:搬搬砖打打游戏 。
点击关注,第一工夫理解华为云陈腐技术~