首页 > 编程语言 >JavaWeb学习笔记——第八天

JavaWeb学习笔记——第八天

时间:2024-03-29 14:45:08浏览次数:35  
标签:事务 JavaWeb 第八天 数据库 笔记 查询 索引 连接 select

MySQL(三)

多表查询

  • 多表查询指从多张表中查询数据。
  • 可以直接使用指令select * from 表1, 表2;来同时查询表1和表2的数据,但此时会出现笛卡尔积的情况。
  • 笛卡尔乘积是指在数学中,两个集合(A集合 和 B集合)的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
  • 使用指令select * from 表1, 表2 where 表1.外键名 = 表2.id;即可消除无效的笛卡尔积。

多表查询的分类

  • 连接查询:
    • 内连接:相当于查询A、B交集部分数据。
    • 外连接:
      • 左外连接:查询左表所有数据(包括两张表交集部分数据)。
      • 右外连接:查询右表所有数据(包括两张表交集部分数据)。
  • 子查询。

内连接

  • 隐式内连接:
select 字段列表 from 表1, 表2 where 条件 ... ;
  • 显式内连接:
select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 ... ;

注意事项

  • 在字段列表中,如果要指定两张表中相同名称的字段,则必须使用表名.字段名来指定。
  • 可以在from后的表明后指定表的别名,之后在指定字段名时就必须使用表的别名.字段名来指定。

外连接

  • 左外连接:
select 字段列表 from 表1 left [ outer ] join 表2 on 连接条件 ... ;
  • 右外连接:
select 字段列表 from 表1 right [ outer ] join 表2 on 连接条件 ... ;

子查询

  • SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
  • 形式:select * from t1 where column1 = ( select column1 from t2 … );
  • 子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是 select。

子查询的分类

类型 说明 常用的操作符
标量子查询 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式 =、<>、>、>=、<、<=
列子查询 子查询返回的结果是一列(可以是多行) in、not in等
行子查询 子查询返回的结果是一行(可以是多列) = 、<> 、in 、not in
表子查询 子查询返回的结果是多行多列,常作为临时表使用 in
  • 由于子查询需要进行多次查询,所以效率较低,应尽量使用连接查询。

事务

  • 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。
  • 默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句时,MySQL会立即隐式的提交事务。

事务控制语法

操作 语法
开启事务 start transaction;begin;
提交事务 commit;
回滚事务 rollback;

事务的四大特性(ACID)

特性 说明
原子性(Atomicity) 事务是不可分割的最小单元,要么全部成功,要么全部失败
一致性(Consistency) 事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation) 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(Durability) 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

索引

概述

  • 索引(index)是帮助数据库高效获取数据的数据结构。
  • 在没有建立索引时,数据库在查找时会进行全表扫描,效率非常低。
  • 建立索引之后,数据库会在特殊的数据结构中进行查找,这大大提高了查找效率。

优缺点

优点 缺点
提高数据查询的效率,降低数据库的IO成本 索引会占用存储空间
通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗 索引大大提高了查询效率,同时却也降低了insert、update、delete的效率

数据结构

MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree 结构组织的索引。

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

B+Tree
  • 每一个节点,可以存储多个key(有n个key,就有n个指针),因此树的层数较浅,查找较快。
  • 所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。
  • 叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询。
  • 在查询数据时,首先将要查询的数据的键值在根节点进行二分查找,并根据查找结果进入下一层节点;在第二层节点中又进行二分查找,并根据查找结果进如下一层……重复这个过程直到进入叶子结点,最后在叶子节点中进行顺序查找,就找到了目标索引并取得对应的值。

语法

  • 创建索引
create [ unique ] index 索引名 on 表名 (字段名,... ); -- 加上unique即为创建唯一索引,也即添加唯一约束
  • 查看索引
show index from 表名;
  • 删除索引
show index from 表名;

注意事项

  • 主键字段,在建表时,会自动创建主键索引,且主键索引的效率是最高的。
  • 添加唯一约束时,本质上就是添加了一个唯一索引。

Mybatis(一)

  • MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。
  • MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
  • 官网:https://mybatis.org/mybatis-3/zh/index.html

Mybatis入门

Mybatis使用步骤(以查询为例)

一、准备工作

  1. 创建springboot工程。
  2. 创建数据库表(例子:user)。
  3. 创建实体类(例子:User):实体类的属性名要和数据库表的字段名一一对应(使用下划线的字段名要更换成使用驼峰体的属性名)。

二、引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)

  • 数据库连接信息(在application.properties文件中编辑四要素):
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/表名
#连接数据库的用户名
spring.datasource.username=用户名
#连接数据库的密码
spring.datasource.password=密码

三、编写SQL语句(注解/XML)

@Mapper //Mapper注解的作用:在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
public interface UserMapper {
    @Select("select *  from user") //注解名为DML操作名,括号里写SQL语句
    public List<User> list();
}

四、单元测试

  • 在Test目录下自动生成的springboot整合单元测试的文件中编写代码:
@SpringBootTest //springboot整合单元测试的注解
class SpringbootMybatisQuickstart1ApplicationTests {
    @Autowired //通过依赖注入将userMapper对象注入进来
    private UserMapper userMapper;

    @Test
    public void test1(){
        List<User> userList = userMapper.list();
        userList.stream().forEach(user -> System.out.println(user));
    }
}

补充:配置SQL提示

  • 默认在mybatis中编写的SQL语句是不识别的。可以做如下配置:选中SQL语句→点击右键→Show Context Actions→Inject language or reference→MySQL(SQL)。
  • 若IDEA和数据库没有建立连接,则不能识别表的信息(表明,表的字段等)。解决方式:在IDEA中配置MySQL数据库连接时加上Database。

JDBC

  • JDBC( Java DataBase Connectivity )就是使用Java语言操作关系型数据库的一套API。

JDBC的本质

  • sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

JDBC的缺点

  • 配置信息使用硬编码,不利于修改和维护。
  • 代码繁琐。
  • 频繁地获取和释放连接资源,导致资源浪费和性能降低。

数据库连接池

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)。
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。

优势

  • 资源重用。
  • 提升系统响应速度。
  • 避免数据库连接遗漏。

标准接口:DataSource

  • 官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。
  • 功能:获取连接 。

常见产品

C3P0、DBCP、Druid、Hikari(springboot默认)。

切换Druid数据库连接池

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

lombok

  • lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。
  • 需要引入依赖:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
  • 常用注解:
注解 作用
@Getter/@Setter 为所有的属性提供get/set方法
@ToString 会给类自动生成易阅读的 toString 方法
@EqualsAndHashCode 根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法
@Data 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)
@NoArgsConstructor 为实体类生成无参的构造器方法
@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法

lombok的原理

lombok会在编译时,自动生成对应的java代码。

注意事项

我们使用lombok时,还需要安装一个lombok的插件(IDEA自带)。

标签:事务,JavaWeb,第八天,数据库,笔记,查询,索引,连接,select
From: https://www.cnblogs.com/zgg1h/p/18103806

相关文章

  • vulntarget-e内网靶场笔记
    vulntarget-e一.打靶过程1.外网打点向日葵rcenmap-T4-sV-O-p0-65535192.168.126.130访问了49773端口后只有这个页面,只能扫描一下目录看看,但是扫出来也都是跳转到这个页面扫一下指纹信息,发现是向日葵(这里我自己扫不出来,俊贤哥说向日葵端口是变化的的自己写识别)未......
  • Cisco Packet Tracer模拟器下载笔记
    给初学Cisco网络设备的小伙伴演示思科模拟器下载的方法及注意事项!目录   1:百度输入“思科网络技术学院”搜索官网主页。   2:进入“思科网络技术学院”主页。   3:登录个人账号。      3-1:点击“LogIn”。      3-2:有账户自接......
  • C++学习笔记——007
    注意,int*pt;中pt是int值的地址并不意味着pt本身的类型是int。例如,在有些平台中,int类型是个2字节值,而地址是个4字节值。 对于指针,需要指出的另一点是,new分配的内存块通常与常规变量声明分配的内存块不同。常规变量的值都存储在被称为栈(stack)的内存区域中,而new从被称为堆(he......
  • C++学习笔记——006
    事实上,任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。因此,下面所有的输出语句都是等效的:cout<<"I'dgivemyrightarmtobe""agreatviolinist.\n";cout<<"I'dgivemyrightarmtobeagreatviolinist.\n";cout<<&qu......
  • stm32f103c8t6学习笔记(学习B站up江科大自化协)-DMA
    DMA简介    ·DMA主要用于协助CPU完成数据转运的工作    ·DMA,英文全称DirectMemoryAccess,DMA这个外设是可以直接访问STM32内部存储器的,包括运行内存SRAM,程序存储器flash和寄存器等等,DMA都有权限访问,所以DMA能完成数据转运的工作    ·第二行的外......
  • 面试题知识点笔记-MySQL开发
    目录可以使用MySQL直接存储文件(ppt,exel,图像等)吗?什么时候存,什么时候不存?Emoji乱码怎么办?存储的时候有遇到过什么问题吗?如何存储ip地址?长文本如何存储?大段文本如何设计表结构?大段文本查找时如何建立索引?有没有在开发中使用过TEXT,BLOB数据类型日期,时间如何存......
  • 面试题知识点笔记-MySQL日志
    目录MysqI会产生几种日志?binlog作用是什么?redolog作用是什么?undolog作用是什么?Mysql日志是否实时写入磁盘?binlog刷盘机制是如何实现的?redolog刷盘机制是如何实现的?undolog刷盘机制是如何实现的?MySQL的binlog有有几种录入格式?分别有什么区别?Mysq!集群同......
  • 论文笔记 SimpleNet A Simple Network for Image Anomaly Detection and Localization
    背景对于工业场景上的异常检测和定位任务,由于零件的异常情况具有多样性和随机性,所以很难用有监督的方式来解决;目前用的最多的是用无监督的方式,在训练过程中只使用正常样本进行训练,目前无监督解决异常检测任务的三个趋势是基于重建的方法,基于合成的方法以及基于嵌入的......
  • 树哈希学习笔记
    1.作用判断一些树是否同构。2.方法2.1.具体操作这类方法需要一个多重集的哈希函数。以某个结点为根的子树的哈希值,就是以它的所有儿子为根的子树的哈希值构成的多重集的哈希值,即:\[h_u=f(\{h_v|v\inson(u)\})\]其中\(h_x\)表示以\(x\)为根的子树的哈希值,\(f\)是多重集的......
  • 3.28 第一次结对笔记
     今天准备设计一下地铁查询系统的整体架构,因为北京地铁的线路繁多,所以在设计数据库表时就存在很大问题,如何设计才能在存储数据时以及前后端处理数据时,都简便一些。当然如果一方面过度的方便就证明另一方面极其困难,在博客园找到了15年地铁站点的数据,但是对比现在差的太多了,所以我......