当前位置: 首页 > news >正文

数据库知识点总结(一)

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

相关文章:

  • Go——二、变量和数据类型
  • C#面试题3
  • 马养殖场建设VR模拟实训教学平台具有灵活性和复用性
  • ES6 — ES14 新特性
  • Python算法——树的拓扑排序
  • python将模块进行打包
  • 主流开源大语言模型的微调方法
  • centeros7系统安装指定版本的mongodb数据库
  • 『Linux升级路』基础开发工具——gcc/g++篇
  • 【Python大数据笔记_day11_Hadoop进阶之MR和YARNZooKeeper】
  • 【docker】安装redis和mysql生产实战
  • 聚观早报 |一加12正式开启预订;OPPO Reno11系列卖点
  • 【中间件】服务化中间件理论intro
  • opencv-图像金字塔
  • HTML5+ API 爬坑记录
  • 【EOS】Cleos基础
  • 2019.2.20 c++ 知识梳理
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Android开源项目规范总结
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • go append函数以及写入
  • httpie使用详解
  • iOS 系统授权开发
  • java 多线程基础, 我觉得还是有必要看看的
  • javascript 哈希表
  • JavaScript 奇技淫巧
  • javascript面向对象之创建对象
  • mysql外键的使用
  • 从伪并行的 Python 多线程说起
  • 分布式任务队列Celery
  • 讲清楚之javascript作用域
  • 前端面试总结(at, md)
  • 前端之React实战:创建跨平台的项目架构
  • 软件开发学习的5大技巧,你知道吗?
  • 为什么要用IPython/Jupyter?
  • 字符串匹配基础上
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #define 用法
  • $L^p$ 调和函数恒为零
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (生成器)yield与(迭代器)generator
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)从 Java 代码到 Java 堆
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .axf 转化 .bin文件 的方法