• 71.【MySQL-二刷】


    1.操作数据库语句

    假如说,库名是一个特殊的关键字。为了进行区分关键字和库名,我们可以使用
    TAB键上面的(飘号)----->``.进行区分库名和关键字。
    
    • 1
    • 2

    在这里插入图片描述

    • eg: 库的名字叫USE,进行使用库的操作时候
      在这里插入图片描述

    2.数据库列类型

    1.数值:
    (1).tinyint: ---------1个字节 ---------(十分小的数据)
    (2).smallint: ---------2个字节---------》(较小的数据)
    (3).mediumint: ---------3个字节---------》(中等的数据)
    (4).int ---------》4个字节 
    (5).big ---------8个字节
    -------------------------------------
    float: ---------4个字节  ---------(精度不好)
    double: ---------8个字节 ---------(精度不好)
    decimal:  ---------》字符串形式的浮点数,---------(精度高)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2.字符串:
    (1).char---------》字符串固定大小的 0~255 
    (2).varchar ---------》可变字符串 0~65535
    (3).tinytext---------》微型文本 2^8-1---------(写博客文档)
    (4).text---------》大型文本---------2^16-1---------(超大文本)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3.日期:
    (1).date---------》yyy-mm-dd---------》(日期格式)
    (2).time---------》hh:mm:ss---------(时间格式)
    (3).datetime ---------》yy:mm:dd:hh:mm:ss---------(日期+时间)
    (4).timestamp---------》时间戳
    (5).year---------》年
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    4.null
    (1).没有值,未知。
    (2).不要使用null进行运算,因为结果还是null;
    
    • 1
    • 2
    • 3

    3.数据库的字段属性

    1.unsigned:0~65535
    (1).无符号的整数。(没有负号)
    (2).声明了该列不能为负数,只能为正数。
    
    • 1
    • 2
    • 3
    2.zerofill
    (1).0填充的---------》(用0进行补位的操作)
    (2).不足的位数,使用0来填充。
    eg: int(3)---------》整形且3位。 输入5 填充后 005;
    
    • 1
    • 2
    • 3
    • 4
    3.auto_increment
    (1).自动在上一行的基础上+1(默认)
    (2).通常用来设计唯一的主键,必须是整数类型
    (3).可以自定义设计主键自增的起始值和步长
    
    • 1
    • 2
    • 3
    • 4
    4.not null
    (1).假设设置为not null,如果不给他赋值,就会报错
    (2).null,如果不填写,默认就是null;
    
    • 1
    • 2
    • 3

    4.数据库的主键添加(primary key())

    create database demo1;
    create table if not exists `student`(
       `id` int(10)  auto_increment,
       `name` varchar(20) not null,
       `sex` varchar(20) not null,
       `qq` int(11) not null unique,
        primary key(id)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    阿里巴巴规范,在最后的语句中添加主键:
    primary key(id)
    
    • 1
    • 2

    5.删除数据表的两种格式---------》drop and delete

    1.彻底删除包括数据表的属性和数据:
    drop table `被删除的数据表名`;
    
    • 1
    • 2

    这里是引用

    2.仅删除数据库的数据信息,不删除数据库的属性
    truncate table `student`;
    
    • 1
    • 2

    这里是引用

    6.限制结果--------》limit A offset B

    select name from `student` LIMIT (返回几行) OFFSET (第几行开始);
    
    • 1

    这里是引用

    7.排序子句---------》order by(默认为升序)

    1.如果不排序,数据一般将以他在表中出现的顺序显示,这有可能是数据最初
    添加到表中的顺序,但是如果数据随后进行过更新或删除,那么这个顺序将会
    受到DBMS重用回收存储空间的方式的影响。
    
    • 1
    • 2
    • 3
    2.oreder by 子句必须保证它是select 语句中最后一条子句。如果不是最后一条
    那么将会进行报错的处理。
    
    • 1
    • 2
    3.按多个列进行排序
    select *from `student` order by (第一条件),(第二条件);
    假如说:在第一条件相等的情况下,那么我们就进行比较第二条件
    
    • 1
    • 2
    • 3

    这里是引用

    4.自定义排序方向
    (1.order by=========>默认升序排序
    (2.order by desc========>降序排序
    (3.order by asc========>升序排序
    (4.DESC 关键字只应用到直接位于其前面的列名。如果想对多个列进行排序,那么
    我们必须对内一列指定DESC关键字。
    eg:  SELECT *FROM `student` ORDER BY id DESC;
    
    eg:  SELECT *FROM `student` ORDER BY id DESC,sex DESC;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里是引用

    8.低级过滤数据---------》条件判断

    1.where 子句优先级高于 order by ,所以where 的位置在order的前面。
    
    • 1
    2.切记NULL和非匹配(<>)是不一样的。
    
    • 1

    这里是引用

    9. 高级数据过滤--------》操作符

    1.and的优先级高于or的优先级。
    假如说andor同时出现的话,那么将会先执行and、然后执行or
    
    • 1
    • 2

    这里是引用

    2. ()的优先级高于andor
    
    • 1

    这里是引用

    3. in操作符:用来指定条件范围,范围中的每个条件都可以进行匹配,in取
    一组由逗号分隔,括在圆括号中的合法值。
    为什么要使用in而不是or?
    (1).in操作符一般比一组or操作符执行的更快。
    (2).in操作符的最大优点就是可以包含其他select语句,能够更动态地建立where子句。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里是引用

    4.NOT操作符:where子句中地NOT操作符有且只有一个功能,那就是否定其后所跟
    的任何条件。
    
    
    • 1
    • 2
    • 3

    这里是引用

    10.用通配符进行过滤----------》like

    1.like操作符:like操作符相较于以前常规的操作符最大的区别就是:以前常规的
    操作符需要知道值,like 操作符可以实现在未知的情况下进行操作。
    2.通配符需要和操作符进行协助才能生效
    
    • 1
    • 2
    • 3
    2.百分号(%)通配符,在搜索串中,%表示任何字符出现任意次数。
    (1).%放在字符的前面,就是说:以什么什么结尾。
    (2).%放在字符的后面,就是说:以什么什么开头。
    (3).%在字符的前面和后面,就是说:以什么什么在中间
    (4).先后关系                                                                                                                                                                                                                                                                                                                                                                                                                      
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里是引用

    3.下划线(_)通配符:下划线的用处和%一样,但它只匹配单个字符,而不是多个字符
    
    • 1

    这里是引用

    4.方括号[],通配符:用来指定一个字符集。^(脱字号)
    select *from `student` where qq like '[AB]%';---》查找以A或B开头的QQ
    select *from `student` where qq like '[^AB]%';---》查找不以A或B开头的QQ
    
    • 1
    • 2
    • 3
    5.通配符效率低,可以不用就不用。
    
    • 1

    11.创建计算字段

    1.拼接字段:
    select concat(name,id) from `student`;
    
    • 1
    • 2

    这里是引用

    12.别名:-----AS

    AS '别名':------->有利于我们进行阅读
    
    • 1

    这里是引用

    13.去重---------distinct

    1.distinct 去重的操作。
    
    • 1

    这里是引用

    14.分页子句------limit

    1.分页函数放在排序子句的后面:
    where ----->like --->order by---->limit
    eg:select *from student order by id limit 0,3;
    2.起始索引
    起始索引=(n-1)*页距
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里是引用

    15.字符串函数/日期/拼接

    1.concat()----->字符串拼接
    2.char_length()---->字符串拼写
    3.innert(str,1,2,str1)----->用str1替换str,从第一个字符开始到第二个字符
    4.instr('str','s')--------->查询s所在字符串中第几个位置。
    5.replace(str,a,b)--------->用b替换出现在str字符串中的a字符
    6.select current_date();----》当前日期
    7.select curdate()-----》当前日期
    8.select now();------》当前年月日时间
    9.select sysdate();----》系统时间
    10. select second(now());-----》当前秒
    11.  select user();--------》当前用户
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1-3在这里插入图片描述
    4
    这里是引用
    5-11
    在这里插入图片描述

    16.聚合函数不允许在where后使用/on用于连接不用于判断

    1.聚合函数不允许在where后使用,如果非要进行判断,需要在having后使用
    
    • 1

    这里是引用

    17.数据库级别的MD5加密(扩展)

    1.什么是MD5?
    一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald LinnRivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

    1.主要作用:增强算法复杂度和不可逆性;
    (1).MD5不可逆,具体的值的md5是一样;
    (2).破解密码原理:把简单的密码都放在一个字典中,如果对MD5破解成功,
    那么就返回正确的密码,否则返回MD5加密后的伪密码
    
    • 1
    • 2
    • 3
    • 4
    1.在插入数据之后,再进行加密的操作:
    update admin set password=md5(password) where id=1;--->对id为1d的数据进行加密
    update admin set password=md5(password)------》对所有数据进行加密
    
    • 1
    • 2
    • 3
    create table admin(
     id int(11) auto_increment,
     name varchar(20) not null,
     password varchar(20) not null,
     primary key(id)
    );
    insert into admin values(null,'李黑',md5('123456'));
    update admin set password=md5(password) where id=1;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里是引用

    2.在插入数据的同时,进行MD5加密的操作
    insert into admin values(null,'李黑',md5('123456'));
    
    • 1
    • 2

    这里是引用

    3.MD5,加密后密码如何进行校验?
    select *from admin where password=md5('123456');
    
    • 1
    • 2

    这里是引用

    18.事务(自动提交/手动提交)

    1.一个语句就是一个事务,-----》默认的,也就是自动提交的
    
    • 1
    create table account(id int primary key auto_increment,
    name varchar(20) not null,
    money int
    );
    insert into account(name,money) values('张三',2000),('李四',2000);
    update account set money=money-1000 where name='张三';
    update account set money=money+1000 where name='李四';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1.在自动提交的前提下,张三和李四的钱会得到正确的变动,假如说不是自动提交,就会出现一些事故。
    
    • 1

    1.自动提交不会报错这里是引用

    2.模拟排错..........
    
    程序排除异常....
    update account set money=money-1000 where name='张三';
    update account set money=money+1000 where name='李四';
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.自动提交的情况下模拟转账出错
    在这里插入图片描述
    在这里插入图片描述

    3.事务操作:(手动操作在当前的表中可变化,在另一个表中不变化)
    (1).查看事务的提交方式:
    select @@autocommit;
    (2).设置事务的提交方式:
    set @@autocommit=0; (手动)
    (3).手动提交事务:
    commit;  (sql见到这个语句的时候,才会从缓冲区提取出来执行,就相当于
    自动提交时候的分号)
    (4).回滚事务:
    rollback: (当事务遇到异常的时候,就会实现数据的回滚)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    1.设置为手动提交的时候,此窗口的数据是变化可见的,但其他窗口不变
    ()不提交的前提下在这里插入图片描述
    2.输入commit后,另一个窗口就会改变
    在这里插入图片描述
    3.手动提交并不能解决(转账问题),只有rollback回滚数据才可以
    在这里插入图片描述
    4.如果有异常就实现数据的回滚
    在这里插入图片描述

    19.事务(不修改事务提交方式,如何控制事务)

    1.开启事务:
    start transactionbegin
    2.提交事务:
    commit
    3.回滚事务:
    rollback
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.不改变事务提交方式的前提下,进行控制事务这里是引用

    20.事务的四大特性(ACID)

    1.原子性:
    针对一个事务,这个事务要么一起成功,要么一起失败。
    2.一致性: 
    无论数据怎么转(转钱),数据的最终数据都是一样的(比如800200,最终数据是100)-《最终结果一致性》
    3.持久性:
    事务结束后的数据不会随着外部原因导致数据丢失。(断电、服务器崩溃)
    (1).事务没有提交就会自动回滚数据。
    (2).事务如果已经提交那么数据就是提交后的结果。
    4.隔离性:
    针对多个用户同时操作,主要是排除其他事务对本次事务的影响;
    eg: A-->转钱B;  C---->转钱B。 
    会有一个隔离级别,假如隔离成功就能同时运行,否则就会出现隔离级别问题
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.原子性:
    在这里插入图片描述
    2.一致性(最终结果一致)
    在这里插入图片描述
    3.持久性
    在这里插入图片描述

    4.隔离性
    在这里插入图片描述

    21.并发事务问题/事务隔离级别(解决事务并发问题)

    1.事务的隔离级别:
    (1).胀读:指一个事务读取了另外一个未提交的事务。
    (2).不可重复读:一个事务先后读取同一条记录,但两次读取的数据结果不同,称之为不可重复读
    (3).幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了欢迎。
    
    • 1
    • 2
    • 3
    • 4
    2.隔离级别:(四大隔离级别/解决事务并发问题)
    (1).read uncommitted  (不可以解决:胀读 不可重复读 幻读)
    (2).read committed (不可以解决:不可重复读 幻读)
    (3).repeatable read(默认) (不可以解决:幻读)
    (4).serializable (都可解决)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3.查看事务的隔离级别:
    (1).select @@tx_isolation;
    设置事务隔离级别
    (2).set [session | global] transaction isolation level { 隔离等级}; 
    
    • 1
    • 2
    • 3
    • 4

    1.模拟脏读的现象(read uncommitted) 读到未提交的数据
    在这里插入图片描述
    2.解决脏读(read committed)
    在这里插入图片描述
    3.模拟不可重复读的问题(readn committed)
    在这里插入图片描述
    4.解决不可重复读问题在这里插入图片描述
    5.模拟幻读的问题:
    在这里插入图片描述
    6.解决幻读的问题在这里插入图片描述

    22.组合查询(union)

    • Union必须有两条或者两条以上的select 语句组成,语句之间用关键字Union分割,(因此,如果组合四条select 语句,将要使用三个union)
    • union中的每个查询必须包含相同的列,表达式或聚集函数(不过,各个列不需要以相同的次序列出)
    • 列数据类型必须兼容:类型不必完全相同,但必须时DBMS可以隐含转换的类型。
    1. union: 组合查询,会查找全部信息(但不包括重复信息)
    2. select name from student where id=1 union  select name from student where id=1;
    3. union all: 组合查询,会查找全部信息(包括重复信息)
    4. select name from student where id=1 union all select name from student where id=1;
    
    • 1
    • 2
    • 3
    • 4

    这里是引用

    23.索引(讲的不好)

    1.索引的定义:
    MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构。
    提取句子主干,就可以得到索引的本质: 索引是数据结构。
    2.索引的分类:
    (1).主键索引(primary key)=====>唯一性,主键不可重复,一个表只能有一个
    (2).唯一索引(unique key)======》避免重复的列出现,一个表可以有多个唯一索引
    (3).常规索引(key/index)=======》默认的,
    (4).全文索引(FullText)========》在特定的数据库引擎下才有
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3.显示所有的索引信息:
    show index from <表名>;
    4.分析SQL的语句
    explain select *from student;
    
    • 1
    • 2
    • 3
    • 4

    1.展示所有的索引信息在这里插入图片描述
    2.展示执行SQL执行的状况
    在这里插入图片描述

    24.数据库用户管理(用户权限管理)

    1.权限管理:
    (1).用户管理: 可视化界面对用户的添加和删除
    
    • 1
    • 2

    1.添加用户:
    在这里插入图片描述
    2.给这个用户权限设置
    在这里插入图片描述
    3.让此用户允许在指定的数据库操作的权限
    在这里插入图片描述
    4.进行链接的操作
    在这里插入图片描述
    5.自己创建的数据库用户链接成功
    在这里插入图片描述

    2.利用SQL语句进行用户管理:
    (1).本质:读mysql中的user这张表,对这张表增删改查;
    (2).创建用户:
    CREATE USER <用户名> IDENTIFIED BY '<密码>';
    eg:   CREATE USER liming IDENTIFIED BY '121788';
    (3).修改本机密码:
    SET PASSWORD=PASSWORD('<密码>');
    eg:  SET PASSWORD=PASSWORD('123456');
    (4).修改指定用户密码:
    SET PASSWORD FOR <指定数据库>=PASSWORD('密码');
    eg:  SET PASSWORD FOR liming=PASSWORD('123456');
    (5).对用户名进行重命名
     RENAME USER <原用户名> to <更改后的数据名>;
    eg: RENAME USER liming to liming2;
    (6).用户授权
     GRANT ALL PRIVILEGES ON <.> TO <授权的用户名>;
    eg: GRANT ALL PRIVILEGES ON *.* TO liming2;  (全部授权)
    (7).查看指定用户的权限
    show  grants for <查看的用户名>;
    eg:show  grants for liming2;
    (8).查看本机用户的权限
     show  grants for root@localhost;
    (9).撤销指定用户权限
     REVOKE ALL PRIVILEGES ON 库名.表名 FROM 用户名;
    eg: REVOKE ALL PRIVILEGES ON *.* FROM liming2; 
    (10).删除用户
    DROP USER <用户名>;
    DROP USER liming2;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    1.创建用户并且指定密码
    在这里插入图片描述
    2.重命名用户名
    在这里插入图片描述
    3.授权
    在这里插入图片描述
    4.查看指定用户的权限
    在这里插入图片描述
    5.查看本机用户的权限
    在这里插入图片描述
    6.撤销用户的权限
    在这里插入图片描述
    7.删除用户
    在这里插入图片描述

    25.数据库用户管理(MySQL备份)

    1.为什么要备份?
    (1).保证重要的数据不丢失。
    (2).数据转移 A--->B
    2.MySQL数据库备份的方式:
    (1).物理备份(拷贝data)
    (2).使用命令行(cmd),
    (3).导出:
    命令行:
    mysqldump -h(主机名) -uroot -p密码 库名 表名1 表名2 >E:/a.sql;
    mysqldump -h(主机名) -uroot -p密码 库名  >E:/a.sql;
    eg:mysqldump -hlocalhost -uroot -p121788 demo1 student >E:/a.sql;
    (4).导入:
    sql语句:
    source 位置;
    source e:/a.sql;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    1.数据库的导出这里是引用
    在这里插入图片描述

    26.规范数据库设计(重点)

    1.为什么要规范数据库设计
    
    2.糟糕的数据库设计
    (1).数据冗余,浪费空间
    (2).数据插入和删除都会比较麻烦
    (3).程序的性能差
    3.良好的数据库设计
    (1).节省内存空间
    (2).保证数据库的完整性
    (3).方便我们开发系统
    4.软件开发中,关于数据库的设计
    (1).分析需求: 分析业务和需要处理的数据库的需求
    
     - [ ] 创建相应的表
    
    (2).概要设计: 设计关系图 E-R 图
    
     - [ ] 表与表之间的关系
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    27.数据库三大范式:

    1.为什么需要数据规范?
    (1).信息重复
    (2).更新异常
    (3).插入异常
    (4).删除异常
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1.第一范式(1NF):要求数据库表中的每一列都是不可分割的原子数据项;
    原子性:保证每一列不可以再分,
    
    • 1
    • 2

    1.其中地址那个东西概念比较模糊,还能继续再分这里是引用
    2.第一范式正确用法:字段不会再进行分割在这里插入图片描述

    2.第二范式(2NF): 满足第一范式,且确保表中的每一列都和主键相关。
    也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
    
    • 1
    • 2

    1.第二范式反列:(id和商品号称为联合主键)数据库的表应该进行拆分
    在这里插入图片描述
    2.我们应该把表的信息进行拆分为多张表
    在这里插入图片描述

    联合主键: 就是两个字段属性/多个字段属性作为主键
    (1).在创建表的同时添加联合主键:
    
    (2).创建表之后添加联合主键:
    alter table 表名 add primary key(列名1,列名2);
    eg: alter table information add primary key(id,goods_id);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.联合主键:(创建表之后再添加联合主键)
    在这里插入图片描述

    3.第三范式(确保每列都和主键列直接相关,而不是间接相关)《外键》
    (1.我们在一个表中,订单编号和商品编号应该分别设置成两张表,运用外键进行关联
    
    • 1
    • 2

    1.第三范式:(反列)这里是引用
    2.正列:
    在这里插入图片描述

    28.JDBC

    1.数据库驱动:
    驱动: 声卡,显卡。
    2.为什么要使用数据库驱动?
    (1).通过驱动实现应用程序和数据库的链接
    
    • 1
    • 2
    • 3
    • 4

    这里是引用

    2.什么是JDBC
    SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(Java数据库的)规范。俗称JDBC==(java database connection),这些规范的实现由厂商来做。
    (1).java.sql-jar
    (2).mysql-connction-jar
    
    • 1
    • 2
    • 3
    • 4

    这里是引用

    29.JDBC链接IDEA

    基本步骤:
    1.加载驱动
    2.地址,用户名,密码
    3.链接成功,数据库对象
    4.执行sql的对象  
    5.返回结果级 (链表的形式)
    7.释放连接
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    public class JDBC {
        public static void main(String[] args) {
            try {
                //1.加载驱动
                Class.forName("org.gjt.mm.mysql.Driver");
                //2.地址,用户名,密码 链接
                String url="jdbc:mysql://127.0.0.1:3306/demo1?useUnicode=true&characterEncoding=utf8&useSSl=true"; //支持中文编码,设置字符集 使用安全的链接
                String userName="root";
                String passWord="121788";
                //3.链接成功,数据库对象 connection 代表数据库
                Connection cn= DriverManager.getConnection(url,userName,passWord);
                //
                String sql="select *from information";
                //4.执行sql的对象   preparedStatement执行sql的对象
                PreparedStatement preparedStatement=cn.prepareStatement(sql);
                //5.返回结果级 (链表的形式)
                ResultSet resultSet = preparedStatement.executeQuery();
                //6.遍历
                while (resultSet.next()){
                    System.out.println(resultSet.getString(1)+" "+resultSet.getString(2)+" "+resultSet.getString(3));
                }
                //7.释放连接
                resultSet.close();
                preparedStatement.close();
                cn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    30.设置工具类(配置文件 Statement)

    1.设置配置文件: 在SRC包设置文件《db.properties》
    
    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=utf8&useSSL=true
    username=root
    password=121788
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2.设置一个工具类: 名字叫做 《informationUtils》
    
    package utils;
    
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    public class InformationUtils {
    //    提升作用域
        private static String driver=null;
        private static String url=null;
        private static String username=null;
        private static String password=null;
    //  第一个被运行,而且只能运行一次
        static {
            try{
    //            1.获取配置文件的输入流
                InputStream in = InformationUtils.class.getClassLoader().getResourceAsStream("db.properties");
    //            2.创建一个对象
                Properties properties = new Properties();
    //            3.读取输入字节流
                properties.load(in);
    //            4.获取文件里面的指定资源
                driver=properties.getProperty("driver");
                url=properties.getProperty("url");
                username=properties.getProperty("username");
                password=properties.getProperty("password");
    //            5.驱动只用加载一次
                Class.forName(driver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    //             6.获取链接
        public static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url,username,password);
        }
    //             7.释放连接
        public static void release(Connection connection, Statement statement, ResultSet resultSet){
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    这里是引用

    3.进行引用工具类(方法实现)
    
    package utils;
    
    import java.sql.*;
    
    public class TestUtils {
        public static void main(String[] args) {
    //        增加变量的作用域
            Connection connection=null;
            Statement statement=null;
            ResultSet resultSet=null;
            try {
    //            1.链接
                connection=InformationUtils.getConnection();
    //            2.获得执行sql的对象
                statement=connection.createStatement();
                String sql="insert into information values (4,'004','小黑',2,'个',2032,'李威涛','吉林',1235)";
                int i=statement.executeUpdate(sql);
                if(i>0){
                    System.out.println("插入成功");
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                InformationUtils.release(connection,statement,resultSet);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    这里是引用

    31.SQL注入问题(用户信息不安全)

    SQL注入的发生,通常是恶意用户通过在表单中填写包含SQL关键字的数据,来使数据库执行非常规逻辑的过程。
    
    • 1
    1.当我们使用Statement这个对象的时候,我们在数据导入的时候可能会存在SQL注入
    的问题,也就是说sql语句进行重新修改的问题.
    
    • 1
    • 2
    package utils;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class SQL {
        public static void main(String[] args) {
    //        1.正常登入
    //        login("李明","121788");
    
            login("'or '1=1","'or ' 1=1");
    //        login("'or 1 #'","2");
    //
        }
        public static void login(String username,String password){
            //        增加变量的作用域
            Connection connection=null;
            Statement statement=null;
            ResultSet resultSet=null;
            try {
    //            1.链接
                connection=InformationUtils.getConnection();
    //            2.获得执行sql的对象
                statement=connection.createStatement();
    //            select *from admin where name= or 1=1 and password= or 1=1;
                String sql="select *from admin where `name`='"+username+"' and `password`='"+password+"'";
               resultSet=statement.executeQuery(sql);
                while (resultSet.next()){
                    System.out.println(resultSet.getInt(1)+" "+resultSet.getString(2)+" "+resultSet.getString(3));
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {
                InformationUtils.release(connection,statement,resultSet);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    1.实现对用户信息的全部查询的效果,导致用户信息的泄露(MD5)加密有用处了。这里是引用

    32.PreparedStatement

    1.Statement与PreparedStatement的区别:
    ()、格式:
    (1).前者: 驱动. 链接 .创建语句(createStatement) . 创建 sql语句.sql语句放入执行语句中.
    (2).后者: 驱动. 链接. 创建sql语句. sql语句放入preparedStatemnt(预编译).  进行执行.
    ()、 进行插入和删除的时候:
    (1).前者直接写即可
    (2).后者需要用?当占位符,然后进行 preparedStatemenr.setObject(?的坐标,数据)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.进行查询的操作这里是引用

    package lesson2;
    
    import utils.InformationUtils;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class preST {
        private static Connection connection=null;
       private static PreparedStatement preparedStatement=null;
       private static ResultSet resultSet=null;
        public static void main(String[] args) {
            try {
    //            1.链接
                connection= InformationUtils.getConnection();
    //
                String sql="insert into admin value (?,?,md5(?))";
                preparedStatement=connection.prepareStatement(sql);
                preparedStatement.setInt(1,4);
                preparedStatement.setString(2,"小明");
                preparedStatement.setString(3,"123456");
                int n= preparedStatement.executeUpdate();
                if(n>0){
                    System.out.println("插入成功");
                }
    
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }finally {
                InformationUtils.release(connection,preparedStatement,resultSet);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    2.使用md5格式进行密码的加密的操作:
    在这里插入图片描述
    在这里插入图片描述

    3.解决SQL注入的问题:
    1.正常输入无问题在这里插入图片描述
    2.非正常输入
    在这里插入图片描述

    33.数据库连接池(用户访问数量限制)

    ()、为什么要进行数据库连接池
    1.数据库链接十分浪费资源。
    ()、什么是池化技术:
    池化技术: 准备一些预先的资源,过来就链接预先准备好的。
    eg:银行每天需要接纳很多客人,那么银行的门不能来一个开一次,走一个关一次,
    所以我们因该设置接纳员进行等待,等待用户的到来,进行接纳。所以我们要设置
    接纳员的个数,(最小连接数)(最多连接数)(常用连接数)
    ()、编写连接池 实现一个接口DataSource(数据源)
    (1).常见开源数据库连接池:DBCP.C3P0.
    (2).使用了这些数据库连接池之后,我们就不用再进行手动编写了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1.DBCP (连接池)
    
    
    • 1
    • 2
  • 相关阅读:
    探索 Material 3:全新设计系统和组件库的介绍
    【注入电子邮件】SMTP命令漏洞查找、注入、防止
    Android webView加载高德地图定位不显示问题
    EasyCVR平台海康摄像头语音对讲功能配置的3个注意事项
    前端工作总结213-实现分页秀呀
    前后端数据交互设计到的跨域问题
    gRPC(一)入门:什么是RPC?
    MySQL的基本用法
    iOS脱壳之frida-ios-dump
    【二】2D测量 Metrology——read_metrology_model()算子
  • 原文地址:https://blog.csdn.net/qq_69683957/article/details/127599308