mysql
作者:@学技术的小凯
本文为作者学习时记录,转载请注明出处:https://www.cnblogs.com/zrk0929/p/15867807.html
10.Mysql
10.1 初识myaql
10.1.1 为什么学习数据库
-
岗位需求
-
现在的世界,大数据时代
-
被迫需求:村数据
-
数据库是所有软件体系中最核心的存在
10.1.2 什么是数据库
概念:数据仓库,软件,安装在操作系统之上,可以存储大量的数据
作用:存储数据,管理数据
10.1.3 数据库分类
DBMS(数据库管理系统)
-
数据库管理软件,科学有效的管理数据,维护和获取数据
-
MySQL,数据库管理系统
10.1.4 MySQL简介
安装建议:
-
尽量不用exe,注册表
-
尽可能使用压缩包安装,卸载没那么麻烦
10.1.5 安装MySQL
-
解压
-
安装
-
配置环境变量
-
新建mysql配置文件ini
-
启动管理员模式下的cmd,输入mysql启动命令
-
安装mysql服务
-
初始化data
-
启动mysql,进去修改密码
10.1.6 基本的命令行操作
-
命令行链接
管理员身份运行
复制复制复制> mysql -uroot -p --链接mysql命令
>
> show databases; --查看所有的数据库
mysql> use test;
Database changed --使用数据库表
mysql> show tables;
Empty set (0.01 sec) --查看表,所有的语句都是使用分号结尾
mysql> exit
Bye --退出连接
-- 表示单行注释
/**/ 表示多行注释
# 表示单行注释
10.2 操作数据库
操作数据库>操作数据库中的表>操作数据库表中的数据
mysql不区分大小写
10.2.1 操作数据库
-
创建数据库
复制复制复制create database [if not exists] westos;
-
删除数据库
复制复制复制drop database [if exists]westos;
-
使用数据库
复制复制复制use school
-
查看所有的数据库
复制复制复制show databases; --所有数据库
10.2.2 数据列类型
数值
字符串
时间日前
null
10.2.3 数据库的字段属性(重点)
unsigned:
zerofill:
自增:
非空:
默认:
拓展:做项目时,表示一个记录存在的意义
10.6 事务
10.6.1 什么是事务
要么都成功,要么都失败
事务原则:ACID原则:院子性,一致性,持久性,隔离性
参考博客:https://blog.csdn.net/dengjili/article/details/82468576
隔离所导致的一些问题
执行事务
mysql默认开启事务 自动提交的
复制复制复制set autocommit=0 -- 关闭
set autocommit=1 -- 开启,默认的
-- 手动处理事务
set autocommit=0 -- 第一步关闭自动提交
-- 事务开启
start transaction -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
insert xxx
insert xxxx
-- 提交:持久化(成功)
commit
-- 回滚:回到原来的样子(失败)
rollback
-- 事务结束
set autocommit=1 -- 开启自动提交
-- 了解
savepoint 保存点 -- 设置一个事务的保存点,有点像单机游戏的存档
rollback to savepoint -- 回滚到保存点
release savepoint -- 删除保留点
模拟场景
复制复制复制-- 转账
create database shop character set utf8 collate utf8_general_ci;
use shop;
create table `account`(
`id` int(3) not null auto_increment,
`name` varchar(30) not null,
`money` decimal(9,2) not null,
primary key(`id`)
)engine=innodb default CHARSET=utf8;
insert into account(`name`,`money`) -- 插入数据
values (`A`,2000.00),(`B`,10000.00)
-- 模拟转账,事务
set autocommit=0;-- 关闭自动提交
start transaction -- 开启事务
update account set money=money-500 where `name`=`A` -- A减500
update account set money=money+500 where `name`=`B` -- B加500
commit; -- 提交事务,事务一旦提交就是被持久化了
rollback; -- 回滚
set autocommit=1;-- 开启事务
10.7 索引
mysql官方对索引的定义是:索引(index)是帮助mysql高效获取数据的数据结构,提取句子主干,就可以得到索引的本质,索引就是数据结构
10.7.1索引的分类
-
主键索引 :primary key
-
唯一标识,主键不能重复
-
-
唯一索引:unique key
-
避免重复的列的出现,唯一索引可以重复,多个列都可以标识唯一索引
-
-
常规索引 key|index
-
默认的,用index,key关键字来设置
-
-
全文索引 fulltext index
-
在特定的数据库引擎下才有,my|sam
-
快速定位数据
-
基础语法
10.7.2 测试索引
explatn
索引在小数据量的时候用处不大,但是在大数据量的时候,区别十分明显
10.7.3 索引原则
索引的数据结构
Hash 类型的索引
Bree:InnoDB的默认数据结构
阅读:http://blog.codinglabs.org/articles/theory-of-mysql-index.html
讲的很好
10.8 权限管理
10.8.1 用户管理
可视化管理
可以进行用户的增加,删除
可以对用户权限进行设置
SQL命令操作
用户表:mysqluser
本质时对用户表进行增删该查
10.8.2 数据库备份
为什么要备份:
-
保证重要的数据不丢失
-
数据转移
MySQL数据库备份的方式
-
直接拷贝到物理文件
-
在可视化软件中导出
-
在想要导出的库或者表中,右键然后导出
-
然后也可以导入
-
-
使用命令行导出 mysqldump命令行使用
-
格式:mydqldump -h 主机 -u 用户名 -p 密码 数据库 表名 > 物理磁盘位置/文件名
-
mysqldump -hlocalhost -root -p1314520 school student >D:/s.sql
-
格式:mydqldump -h 主机 -u 用户名 -p 密码 数据库 表名1 表名2 > 物理磁盘位置/文件名(这是导出多张表)
-
登入的情况下,切换到指定的数据库,source 备份文件
-
source d:/a.sql
-
不登录的情况下,mysql -u用户名 -p密码 库名 <备份文件
-
-
10.9规范数据库设计
10.9.1 为什么要设计
软件开发中,关于数据库的设计:
-
分析需求:分析业务和需要处理的数据库的需求
-
概要设计:设计关系图E-R图
设计数据库的步骤:(个人博客):
数据库里面不用驼峰命名,用下划线
-
收集信息,分析需求
-
用户表(用户登录注册,用户的个人信息,写博客,创建分类)
-
分类表(文章分类,谁创建的)
-
文章表(文章的信息)
-
评论表
-
友链表(友链信息)
-
自定义表(系统信息,某个关键字,或者一些主字段)
-
说说表(发表心情。。。i.d。。content)
-
-
标识实体(就死建表,落实到每个字段)
-
标识实体之间的关系
-
写博客:user---》blog
-
创建分类:user---》blog
-
关注:user---》user
-
评论:user--》user--》blog
-
10.9.2 三大范式
为什么需要数据规范化
三大范式
第一范式
原子性:保证每一列不可再分
第二范式
前提:满足第一范式
每张表只描述一件事情
第三范式
前提:满足第一范式和第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
规范性和性能的问题
10.10 JDBC(重点)
10.10.1 数据库驱动
驱动:声卡,显卡,数据库
我们的程序通过数据库驱动和数据库打交道
10.10.2 JDBC
JAVA操作数据库的规范要JDBC
对于开发人员来说只要学习JDBC即可
java.sql
javax.sql
还需要导入一个数据库驱动包 mysql-connector=java-5.1.47.jar
10.10.3第一个JDBC程序
1.创建一个普通java项目
2.导入数据库驱动
在项目下新建lib目录,把jar包复制进来,右键点击add as library
3.编写测试代码
-
加载驱动
class,forName("com.mysql.jdbc.Driver");//固定写法
-
用户名信息和url
String url=“jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=true"
string username=root;
string password=201314;
-
链接成功,数据库对象 Connection 代表数据库
Connection connection =DriverManager.getConnection(url,username,password)
-
执行SQL对象 statement 执行sql对象
Statement statement=connection.createStatement();
-
执行SQL的对象去执行SQL,可能存在结果,查看返回结果
String sql=”select * from users“;
Resultset resultset=statement.executeQury(sql);返回的结果集,结果集中封装了我们全部的查询出来的结果
-
释放连接
resultSet。close();
statement.close();
connection.close();
从后面往前面关闭
步骤总结:
Drivermanger
URL
Statement 执行SQL的对象 preparestatemnt 执行SQL对象
resultset 查询结果集:封装了所有的查询结果
获得指定的数据类型
遍历,指针
释放资源
10.10.4 statement
crud操作 create
crud 操作 delete
crud 操作 update
crud 操作 read
代码实现
1.提取工具类
-
建立一个utils包
-
建立一个配置文件,增加耦合度
复制复制复制driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3307/school?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=201314
-
建立工具类加载配置文件
复制复制复制package com.util;
import com.sun.xml.internal.fastinfoset.algorithm.IEEE754FloatingPointEncodingAlgorithm;
import jdk.nashorn.internal.ir.CatchNode;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class jdbcutils {
private static String driver=null;
private static String url=null;
private static String username=null;
private static String password=null;
static{
try{
//读取配置文件中的输入流
InputStream inputStream= jdbcutils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties=new Properties();//拿到输入流
properties.load(inputStream);//读出输入流
driver=properties.getProperty(driver);//获取配置文件中的对象
url=properties.getProperty(url);//获取配置文件中的对象
username=properties.getProperty(username);//获取配置文件中的对象
password=properties.getProperty(password;//获取配置文件中的对象
//驱动只要加载一次
Class.forName(driver);
}catch (Exception e){
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection()throws SQLException {
return DriverManager.getConnection(url,username,password);
}
//释放资源
public static void release(Connection com, Statement st, ResultSet rs){
if(rs!=null){
try {
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
}catch (SQLException e){
e.printStackTrace();
}
if(com!=null){
try {
com.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
}这些都是固定的唯一要改的就是sql语句
-
编写语句
-
复制复制复制package com;
import com.sun.xml.internal.bind.v2.model.core.ID;
import com.util.jdbcutils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class test {
public static void main(String[] args) {
Connection com=null;
Statement st=null;
ResultSet rs=null;
try {
com= jdbcutils.getConnection();//获取数据库连接
st= com.createStatement();//获取SQL执行对象
String sql="insert into user(`id`,`name`,`password`,`email`,`birthday`)" +
"values( `4`,`kai`,`123456`,`2537159362@qq.com`,`1998`)";
int i=st.executeUpdate(sql);//执行sql语句,i表示受影响的行数
if(i>0){
System.out.println("插入成功!");
}
}catch (SQLException e){
e.printStackTrace();
}finally {
jdbcutils.release(com,st,rs);//释放资源
}
}
}-
删除语句
复制复制复制package com;
import com.sun.xml.internal.bind.v2.model.core.ID;
import com.util.jdbcutils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class test {
public static void main(String[] args) {
Connection com=null;
Statement st=null;
ResultSet rs=null;
try {
com= jdbcutils.getConnection();//获取数据库连接
st= com.createStatement();//获取SQL执行对象
String sql="delete from user ehere id=1";
int i=st.executeUpdate(sql);//执行sql语句,i表示受影响的行数
if(i>0){
System.out.println("删除成功!");
}
}catch (SQLException e){
e.printStackTrace();
}finally {
jdbcutils.release(com,st,rs);//释放资源
}
}
}和插入相比就变了一个sql,增删改都用的.executeUpdate,都只要修改sql语句就行
-
修改语句
复制复制复制package com;
import com.sun.xml.internal.bind.v2.model.core.ID;
import com.util.jdbcutils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class test {
public static void main(String[] args) {
Connection com=null;
Statement st=null;
ResultSet rs=null;
try {
com= jdbcutils.getConnection();//获取数据库连接
st= com.createStatement();//获取SQL执行对象
String sql="update user set name=kai ehere id=1";
int i=st.executeUpdate(sql);//执行sql语句,i表示受影响的行数
if(i>0){
System.out.println("修改成功!");
}
}catch (SQLException e){
e.printStackTrace();
}finally {
jdbcutils.release(com,st,rs);//释放资源
}
}
} -
-
-
-
查询
复制复制复制package com;
import com.sun.xml.internal.bind.v2.model.core.ID;
import com.util.jdbcutils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class test {
public static void main(String[] args) {
Connection com=null;
Statement st=null;
ResultSet rs=null;
try {
com= jdbcutils.getConnection();//获取数据库连接
st= com.createStatement();//获取SQL执行对象
String sql="select * from user ehere id=1";
rs==st.executeQuery(sql);//查询完毕,会返回结构集
while(rs.next()){
System.out.print(rs.getString(columnlabel:"name")//把结构集打印出来
}
}catch (SQLException e){
e.printStackTrace();
}finally {
jdbcutils.release(com,st,rs);//释放资源
}
}
}
10.10.5 SQL注入
SQL注入问题
sql注入就是sql存在漏洞,会被攻击导致数据泄露SQL注入即是指
10.10.6 PreparedStatement对象
PreparedStatement对象和statement对象的区别就是可以防止sql注入
本文来自博客园,作者:学技术的小凯,转载请注明原文链接:https://www.cnblogs.com/zrk0929/p/15867807.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)