三、数据库设计

1_简介

1.数据库设计设计什么?
有哪些表
表里有哪些字段
表和表之间是什么关系

2.表关系有哪几种?
一对一
一对多(多对一)
多对多

2_多表关系实现

表关系之一对多
一对多 (多对一):
如:部门表和员工表
一个部门对应多个员工,一个员工对应一个部门
实现方式:在多的一方建立外键,指向一的一方的主键

表关系之多对多
多对多:
如:订单和商品
一个商品对应多个订单,一个订单包含多个商品
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

表关系之一对一
一对一:
如:用户和用户详情
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一 (UNIQUE)

四、多表查询

1_简介

多表查询
笛卡尔积:取 A,B 集合所有组合情况
多表查询:从多张表查询数据
    连接查询
        内连接:相当于查询 A B 交集数据
        外连接:
            左外连接:相当于查询 A 表所有数据和交集部分数据
            右外连接:相当于查询 B 表所有数据和交集部分数据
    子查询

2_内连接&外连接

内连接
内连接查询语法
-- 隐式内连接
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 条件;  

左外连接:相当于查询 A 表所有数据和交集部分数据
右外连接:相当于查询 B 表所有数据和交集部分数据

3_子查询

子查询
1.子查询概念:
查询中嵌套查询,称嵌套查询为子查询
2.子查询根据查询结果不同,作用不同:
单行单列
多行单列
多行多列


单行单列:作为条件值,使用 = != > < 等进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);  

多行单列:作为条件值,使用 in 等关键字进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询);  

多行多列:作为虚拟表
SELECT 字段列表 FROM (子查询) WHERE 条件;  

五、事务

简介四大特征

事务简介
数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
事务是一个不可分割的工作逻辑单元

事务四大特征
原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation):多个事务之间,操作的可见性
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

MySQL 事务默认自动提交
-- 查看事务的默认提交方式  
SELECT @@autocommit;  
-- 1 自动提交  0 手动提交  

-- 修改事务提交方式  
set @@autocommit = 0;  

六、JDBC

1_简介

JDBC 概念:
JDBC 就是使用 Java 语言操作关系型数据库的一套 API
全称: (Java DataBase Connectivity) Java 数据库连接
JDBC 本质:
官方 (sun 公司) 定义的一套操作所有关系型数据库的规则,即接口
各个数据库厂商去实现这套接口,提供数据库驱动 jar 包
我们可以使用这套接口 (JDBC) 编程,真正执行的代码是驱动 jar 包中的实现类
JDBC 好处:
各数据库厂商使用相同的接口,Java 代码不需要针对不同数据库分别开发
可随时替换底层数据库,访问数据库的 Java 代码基本不变
(右侧图示辅助理解:通过 “MySQL 驱动” 连接 Java 代码与 MySQL 数据库 )

2_快速入门

0.创建工程,导入驱动 jar 包
mysql-connector-java-5.1.48.jar

1.注册驱动
Class.forName("com.mysql.jdbc.Driver"); 

这里该类在 MySQL Connector/J 8.0 之后已被弃用,新版本推荐使用 com.mysql.cj.jdbc.Driver

2.获取连接
Connection conn = DriverManager.getConnection(url, username, password);  

3.定义 SQL 语句
String sql = "update...";  

4.获取执行 SQL 对象
Statement stmt = conn.createStatement();  

5.执行 SQL
stmt.executeUpdate(sql);  

6.处理返回结果

7释放资源

3_API详解DriverManager

DriverManager
DriverManager (驱动管理类) 作用:
注册驱动
获取数据库连接

1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
查看 Driver 类源码
static {
    try {
        DriverManager.registerDriver(new Driver());
    } catch (SQLException var1) {
        throw new RuntimeException("Can't register driver!");
    }
}

提示:
MySQL 5 之后的驱动包,可以省略注册驱动的步骤
自动加载 jar 包中 META-INF/services/java.sql.Driver 文件中的驱动类


2.获取连接
static Connection                getConnection(String url, String user, String password)

参数
1.url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
示例:jdbc:mysql://127.0.0.1:3306/db1
细节:
    如果连接的是本机 mysql 服务器,并且 mysql 服务默认端口是 3306,则 url 可以简写为:jdbc:mysql:///数据库名称?参数键值对
    配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
2.user:用户名
3.password:密码

4_API详解Connection

Connection
Connection (数据库连接对象) 作用:
获取执行 SQL 的对象
管理事务


1.获取执行 SQL 的对象
普通执行 SQL 对象
    Statement createStatement()
预编译 SQL 的执行 SQL 对象:防止 SQL 注入
    PreparedStatement prepareStatement(sql)
执行存储过程的对象
    CallableStatement prepareCall(sql)


2.事务管理
    MySQL 事务管理
开启事务:BEGIN; / START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;

MySQL默认自动提交事务

    JDBC 事务管理:Connection 接口中定义了 3 个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()

5_API详解Statement

Statement
Statement 作用:
执行 SQL 语句
int  executeUpdate(sql):执行DML、DDL语句  
  返回值: (1) DML语句影响的行数 (2) DDL语句执行后,执行成功也可能返回 0  

ResultSet  executeQuery(sql):执行DQL语句  
  返回值:ResultSet结果集对象  

6_API详解ResultSet

ResultSet
ResultSet (结果集对象) 作用:
封装了 DQL 查询语句的结果
ResultSet  stmt.executeQuery(sql):执行DQL 语句,返回 ResultSet 对象  

获取查询结果
boolean  next(): (1) 将光标从当前位置向前移动一行  (2) 判断当前行是否为有效行  
返回值:  
  • true: 有效行,当前行有数据  
  • false: 无效行,当前行没有数据  

xxx  getXxx(参数):获取数据  
xxx: 数据类型;如: int getInt(参数);String getString(参数)  
参数:  
  • int: 列的编号,从1开始  
  • String: 列的名称  


使用步骤:
1.游标向下移动一行,并判断该行否有数据: next ()
2.获取数据: getXxx (参数)
//循环判断游标是否是最后一行末尾
while(rs.next()){
    //获取数据
    rs.getXxx(参数);
}

package com.itheima.jdbc;import org.junit.Test;import java.sql.*;//JDBC快速入门
public class JDBCDemo7_PreparedStatement {@Testpublic void PreparedStatement() throws Exception {//2. 获取连接: 如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url = "jdbc:mysql:///test?useSSL=false";String username = "root";String password = "1234";Connection conn = DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name = "zhangsan";String pwd = "123";// 定义sqlString sql = "select * from tb_user where username = ? and password = ?";// 获取pstmt对象PreparedStatement pstmt = conn.prepareStatement(sql);// 设置?的值pstmt.setString(1, name);pstmt.setString(2, pwd);// 执行sqlResultSet rs = pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println("登录成功~");}else{System.out.println("登录失败~");}//7. 释放资源rs.close();pstmt.close();conn.close();}
}

7_API详解PreparedStatement

PreparedStatement
PreparedStatement 作用:
    预编译 SQL 语句并执行:预防 SQL 注入问题
SQL 注入
    SQL 注入是通过操作输入来修改事先定义好的 SQL 语句,用以达到执行代码对服务器进行攻击的方法。

① 获取 PreparedStatement 对象
// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);

② 设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值  
Xxx:数据类型;如 setInt(参数1,参数2)  
参数:  
    参数1:?的位置编号,从1开始  
    参数2:?的值  

③ 执行 SQL
executeUpdate(); / executeQuery(); :不需要再传递sql  


PreparedStatement 原理
PreparedStatement 好处:
1.预编译 SQL,性能更高
2.防止 SQL 注入:将敏感敏感字符进行转义
① PreparedStatement 预编译功能开启: useServerPrepStmts=true
② 配置 MySQL 执行日志 (重启 mysql 服务后生效)
log-output=FILE  
general-log=1  
general_log_file="D:\mysql.log"  
slow-query-log=1  
slow_query_log_file="D:\mysql_slow.log"  
long_query_time=2  

PreparedStatement 原理:
1.在获取 PreparedStatement 对象时,将 sql 语句发送给 mysql 服务器进行检查,编译(这些步骤很耗时)
2.执行时就不用再进行这些步骤了,速度更快
3.如果 sql 模板一样,则只需要进行一次检查、编译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912597.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912597.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912597.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Junit_注解_枚举

文章目录 一&#xff1a;Junit单元测试测试分类&#xff1a;Junit的使用Before_After 二&#xff1a;注解什么是注解文档相关的注解IDEA中的javadoc使用&#xff1a;JDK内置的3个注解自定义注解 元注解RetentionTargetRepeatableDocumented&#xff08;用的很少&#xff09;Inh…

将N8N配置为服务【ubuntu】

docker模式不在此讨论。这里讨论的是node安装为n8n后&#xff0c;如何安装为服务&#xff1a; 安装NODE&#xff08;略&#xff09; 安装N8N 一个命令解决&#xff1a; npm install n8n -g 安装服务 vi /etc/systemd/system/n8n.service内容如下 [Unit] Descriptionn8…

Java后端调用外部接口标准流程详解

在Java后端开发中&#xff0c;调用外部HTTP接口&#xff08;如第三方平台API、云服务、微服务等&#xff09;是非常常见的需求。实现这个功能通常遵循一套标准的流程&#xff1a; 1. 准备DTO类&#xff08;数据传输对象&#xff09; 作用&#xff1a; DTO&#xff08;Data Tra…

星火燎原 数智新生 —— 《GB/T 45341—2025》 × AI大模型 × 全域PaaS创新,领码SPARK打造行业数字化转型新范式

【摘要】 数字中国新征程&#xff0c;标准引航数智化。面对企业数字蝶变的关键关口&#xff0c;《GB/T 45341—2025 数字化转型管理 参考架构》引领行业规范发展。爱分析最新数据显示&#xff0c;中国iPaaS市场规模持续高增长&#xff0c;印证PaaS已成为企业数字化基石。 AI大…

25-7-1 论文学习(1)- Fractal Generative Models 何恺明大佬的论文

分形生成模型 Tianhong Li1 Qinyi Sun1 Lijie Fan2 Kaiming He1 摘要 模块化是计算机科学的基石&#xff0c;它将复杂函数抽象为原子构建块。在本文中&#xff0c;我们通过将生成模型抽象为原子生成模块&#xff0c;引入了新的模块化层次。类似于数学中的分形&#xff0c;我…

如何读取运行jar中引用jar中的文件

1.问题发现 项目中有个common包资源文件&#xff0c;然后springboot项目引用了common&#xff0c;那么我们要怎么读取这个资源了。这里需要考虑三个场景&#xff0c;idea运行时、common jar独立运行时、springboot引用common后运行时。 2.问题解决 2.1.idea运行时 Protection…

【学习方法】框架质疑学习法:破解专业学习的“知识厚度”困境

今天博主给大家分享一个&#xff0c;我自己发明了一个比较高效的学习方法,名叫“框架质疑学习法” 本文提出的框架质疑学习法&#xff08;Framework Questioning Learning Method&#xff09;为本文作者&#xff0c;也就是我&#xff0c;董翔首次提出。 在软件专业的学习中&a…

spring-ai 1.0.0 学习(十七)——MCP Client

之前学过了工具调用&#xff08;spring-ai 1.0.0 学习&#xff08;十二&#xff09;——工具调用_springai 1.0 如何判断调用哪一个tool工具-CSDN博客&#xff09;&#xff0c;今天来看一下MCP MCP是什么 MCP全称是模型上下文协议&#xff0c;有点绕&#xff0c;通俗点理解&a…

Git 运行.sh文件

1.在项目文件中右击 Open Git Bash here 显示&#xff08;base&#xff09;环境 2.激活conda环境 3.复制.sh文件的相对路径 4.将路径复制到git终端 先输入sh和空格&#xff0c;然后右击后选paste&#xff0c;不要直接ctrl v 5.开始运行

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别&#xff1f; 主要解答详细解答1. **聚簇索引&#xff08;Clustered Index&#xff09;**2. **非聚簇索引&#xff08;Non-Clustered Index / Secondary Index&#xff09;**3. **对比总结**4. **流程图&#xff08;查询过…

[2025CVPR]DE-GANs:一种高效的生成对抗网络

目录 引言:数据高效GAN的困境 核心原理:动态质量筛选机制 1. 判别器拒绝采样(DRS)的再思考 2. 质量感知动态拒绝公式 (1)质量感知阶段 (2)动态拒绝阶段 模型架构:轻量化设计 技术突破:三大创新点 1. 首创训练阶段DRS 2. 动态拒绝机制 3. 质量重加权策略 …

[面试] 手写题-数组转树

示例数据&#xff1a; const arr [{ id: 1, parentId: null, name: Root },{ id: 2, parentId: 1, name: Child 1 },{ id: 3, parentId: 1, name: Child 2 },{ id: 4, parentId: 2, name: Grandchild 1 }, ]目标生成&#xff1a; const tree [{id: 1,name: Root,children: …

CertiK《Hack3d:2025年第二季度及上半年Web3.0安全报告》(附报告全文链接)

CertiK《Hack3d&#xff1a;2025年第二季度及上半年Web3.0安全报告》现已发布&#xff0c;报告显示&#xff1a;仅2025年上半年&#xff0c;因安全事件导致的损失接近25亿美元&#xff1b;截至目前&#xff0c;总损失已超过去年全年水平。整体来看&#xff0c;Web3.0安全形势依…

反向传播 梯度消失

反向传播 backpropagation 反向传播&#xff08;Backpropagation&#xff09; 是神经网络训练中的一种核心算法&#xff0c;用于通过计算误差并将其传播回网络&#xff0c;从而更新神经网络的参数。通过反向传播&#xff0c;网络能够在每次迭代中逐步调整其参数&#xff08;例…

京东外卖服务商加入方案对比!选择本地生活服务商系统的优势,到底在哪?

自入局之日起&#xff0c;京东外卖似乎就一直热衷于给人惊喜&#xff1a; 先是在上线时规定了“2025年5月1日前入驻的商家&#xff0c;全年免佣金”和“仅限品质堂食商家入驻”&#xff1b; 再是宣布了要为外卖骑手缴纳五险一金&#xff0c;并承担其中的所有成本&#xff1b;…

【RTSP从零实践】4、使用RTP协议封装并传输AAC

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Bootstrap 安装使用教程

一、Bootstrap 简介 Bootstrap 是一个开源的前端框架&#xff0c;由 Twitter 开发&#xff0c;旨在快速开发响应式、移动优先的 Web 页面。它包含 HTML、CSS 和 JavaScript 组件&#xff0c;如按钮、导航栏、表单等。 二、Bootstrap 安装方式 2.1 使用 CDN&#xff08;推荐入…

Java学习第二部分——基础语法

目录 一.数据类型 &#xff08;一&#xff09;数值类型&#xff08;用于存储数字&#xff0c;包括整数和浮点数&#xff09; 1. **整数类型** 2. **浮点类型** &#xff08;二&#xff09;非数值类型&#xff08;非数值类型用于存储非数字数据&#xff09; 1. **char** 2…

Redis分布式锁核心原理源码

文章目录 概述一、Redis实现分布式锁1.1、第一版1.2、第二版1.3、第三版1.3、第四版 二、Redisson实现分布式锁核心源码分析2.1、加锁核心源码2.2、锁续期核心源码2.3、重试机制核心源码2.4、解锁核心源码 总结 概述 传统的单机锁&#xff08;Synchronized&#xff0c;Reentran…

关于vue2使用elform的rules校验

在使用vue2开发项目的时候使用element组件的el-form大多数情况都需要用到必填项校验 举个栗子&#xff1a; <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><e…