在学习mysql和实际开发应用中,所做的笔记和踩的一些坑,记录一下,如下所示:
- 查询为NULL的数据时,不能使用 `= null,应该用is
- 关键词in.例如查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息where job in (2,3,4);
- 通配符 “_” 代表任意1个字符,通配符 “%” 代表任意个字符(0个 ~ 多个)
- 关于group by 和having的用法:分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义,执行顺序where>聚合函数>having
where和having的区别(面试题):(聚合函数对NULL值不做计算)
(1)执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
(2)判断条件不同:where不能对聚合函数进行判断,而having可以。 - 关于分页:分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
- 多表设计
(1)一对多:在数据库表中多的一方,添加字段,来关联属于一这方的主键。
(2)一对一 :在两方中均加入外键,关联另外一方的主键.
(3)多对多:建立第三张中间表,中间表至少包含两个外键,分别关联两方主 - 外键约束(foreign key):保证了数据的完整性和一致性。关于物理外键和逻辑外键,在现在的企业开发中,很少会使用物理外键,都是使用逻辑外键。 甚至在一些数据库开发规范中,会明确指出禁止使用物理外键 foreign key。
物理外键:使用foreign key定义外键关联另外一张表。
缺点:
(1)影响增、删、改的效率(需要检查外键关系)。
(2)仅用于单节点数据库,不适用与分布式、集群场景。
(3)容易引发数据库的死锁问题,消耗性能。
逻辑外键:在业务层逻辑中,解决外键关联。
通过逻辑外键,就可以很方便的解决上述问题。 - 关于mybatis,Mybatis框架,就是对原始的JDBC程序的封装。
JDBC: ( Java DataBase Connectivity ),就是使用Java语言操作关系型数据库的一套API。
分析了JDBC的缺点之后,我们再来看一下在mybatis中,是如何解决这些问题的:
(1)数据库连接四要素(驱动、链接、用户名、密码),都配置在springboot默认的配置文件 application.properties中
(2)查询结果的解析及封装,由mybatis自动完成映射封装,我们无需关注
(3)在mybatis中使用了数据库连接池技术,从而避免了频繁的创建连接、销毁连接而带来的资源浪费。 - 参数占位符${…}和#{…}
在项目开发中,建议使用#{…},生成预编译SQL,防止SQL注入,更加安全。
SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,已达到执行代码对服务器进行攻击的方法 - 主键返回:在数据添加成功后,需要获取插入数据库数据的主键。
默认情况下,执行插入操作时,是不会主键值返回的。如果我们想要拿到主键值,需要在Mapper接口中的方法上添加一个Options注解,并在注解中指定属性useGeneratedKeys=true和keyProperty=“实体类属性名” - 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
解决方案:(1)起别名(2)结果映射(3)开启驼峰命名(推荐) 表中字段名:abc_xyz 类中属性名:abcXyz
(# 在application.properties中添加:mybatis.configuration.map-underscore-to-camel-case=true) - 使用MySQL提供的字符串拼接函数:concat(‘%’ , ‘关键字’ , ‘%’)(解决SQL注入风险),例如:"where name like concat(‘%’,#{name},‘%’) ",也可以选择在service层直接拼接字符串
- 使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。
- MybatisX是一款基于IDEA的快速开发Mybatis的插件,为效率而生。可以在IDEA中得插件plugins中生成。
- 动态sql语句
(1).形式:…
(2) where元素只在子元素有内容的情况下才会插入where子句,而且会自动去除子句中开头多余的and或者or)
(3) 动态地在行首插入SET关键字,并会删掉额外地逗号(用在update语句中)
(4):定义可重用的SQL片段
(5):通过属性refid,指定包含的SQL片段
(6)使用遍历deleteByIds方法中传递的参数ids集合