每一年都奔走在自己热爱里

荣耀的背后刻着一道孤独

mysql

10.Mysql

10.1 初识myaql

image-20220206144822434

image-20220206144957778

10.1.1 为什么学习数据库

  1. 岗位需求

  2. 现在的世界,大数据时代

  3. 被迫需求:村数据

  4. 数据库是所有软件体系中最核心的存在

10.1.2 什么是数据库

概念:数据仓库,软件,安装在操作系统之上,可以存储大量的数据

作用:存储数据,管理数据

10.1.3 数据库分类

image-20220206145915096

DBMS(数据库管理系统)

  • 数据库管理软件,科学有效的管理数据,维护和获取数据

  • MySQL,数据库管理系统

10.1.4 MySQL简介

image-20220206150741681

安装建议:

  1. 尽量不用exe,注册表

  2. 尽可能使用压缩包安装,卸载没那么麻烦

10.1.5 安装MySQL

  • 解压

  • 安装

  • 配置环境变量

  • 新建mysql配置文件ini

  • 启动管理员模式下的cmd,输入mysql启动命令

  • 安装mysql服务

  • 初始化data

  • 启动mysql,进去修改密码

image-20220206151729882

10.1.6 基本的命令行操作

  • 命令行链接

管理员身份运行

image-20220206152341394

> mysql -uroot -p  --链接mysql命令
>
> show databases;  --查看所有的数据库

mysql> use test;
Database changed   --使用数据库表
mysql> show tables;
Empty set (0.01 sec) --查看表,所有的语句都是使用分号结尾
mysql> exit
Bye              --退出连接
--   表示单行注释
/**/ 表示多行注释
#   表示单行注释

 

image-20220206153837231

 

10.2 操作数据库

操作数据库>操作数据库中的表>操作数据库表中的数据

mysql不区分大小写

10.2.1 操作数据库

  1. 创建数据库

    create database [if not exists] westos;

     

  2. 删除数据库

    drop database [if exists]westos;
  3. 使用数据库

    use school

 

  1. 查看所有的数据库

    show databases; --所有数据库

     

10.2.2 数据列类型

数值

image-20220206155214544

字符串

image-20220206155428879

时间日前

image-20220206155609032

null

image-20220206155706992

10.2.3 数据库的字段属性(重点)

unsigned:

image-20220206160036193

zerofill:

image-20220206160107092

自增:

image-20220206160233227

非空:

image-20220206160255411

默认:

image-20220206160324080

拓展做项目时表示一个记录存在的意义

image-20220206160745294

10.6 事务

10.6.1 什么是事务

要么都成功,要么都失败

image-20220206163000797

事务原则:ACID原则:院子性,一致性,持久性,隔离性

参考博客:https://blog.csdn.net/dengjili/article/details/82468576

image-20220206163557896

隔离所导致的一些问题

image-20220206163752168

执行事务

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 -- 删除保留点

image-20220206165704733

模拟场景

-- 转账
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

    • 快速定位数据

image-20220206191128245

基础语法

image-20220206191426164

10.7.2 测试索引

image-20220206193241770

explatn

image-20220206193425105

索引在小数据量的时候用处不大,但是在大数据量的时候,区别十分明显

10.7.3 索引原则

image-20220206193747043

索引的数据结构

Hash 类型的索引

Bree:InnoDB的默认数据结构

阅读:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

讲的很好

10.8 权限管理

10.8.1 用户管理

可视化管理

可以进行用户的增加,删除

image-20220206194849122

可以对用户权限进行设置

image-20220206195042162

 

SQL命令操作

用户表:mysqluser

本质时对用户表进行增删该查

image-20220206200025319

 

10.8.2 数据库备份

为什么要备份:

  • 保证重要的数据不丢失

  • 数据转移

    MySQL数据库备份的方式

    • 直接拷贝到物理文件

    • 在可视化软件中导出

      1. 在想要导出的库或者表中,右键然后导出

      2. 然后也可以导入

    • 使用命令行导出 mysqldump命令行使用

      1. 格式:mydqldump -h 主机 -u 用户名 -p 密码 数据库 表名 > 物理磁盘位置/文件名

      2. mysqldump -hlocalhost -root -p1314520 school student >D:/s.sql

      3. 格式:mydqldump -h 主机 -u 用户名 -p 密码 数据库 表名1 表名2 > 物理磁盘位置/文件名(这是导出多张表)

      4. 登入的情况下,切换到指定的数据库,source 备份文件

      5. source d:/a.sql

      6. 不登录的情况下,mysql -u用户名 -p密码 库名 <备份文件

 

10.9规范数据库设计

10.9.1 为什么要设计

 

 

软件开发中,关于数据库的设计:

  • 分析需求:分析业务和需要处理的数据库的需求

  • 概要设计:设计关系图E-R图

设计数据库的步骤:(个人博客):

数据库里面不用驼峰命名用下划线

  • 收集信息,分析需求

    1. 用户表(用户登录注册,用户的个人信息,写博客,创建分类)

    2. 分类表(文章分类,谁创建的)

    3. 文章表(文章的信息)

    4. 评论表

    5. 友链表(友链信息)

    6. 自定义表(系统信息,某个关键字,或者一些主字段)

    7. 说说表(发表心情。。。i.d。。content)

  • 标识实体(就死建表,落实到每个字段)

  • 标识实体之间的关系

    1. 写博客:user---》blog

    2. 创建分类:user---》blog

    3. 关注:user---》user

    4. 评论:user--》user--》blog

10.9.2 三大范式

为什么需要数据规范化

image-20220207163513391

三大范式

第一范式

原子性:保证每一列不可再分

第二范式

前提:满足第一范式

每张表只描述一件事情

第三范式

前提:满足第一范式和第二范式

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关

规范性和性能的问题image-20220207164631040

10.10 JDBC(重点)

10.10.1 数据库驱动

驱动:声卡,显卡,数据库

image-20220207165025764

我们的程序通过数据库驱动和数据库打交道

10.10.2 JDBC

JAVA操作数据库的规范要JDBC

image-20220207165207870

对于开发人员来说只要学习JDBC即可

image-20220207165354621

java.sql

javax.sql

还需要导入一个数据库驱动包 mysql-connector=java-5.1.47.jar

10.10.3第一个JDBC程序

image-20220207165958896

1.创建一个普通java项目

2.导入数据库驱动

在项目下新建lib目录,把jar包复制进来,右键点击add as library

image-20220207185233893

 

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);返回的结果集,结果集中封装了我们全部的查询出来的结果

    image-20220207192739032

  • 释放连接

    resultSet。close();

    statement.close();

    connection.close();

    从后面往前面关闭

步骤总结:

image-20220207193128600

Drivermanger

image-20220207193808897

URL

image-20220207193946823

Statement 执行SQL的对象 preparestatemnt 执行SQL对象

image-20220207194409062

resultset 查询结果集:封装了所有的查询结果

获得指定的数据类型

image-20220207194618492

遍历,指针

image-20220207194824310

释放资源

image-20220207194910726

10.10.4 statement

image-20220207195130007

crud操作 create

image-20220207195236661

crud 操作 delete

image-20220207195320614

crud 操作 update

image-20220207195408094

crud 操作 read

image-20220207195526826

代码实现

1.提取工具类

  • 建立一个utils包

image-20220208110302433

  • 建立一个配置文件,增加耦合度

image-20220208111352091

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语句

  • 编写语句

    1. 插入语句

      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);//释放资源
            }
        }
      }
      1. 删除语句

        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语句就行

        1. 修改语句

        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注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。 本质就是SQL会被拼接 有or,拿 or ’1-1‘ 就可以

10.10.6 PreparedStatement对象

PreparedStatement对象和statement对象的区别就是可以防止sql注入

 

 

 

 

 

 

 

 

 

 

posted @ 2022-02-07 14:37  学技术的小凯  阅读(47)  评论(0编辑  收藏  举报