首页 > 编程语言 >JavaWeb回顾与小结(四)

JavaWeb回顾与小结(四)

时间:2023-04-29 19:34:06浏览次数:57  
标签:JavaWeb 回顾 where 数据库 查询 索引 小结 连接 select

数据库操作-DQL

DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录

  • 基本查询
  • 条件查询where
  • 分组查询group by
  • 排序查询order by
  • 分页查询limit

基本查询

语法

查询多个字段
select 字段1,字段2,字段3 from 表名;
查询所有字段(通配符)
select * from 表名;
设置别名
select 字段1 [as 别名1],字段2 [as 别名2] from 表名;
去除重复记录
select distinct 字段列表 from 表名;

注意事项

*号代表查询所有字段,在实际开发中尽量少用(不直观,影响效率)

条件查询

语法

条件查询
select 字段列表 from 表名 where 条件列表;

运算符

比较运算符
>   大于
>=   大于等于
<   小于
<=   小于等于
=   等于
<>或!=   不等于
between...and...   在某个范围内
in(...)   在in之后的列表中的值,多选一
like 占位符     模糊匹配(_匹配单个字符,%匹配任意个字符)
is null   是null
逻辑运算符
and或&&   并且(多个条件同时成立)
or或||   或者(多个条件任意一个成立)
not或!   非,不是

分组查询

聚合函数

  • 将一列数作为一个整体,进行纵向计算
  • 语法:select 聚合函数(字段列表) from 表名;
  • 函数
count---统计数量
max---最大值
min---最小值
avg---平均值
sum---求和
  • 注意事项
    null值不参与所有聚合函数运算
    统计数量可以使用:count(*) count(字段) count(常量),推荐使用count(*)

分组查询group by

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

where与having区别
  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
  • 判断条件不同:where不能对聚合函数进行判断,而having可以
注意事项
  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
  • 执行顺序:where>聚合函数>having

排序查询

语法

select 字段列表 from 表名 [where 条件列表] [group by 分组字段] order by 字段1 排序1, 字段2 排序2 ... ;

排序方式

  • ASC:升序(默认值)
  • DESC:降序

注意事项

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

分页查询

语法

select 字段列表 from 表名 limit 起始索引,查询记录数

注意事项

  • 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数

  • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT

  • 如果查询的第一页数据,起始索引可以省略,直接简写为limit 10

函数:

if(表达式,true value,false value):当表达式为true时,取值true value;当表达式为false时,取值false value
case 表达式 when value1 then result1 [ when value2 then value2 ...] [else result] end

多表设计

概述

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多
  • 多对多
  • 一对一

外键

create table 表名(
   字段名 数据类型
   ...
   [constraint] [外键名称] foreign key (外键字段名) references 主表 (字段名)
);
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(字段名);

外键约束

物理外键

使用foreign key定义外键关联另外一张表

缺点
  • 影响增,删,改的效率(需要检查外键的关系)
  • 仅用于单节点数据库,不适用与分布式,集群场景
  • 容易引发数据库的死锁问题,消耗性能
逻辑外键
  • 在业务层逻辑中,解决外键关联
  • 通过逻辑外键,就可以很方便的解决上述问题(推荐)
  1. 一对多
    在多的一方添加字段,指向一的一方的主键

  2. 一对一
    多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率

  3. 多对多
    通过中间表来维护,中间表的两个外键,分别关联另两张表的主键

多表查询

概述

  • 指从多张表中查询数据
  • 笛卡尔积:指在数学中,两个集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

分类

连接查询

内连接

查询两个表的交集部数据,也就是能通过主外键关联的数据

外连接
左外连接

查询左表的所有数据和另一张表的交集

右外连接

查询右表的所有数据和另一张表的交集

子查询

SQL语句中嵌套select语句,称为嵌套查询,又称子查询

内连接

语法

隐式内连接

select 字段列表 from 表1,表2 where 条件 ... ;

显式内连接

select 字段列表 from 表1 [inner] join 表2 on 连接条件 ... ;
查询结果特点:内连接相当于查询A,B交集数据

外连接

语法

select 字段列表 from 表1 left [outer] join 表2 on 连接条件 ... ;
select 字段列表 from 表1 right [outer] join 表2 on 连接条件 ... ;
查询结果特点:查询一个表的全部数据和另一个表的交集数据

子查询

概述

select * from t1 where column1 = (select column1 from t2 ... );
子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是select

分类

标量子查询
  • 子查询返回的结果为单行单列
  • 作为where条件使用,常用的操作符:= <> > >= < <=
  • select 字段列表 from 表 where 字段名 = (子查询);
列子查询
  • 子查询返回的结果为多行单列
  • 作为where条件使用,常用操作符:in, not in等
表子查询
  • 子查询返回的结果为单行/多行多列
  • 常作为临时表,临时表必须取别名
  • select 字段列表 from 表1,(子查询) 表2 where 条件;

事务

一种机制,指的是把一组SQL操作看成一个整体发送给系统执行.都执行成功就提交,有一个执行失败就回滚,从而保证这组操作要么同时成功,要么同时失败

事务控制

  • 开启事务:start transaction;/begin;
  • 提交事务:commit;
  • 回滚事务:rollback;

注意事项

默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务

四大特性(ACID)

  • 原子性Atomicity
    事务是不可分割的最小单元,要么全部成功,要么全部失败

  • 一致性Consistency
    事务完成时,必须使所有的数据都保持一致状态

  • 隔离性Isolation
    数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

  • 持久性Durability
    事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

索引

概念

索引时帮助数据库高效获取数据的数据结构

优点

  • 提高数据查询的效率,降低数据库的IO成本
  • 通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗

缺点

  • 索引会占用存储空间
  • 索引大大提高了查询效率,同时却也降低了insert,update,delete的效率

结构

MySQL数据库支持的索引结构有很多,如:Hash索引,B+Tree索引,Full-Text索引等

二叉树存在的问题

大数据量情况下,层级深,检索速度慢

B+Tree(多路平衡搜索树)

  • Btree是数据库中最常见最为频繁的一种索引结构
  • Btree中的B代表平衡(balance),而不是二叉(binary)
  • Btree是从最早的二叉查找树,平衡二叉树(红黑树)和平衡多路查找树(Btree)这些树逐步优化而来
  1. 每一个节点,可以存储多个key(有n个key,就有n+1个指针)
  2. 所有的数据都存储在叶子节点,非叶子节点仅用于索引数据
  3. 叶子节点中每一页通过双向链表互相连接,便于数据的排序及区间范围查询

语法

创建索引

create [unique] index 索引名 on 表名 (字段名, ...);

查看索引

show index from 表名;

删除索引

drop index 索引名 on 表名;

注意事项

  • 主键字段,在建表时,会自动创建主键索引
  • 添加唯一约束时,数据库实际上会添加唯一索引

MyBatis

什么是Mybatis

MyBatis是一款优秀的持久层框架,用于简化JDBC(Java数据库连接)的开发。

Mybatis入门

快速入门

步骤
  1. 准备工作,创建数据库和表
  2. 创建springboot工程,引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
  3. 实体类User,编写Mapper,SQL语句(注解/XML)
  4. 单元测试
配置SQL提示
产生原因

IDEA和数据库没有建立连接,不识别表信息

解决方式

在IDEA中配置MySQL数据库连接

JDBC介绍

介绍

Java DataBase Connectivity,就是使用Java语言操作关系型数据库的一套API接口

本质
  • sun公司官方定义的一套操作所有关系型数据库的规范,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
缺点
  • 注册驱动硬编码
  • 封装对象集合繁琐
  • 资源浪费,性能降低

数据库连接池

数据库连接池是个容器,负责分配,管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
优势
  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏
标准接口
DataSource

官方sun提供的数据库连接池接口,由第三方组织实现此接口

功能:获取连接

Connection getConnection() throws SLQException;

常见产品
  • C3PO
  • DBCP
  • Druid
    Druid连接池是阿里巴巴开源的数据库连接池项目
    功能强大,性能优秀,是Java语言最好的数据库连接池之一
  • Hikari

Lombok

是一个实用的Java类库,能通过注解的形式自动生成构造器,getter/setter,equals,hashcode,toString等方法,并可以自动化生成日志变量,简化java开发,提高效率

注解

@Getter/@Setter
为所有的属性提供get/set方法
@ToString
会给类自动生成易阅读的toString方法
@EqualsAndHash
根据类所拥有的非静态字段自动重新equals方法和hashCode方法
@Data
提供了更综合的生成代码功能(@Getter+@Setter+@ToString+@EqualsAndHashCode)
@NoArgsConstructor
为实体生成无参的构造器方法
@AllArgsConstructor
为实体类生成除了static修饰的字段之外带有各参数的构造器方法

注意事项

lombok会在编译时,自动生成对应的java代码,我们使用lombok时,还需要安装一个lombok的插件(idea自带)

Lombok工具包-@Slf4j
使用sout输出信息弊端
  • 信息只会展示在控制台
  • 不能将日志记录到其他位置(文件,数据库)
  • 想取消日志,需要修改源代码才可以完成
使用@Slf4j注解
  • 添加lombok依赖
  • 在需要进行日志输出的类上使用@Slf4j,生成logger对象

标签:JavaWeb,回顾,where,数据库,查询,索引,小结,连接,select
From: https://www.cnblogs.com/kyrie-66/p/17351737.html

相关文章

  • javaweb用户登录界面
    实验名称用户登录界面成绩评定所用仪器材料eclipsetomcatwin11实验目的或要求1.实验目的使用JSP实现用户登录验证。2.实验内容通过创建一个用户登录的页面,让用户输入正确的用户名、密码,并进行校验,若用户名和密码输入正确,则弹出您好,你的名字首字母,否则弹出用户名或密码错误,请重新输......
  • 电容知识点小结
    1、钽电容过滤纹波效果非常好,但是钽电容容易爆,质量不好,过压、接反均会导致其爆掉。爆的过程有明火,在爆炸火灾等级要求高的场合尽量不适用钽电容。应注意固体钽电容在高阻电路中瞬时击穿可自愈,使用时回路中应串联电阻器,阻值按照3欧姆每福特为宜。2、铝电解电容,一般最高电压就做......
  • 常见资产对比小结
    常见资产对比小结,存货固定资产无形资产。......
  • 区间DP小结(附经典例题) 转载
    区间DP转载自:原博客一、定义​区间DP是线性动态规划的扩展,适用场景为每段区间的最优解可以通过更小区间的最优解得到。所以我们一般的解题思路都是先在小区间得到最优解,然后总结出递推公式,利用小区间的最优解求大区间的最优解。二、实现伪代码//mst(dp,0)初始化dp数组for......
  • [C++11]左值、右值、左值引用、右值引用小结
     左值和右值左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。比如inta=b+c;,a就是一个左值,可以对a取地址,而b+c就是一个右值,对表达式b+c取地址会报错。C++11中右值又由两个概念组成:将亡值和纯......
  • 设计模式小结
    简单工厂模式将具有相同属性事物用一个抽象基类,里面具有抽象方法来作为父类,然后其他子类通过继承来实现这个基类,通过重写实现基类里面的抽象方法创建一个工厂方法,通过父类变量来策略模式就是在简单工厂模式的基础上,将工厂方法改成策略对象,然后去调用该对象的重写基类的抽象方法单一......
  • [生活日记]参与unity非游戏行业开发者大会小结
    今天下午花了半天时间公司全体都去人民广场参与了一个unity非游戏行业开发者大会,主要了解到unity这款全球顶尖之一的游戏引擎的一个发展史,从05年三个美国人技术研发开始,一直到12年开始引进中国,经过这短短两年左右的时间,获得了逛到游戏开发者的喜爱和肯定,它始于游戏,但非终止于游戏,今......
  • JavaWeb回顾与小结(三)
    请求与响应概述架构BS架构:Browser/Server,浏览器/服务器架构模式.客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端维护方便,体验一般CS架构:Client/Server,客户端/服务器架构模式开发,维护麻烦,体验不错请求(HttpServletRequest):获取请求数据响应(HttpServletRes......
  • JavaWeb回顾与小结(二)
    AjaxAjax介绍概念AsynchronousJavaScriptAndXML,异步的JS和XML作用数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术原生Ajax准备数据地址创建XMLHttpRequest对象:......
  • 回顾Python的可迭代对象、迭代器、生成器
    一、可迭代对象:可以用for遍历的对象,包括list、set、dict等。二、迭代器:能够记录当前迭代位置的可迭代对象,就是迭代器。1)把list、set、dict等简单的可迭代对象用iter()函数包装一下,就成了迭代器。例如x=iter([1,2,3])#type(x)输出list_iteratory=iter({1,2,3})#type(y)......