常见面试题:Mybatis中#{}和${}符号的区别
1.只有#和$符号的区别,都可以使用
2.$(即时sql)符号是直接拼接,而#(预编译sql)是根据类型进行传参,
当$符号直接进行字符串拼接就要进行自己加引号,但是#的话就会根据类型自动转化
如果是通过注解的话就是要在sql语句上面加
sql执行顺序:
1:编译sql-> 2:优化sql-> 3:执行sql
预编译sql:就是sql中会有内存,多次使用相同的sql语句,会自动优化掉编译过程。缓存起来
性能更高,更安全(防止sql注入),预编译sql就是把位置给你留着,只能在这个位置里面放东西。
即时sql:就是走上面的三步流程没有优化 。直接拼接的行为。
即时sql会发生sql注入,什么是sql注入:
比如
这个语句本来是输入' or 1='1但是变成了或者的意思,因为是字符串拼接,就会发生sql注入也就是被篡改原意思被恶意攻击。
但是现在mybatis做了一些限制
这种已经表明是select 语句了就不让删除。
什么时候能用$:
比如这时候我们想写一句sql语句:
selec * from userinfo order by id desc
这里的desc并没有变成字符串的引号,所以只能用$ ,用#会自动转成字符串
在我们不想给string上引号,使用$,但是我们必须考虑的问题就是sql注入。
能用#不用$
问题出现:如果这时候又发生了sql注入怎么办,后面传了个drop怎么办:
1.在controller这里面先卡住是不是asc或者desc
2.或者我们在接口中定义asc或desc如下图
sql中like查询
模糊匹配查询
当我们使用模糊匹配的时候发现了一个问题 这时候要使用$符号进行字符串拼接,这时候就会发生sql注入的问题
解决方案:使用concat进行字符串拼接
数据库的连接池
没有的话重复获取销毁,有的话在池中放很多链接,用的时候拿一个,没用的时候放回去
mybatis默认使用Hikari,Druid是阿里的产品
总结:
mysql企业开发规范:
1.
表名, 字段名使⽤⼩写字⺟或数字, 单词之间以下划线分割. 尽量避免出现数字开头或者两个下划线中间只出现数字. 数据库字段名的修改代价很⼤, 所以字段名称需要慎重考虑。
MySQL 在 Windows 下不区分⼤⼩写, 但在 Linux 下默认是区分⼤⼩写. 因此, 数据库名, 表名, 字 段名都不允许出现任何⼤写字⺟, 避免节外⽣枝
正例: aliyun_admin, rdc_config, level3_name
反例: AliyunAdmin, rdcConfig, level_3_name
2.
表必备三字段: id, create_time, update_time,也可能只有一个字段
id 必为主键, 类型为 bigint unsigned, 单表时⾃增, 步⻓为 1 create_time, update_time 的类型均为 datetime 类型, create_time表⽰创建时间, update_time表⽰更新时间
有同等含义的字段即可, 字段名不做强制要求
3.
在表查询中, 避免使⽤ * 作为查询的字段列表, 标明需要哪些字段(课堂上给⼤家演⽰除外).
增加查询分析器解析成本
增减字段容易与 resultMap 配置不⼀致
⽆⽤字段增加⽹络消耗, 尤其是 text 类型的字段