Day25 2021.4.11 MySQL下

本文详细介绍了数据库的联表查询、自连接、分页和排序、子查询和嵌套查询等操作,强调了事务的ACID原则以及如何在MySQL中实现事务。此外,还探讨了索引的分类和作用,以及数据库设计规范,包括三大范式。最后,讲解了JDBC的基础知识,包括Statement对象和PreparedStatement对象的使用,以及如何防止SQL注入。
摘要由CSDN通过智能技术生成

Day25 2021.4.11

1.联表查询(JOIN)

1.1自连接

自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

操作:查询父类对应的子类关系

CREATE TABLE category (
	categoryid INT(10) UNSIGNED NOT NULL auto_increment COMMENT '主题ID',
	pid INT(10) NOT NULL COMMENT '父ID',
	categoryName VARCHAR(50) NOT NULL COMMENT '主题名字',
	PRIMARY KEY(categoryid)
) ENGINE=INNODB auto_increment=9 DEFAULT CHARSET = utf8;

INSERT INTO category(categoryid,pid,categoryName)
VALUES('2','1','信息技术'),('3','1','软件开发'),('4','3','数据库'),
('5','1','美术设计'),('6','3','web开发'),('7','5','PS技术'),('8','2','办公信息');
SELECT a.`categoryName` AS '父栏目'
,b.`categoryName` AS '子栏目'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.pid

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QSq8clRf-1618197532091)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411110208903.png)]

1.2联表查询练习

-- 查询学院所述的年级(学号、姓名、年级名称)
SELECT studentNo,studentName,`GradeName`
FROM student s
INNER JOIN `grade` g
ON s.`gradeid` = g.`gradeid`

-- 查询科目所属的年级(科目名称,年级名称)
SELECT `subjectName`,`gradeName`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.`gradeid` = g.`gradeid`

select语法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PkGPuLYk-1618197532092)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411110906860.png)]

-- 查询不同课程的平均分,最高分,最低分
-- 核心:(根据不同课程分组)
SELECT `subjectname`,AVG(studentresult),MAX(studentresult),MIN(studentresult)
FROM result r
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
GROUP BY r.studentno -- 通过什么字段分组
HAVING AVG(studentresult)>80 -- 过滤

1.3 分页和排序

-- ================分页limit 和排序 order by =============
-- 排序:升序 ASC 降序 DESC
-- order by 通过哪个字段排序 升序或降序

-- 分页
-- 网页应用
-- 语法:limit 起始值,页面大小
-- limit 0,5  1~5

语法:limit(下标大小,pageSize)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fv2pIUhr-1618197532095)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411111617702.png)]

-- 查询JAVA第一学年 课程成绩排名前十的学生,并且分数要大于80的学生信息(学号、姓名、课程名称、分数)
SELECT `studentNo`,`studentNaem`,`studentResult`,`subjectName`
FROM `student` s
INNER JOIN `result` r
ON s.studentNo = r.studentNo
INNER JOIN `subject` sub
ON sub.subjectNo = r.subjectNo
WHERE subjectName = 'JAVA第一学年' AND studentResult>=80
ORDER BY studentResult DESC
LIMIT 0,10

1.4子查询和嵌套查询

where(这个值是计算出来的)

本质:再where语句中嵌套一个子查询语句

where(select * from)

-- ===================WHERE======================
-- 1.查询数据库结构-1 的所有考试结果(学号、科目编号、成绩),降序排列
-- 方式一:使用连接查询
SELECT `studentNo`,r.`subjectNo`,`studentResult`
FROM 	`result` r
INNER JOIN `subject` sub
ON r.studentno = sub.subjectno
WHERE subjectname='数据库-1'
ORDER BY studentresult DESC
 
-- 方式二:使用子查询
SELECT `studentNo`,r.`subjectNo`,`studentResult`
FROM 	`result` r
WHERE studentNo = (
	SELECT `subjectNo` 
	FROM `subject` 
	WHERE `subjectName`='数据库结构-1'
)
ORDER BY studentresult DESC

2.MySQL函数

2.1 常用函数

-- ====================常用函数========================
-- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING(8.1) -- 向上取整 
SELECT FLOOR(9.4)  -- 向下取整
SELECT RAND() -- 随机数0-1
SELECT SIGN(-2) -- 判断一个参数的符号  负数返回-1  正数返回1   0返回0

-- 字符串函数
SELECT CHARACTER_LENGTH('25646')  -- 返回字符串的长度
SELECT CONCAT('我','爱','你们') -- 拼接字符串
SELECT `INSERT`('我爱',1,2,'超级热爱') -- 查询替换
SELECT LOWER('asdadSAD') -- 大写字母
SELECT UPPER('asdadSAD') -- 小写字母
SELECT INSTR('ada','a') -- 返回第一次出现的字串的索引
SELECT REPLACE('坚持就能成功','坚持','努力') -- 替换出现的指定字符
SELECT SUBSTR('sdasdaf',4,2) -- 返回指定的字符串
SELECT REVERSE(str) -- 反转

-- 查询姓周的同名 名 绉
SELECT `REPLACE`(studentname,'周','绉') FROM student
WHERE studentName LIKE '周%'

-- 时间和日期函数
SELECT `CURRENT_DATE`() -- 获取当前日期
SELECT CURDATE() -- 获取当前日期
SELECT NOW() -- 获取当前的时间
SELECT `LOCALTIME`() -- 本地时间
SELECT SYSDATE() -- 系统时间
SELECT `YEAR`(NOW()) -- 年

-- 系统
SELECT `USER`() -- 系统用户
SELECT SYSTEM_USER()
SELECT VERSION() -- 版本号

2.2聚合函数

函数名称描述
count()计数
sum()求和
avg()平均值
max()最大值
min()最小值
-- ====================聚合函数========================
-- 都能够统计表中的数据
SELECT COUNT(studentname) FROM student; -- count(字段),忽略所有的null值
SELECT COUNT(*) FROM student; -- count(*),不会忽略null值 本质 计算行数
SELECT COUNT(1) FROM student; -- count(1),不会忽略null值 本质 计算行数 效率比*更快

-- 查询不同课程的平均分,最高分,最低分
-- 核心:(根据不同课程分组)
SELECT `subjectname`,AVG(studentresult),MAX(studentresult),MIN(studentresult)
FROM result r
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
GROUP BY r.studentno -- 通过什么字段分组
HAVING AVG(studentresult)>80 -- 过滤

2.3 数据库级别的MD5加密

MD5消息摘要算法是一种被广泛使用的密码散列函数,可以产生出一个128位的散列值,用于确保信息传输完整一致。

MD5不可逆,具体的值的md5是一样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRLO4xtm-1618197532098)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411125513535.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AO0gihon-1618197532103)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411125711330.png)]

3.事务

3.1 什么是事务

要么都成功,要么都失败

将一组SQL放在一个批次中去执行

事务原则:ACID原则 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

  • 事务的原子性(Atomicity)是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成。
  • 事务的一致性(Consistency)是指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
  • **隔离性(Isolation)😗*事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致。(脏读:一个事务读取了一个事务未提交的数据、不可重复读:多次读取的结果不同、幻读:在一个事务内读取到了别的事务插入的数据,导致前后读取结果不一致)
  • **持久性(Durability)😗*事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。

3.2 事务实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r8vk1e9X-1618197532106)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411131605836.png)]

-- ==================事务========================
-- mysql 是默认开启事务自动提交的
SET autocommit = 0 /*关闭自动提交*/
SET autocommit = 1 /*开启自动提交(默认的)*/

-- 手动处理事务
SET autocommit = 0 /*关闭自动提交*/
-- 事务开启
START TRANSACTION --标记一个事务开始
INSERT xx 
INSERT xx

-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK
-- 事务结束
SET autocommit = 1 /*开启自动提交(默认的)*/

SAVEPOINT 保存点名称 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到指定保存点
RELEASE SAVEPOINT 保存点名 -- 撤销保存点

创建表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XaRnrwQE-1618197532108)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411131826729.png)]

插入表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nsVYTFEl-1618197532110)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411131859175.png)]

模拟转账:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MMSdkbX9-1618197532117)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411132013760.png)]

4.索引

4.1 索引的分类

索引是帮助MySQL高效获取数据的数据结构。

  • 主键索引 PRIMARY KEY
    • 唯一的标识,主键不可重复,只能有一个列作为主键
  • 唯一索引 UNIQUE KEY
    • 避免重复的列出现,可以重复
  • 常规索引 KEY/INDEX
    • 默认的 index 或 key
  • 全文索引 FullText
    • 在特定的数据库引擎下才有
    • 快速定位数据

4.2 索引使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cAVGyZeh-1618197532120)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411133057985.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pl1J8H0K-1618197532122)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411133342841.png)]

CREATE TABLE `app_user` (
	`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(50) DEFAULT '',
	`eamil` VARCHAR(50) NOT NULL,
	`phone` VARCHAR(20) DEFAULT '',
	`gender` TINYINT(4) UNSIGNED DEFAULT '0',
	`password` VARCHAR(100) NOT NULL DEFAULT '',
	`age` TINYINT(4) DEFAULT NULL,
	`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
	`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8-- 插入100万数据.
SET GLOBAL log_bin_trust_function_creators=1; -- 开启创建函数功能
/*
  第一个语句 delimiter 将 mysql 解释器命令行的结束符由”;” 改成了”$$”,
  让存储过程内的命令遇到”;” 不执行
*/
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
	DECLARE num INT DEFAULT 1000000;
	DECLARE i INT DEFAULT 0;
	WHILE i<num DO
		INSERT INTO `app_user`(`name`,`eamil`,`phone`,`gender`)
		VALUES(CONCAT('用户',i),'19224305@qq.com','123456789',FLOOR(RAND()*2));
		SET i=i+1;
	END WHILE;
	RETURN i;
END;
SELECT mock_data()$$ -- 执行此函数 生成一百万条数据

SELECT * FROM app_user WHERE `name`='用户9999'; -- 0.993 sec
EXPLAIN SELECT * FROM app_user WHERE `name`='用户9999';
-- id_表名_字段名
-- CREATE INDEX 索引名 on 表(字段)
CREATE INDEX id_app_user_name ON app_user(`name`);
SELECT * FROM app_user WHERE `name`='用户9999'; -- 0.001 sec
EXPLAIN SELECT * FROM app_user WHERE `name`='用户9999';

索引在小数据量的时候,用户不大,在大数据的时候用处很明显

4.3 索引原则

  • 索引不是越多越好
  • 不要对进程变动数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加载常用来查询的字段上

索引的数据结构:

Hash类型的所有

BTree:InnoDB的默认数据结构

5.权限管理

5.1用户管理

可视化管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0RpVNPOs-1618197532124)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411142113724.png)]

SQL命令操作

用户表:mysql.user

-- 创建用户 CREATE USER用户名 IDENTIFIED BY '密码'
CREATE USER hong IDENTIFIED BY '123456'

-- 修改密码(修改当前用户密码)
SET PASSWORD = `PASSWORD`('123456789')
-- 修改密码(修改指定用户密码)
SET PASSWORD FOR hong = `PASSWORD`('123456789')

-- 重命名
RENAME USER hong TO hong1

-- 用户授权 ALL PRIVILEGES 全部的权限
GRANT ALL PRIVILEGES ON *.* TO hong1

-- 查询权限
SHOW GRANTS FOR hong1 -- 查看指定用户的权限
SHOW GRANTS FOR root@localhost -- 查看指定用户的权限

-- 撤销权限
REVOKE ALL PRIVILEGES ON *.* FROM hong1

-- 删除用户
DROP USER hong1

5.2MySQL备份

  • 保证重要数据不丢失
  • 数据转移

备份的方式:

  • 直接拷贝物理文件
  • 在可视化工具中手动导出
  • 使用命令行 mysqldump 命令行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y763aakg-1618197532125)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411143411967.png)]

  • 导入 在登录的情况下 source导入文件

6.规范数据库设计

6.1为什么要规范

当数据库比较复杂的时候,我们就需要设计

糟糕的数据库设计:

  • 数据冗余,浪费空间
  • 数据库插入和删除都会麻烦、异常
  • 程序性能差

良好的数据库设计:

  • 节省内存空间
  • 保证数据库的完整性
  • 方便我们开发系统

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

  • 分析需求:分析业务和需求处理的数据库的需求
  • 概要设计:设计关系图 E-R图

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

  • 手机信息,分析需求

    • 用户表(用户登录注销,用户的个人信息,写博客,创建分类)
    • 分类表(文章分类,谁创建的)
    • 评论表(评论)
    • 文章表(文章信息)
    • 友链表(友情链接)
    • 自定义表(系统信息等)
    • 说说表(发表心情等)
  • 标识实体(把需求落地到每个字段)

    • 用户表

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83uaxv59-1618197532129)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411150446721.png)]

    • 分类表

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QwAznstp-1618197532130)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411150607472.png)]

    • 文章表

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bSusJJyb-1618197532131)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411150816718.png)]

    • 评论表

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LRxADQ7V-1618197532133)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411151005893.png)]

    • 友链表

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7SWENdCL-1618197532134)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411151059965.png)]

    • 粉丝表

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8GTxiPT-1618197532134)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411151345737.png)]

  • 标识实体之间的关系

    • 写博客:user–>blog
    • 创建分类:user–>category
    • 关注:user–>user
    • 友链:links
    • 评论: user–>user–>blog

博客,客户端,论坛等

6.2 三大范式

为什么需要数据规范化?

  • 信息重复
  • 更新异常
  • 插入异常
  • 删除异常

三大范式

https://blog.csdn.net/Cat_likeFishs/article/details/79440698

  • 第一范式(1NF)

    满足原子性

  • 第二范式(2NF)

    前提:满足第一范式

    每张表只描述一件事情

  • 第三范式(3NF)

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

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

规范性和性能的问题:

关联查询的表不得超过三张表

  • 考虑商业化的需求和目标,数据库的性能更加重要

7.JDBC

7.1数据库驱动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpfNtzUL-1618197532135)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411153056877.png)]

7.2 JDBC

sun公司为了简化开发人员的操作,提供了一个规范,俗称JDBC

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lu6eZrKA-1618197532136)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210411153242620.png)]

java.sql和javax.sql

还需要导入一个数据库驱动

7.3 第一个JDBC程序

创建测试数据库

CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci;

USE jdbcStudy;

CREATE TABLE `users`(
	id INT PRIMARY KEY,
	NAME VARCHAR(40),
	PASSWORD VARCHAR(40),
	email VARCHAR(60),
	birthday DATE
);

INSERT INTO `users`(id,NAME,PASSWORD,email,birthday)
VALUES(1,'zhansan','123456','zs@sina.com','1980-12-04'),
(2,'lisi','123456','lisi@sina.com','1981-12-04'),
(3,'wangwu','123456','wangwu@sina.com','1979-12-04')

1.加载驱动 Class.forName(“com.mysql.jdbc.Driver”);

2.连接数据库 DriverManager.getConnection

3.获得执行sql的对象 connection.createStatement();

4.获得返回的结果集

5.释放连接

package com.hong.JDBC.Day025.Demo01;

import java.sql.*;

//我的第一个JDBC程序
public class Demo01 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");//固定写法
        //2.用户信息和url
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSl=true";
        String username = "root";
        String password = "root";
        //3.连接成功,数据库对象 connection
        Connection connection = DriverManager.getConnection(url, username, password);
        //4.执行SQL对象 statement
        Statement statement = connection.createStatement();
        //5.执行SQL对象去执行SQL
        String sql = "SELECT * FROM users";
        ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封住了所有的结果
        while (resultSet.next()){
            System.out.println("id=" + resultSet.getObject("id"));
            System.out.println("name=" + resultSet.getObject("NAME"));
            System.out.println("pwd=" + resultSet.getObject("PASSWORD"));
            System.out.println("email=" + resultSet.getObject("email"));
            System.out.println("birth=" + resultSet.getObject("birthday"));
        }
        //6.释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

statement SQL对象操作

statement.execute(); //操作任何SQL
statement.executeQuery(); //查询操作返回 ResultSet
statement.executeUpdate(); //更新、插入、删除都是用这个,返回受影响的行数

resultSet 操作

resultSet.getObject();//获得Object类型的数据
resultSet.beforeFirst();//移动到最前面
resultSet.afterLast();//移动到最后面
resultSet.next();//移动到下一个数据
resultSet.previous();//移动到前一行
resultSet.absolute();//移动到指定行

释放资源

resultSet.close();
statement.close();
connection.close();

7.4 statement对象

Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,执行完后将会返回一个整数(即导致了数据库几行数据发生了变化)

statement.executeQuery方法用于向数据库发送查询语句,返回代表查询结果的ResultSet对象

7.4.1 CRUD操作-create

使用executeUpdate(String sql)方法完成数据添加操作:

Statement st = conn.createStatement();
String sql = "insert into user(...) values(...)";
int num = st.executeUpdate(sql);
if(num>0){
    System.out.println("插入成功!");
}

7.4.2 CRUD操作-delete

使用executeUpdate(String sql)方法完成数据删除操作:

Statement st = conn.createStatement();
String sql = "delete from user where id=1";
int num = st.executeUpdate(sql);
if(num>0){
    System.out.println("删除成功!");
}

7.4.3 CRUD操作-update

使用executeUpdate(String sql)方法完成数据修改操作:

Statement st = conn.createStatement();
String sql = "update user set name='' where name=''";
int num = st.executeUpdate(sql);
if(num>0){
    System.out.println("修改成功!");
}

7.4.4 CRUD操作-read

使用 executeUpdate (String sql)方法完成数据查询操作:

Statement st = conn.createStatement();
String sql = "select * from user where id=1";
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
    //根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
}

7.4.5 修改配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cN3IS1nQ-1618197532136)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210412102316255.png)]

7.5 SQL注入问题

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1]比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击

public class Demo02 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        // login("hong","123456");
        login("`or`1=1","123456");
    }

    //登录业务
    public static void login(String username,String password) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");//固定写法
        //2.用户信息和url
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSl=true";
        String username1 = "root";
        String password1= "root";
        //3.连接成功,数据库对象
        Connection connection = DriverManager.getConnection(url, username1, password1);
        //4.执行SQL对象
        Statement statement = connection.createStatement();
        //5.执行SQL对象去执行SQL
        String sql = "select * from user where `Name` = `"+username+"` AND `password` = `"+password+"`";
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()){
            //遍历结果
        }
        //6.释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }

7.6 PreparedStatement 对象

PreparedStatement 对象可以防止SQL注入,效果更好

public class text1 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");//固定写法
        //2.用户信息和url
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSl=true";
        String username1 = "root";
        String password1= "root";
        //3.连接成功,数据库对象
        Connection connection = DriverManager.getConnection(url, username1, password1);
        //区别
        String sql = "insert into users(id,'NAME','PASSWORD','email',`birthday`) value(?,?,?,?,?)";
        PreparedStatement pst = connection.prepareStatement(sql);//预编译sql,先写sql,然后不执行
        //手动给参数赋值
        pst.setInt(1,4);//id
        pst.setString(2,"chen");//name
        pst.setString(3,"123456");//password
        pst.setString(4,"1354..@qq.com");//email
        pst.setDate(5,new java.sql.Date(new Date(1).getTime()));//brithday

        int i = pst.executeUpdate();
        if (i>0){
            System.out.println("插入成功");
        }
    }

7.7 使用ideal连接数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2enQ6VC-1618197532138)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210412105355186.png)]

7.8 事务

要么都成功,要么都失败

事务原则:ACID原则 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

  • **事务的原子性(Atomicity)**要么全部完成,要么都不完成
  • **事务的一致性(Consistency)**总数不变
  • **隔离性(Isolation)**多个进程互不干扰
  • **持久性(Durability)**一旦提交不可逆,持久化到数据库
public class text1 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");//固定写法
        //2.用户信息和url
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSl=true";
        String username1 = "root";
        String password1= "root";
        //3.连接成功,数据库对象
        Connection connection = DriverManager.getConnection(url, username1, password1);

        //关闭数据库的自动提交,自动会开启事务
        connection.setAutoCommit(false);//开启事务
        //区别
        String sql = "insert into users(id,'NAME','PASSWORD','email',`birthday`) value(?,?,?,?,?)";
        PreparedStatement pst = connection.prepareStatement(sql);//预编译sql,先写sql,然后不执行
        //手动给参数赋值
        pst.setInt(1,4);//id
        pst.setString(2,"chen");//name
        pst.setString(3,"123456");//password
        pst.setString(4,"1354..@qq.com");//email
        pst.setDate(5,new java.sql.Date(new Date(1).getTime()));//brithday

        int i = pst.executeUpdate();
        if (i>0){
            System.out.println("插入成功");
        }

        //业务完毕提交事务
        connection.commit();
        System.out.println("成功!");
        //如果失败则回滚
        connection.rollback();
        //关闭连接
    }
}

7.9 DBCP-C3P0连接池

数据库连接—执行完毕—释放

连接—释放 十分浪费系统资源

池化技术:准备一些预先的资源,过来就连接预先准备好的

最小连接数:常用连接数

最大连接数:业务最高承载上限

等待超时:100ms

编写连接池,实现一个接口 DateSource

开源数据源实现

DBCP

C3P0

Druid:阿里巴巴

使用了这些数据库之后,我们在项目开发中就不需要编写连接数据库的代码了

sql:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aEWalbao-1618197532138)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210412111215038.png)]

DBCP配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdiJSgRJ-1618197532138)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210412111321695.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MADiIBt1-1618197532140)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210412111549211.png)]

https://www.bilibili.com/video/BV1NJ411J79W?p=45&spm_id_from=pageDriver

.setDate(5,new java.sql.Date(new Date(1).getTime()));//brithday

    int i = pst.executeUpdate();
    if (i>0){
        System.out.println("插入成功");
    }

    //业务完毕提交事务
    connection.commit();
    System.out.println("成功!");
    //如果失败则回滚
    connection.rollback();
    //关闭连接
}

}


## 7.9 DBCP-C3P0连接池

数据库连接---执行完毕---释放

连接---释放 十分浪费系统资源

**池化技术:准备一些预先的资源,过来就连接预先准备好的**

最小连接数:常用连接数

最大连接数:业务最高承载上限

等待超时:100ms

编写连接池,实现一个接口 DateSource

> 开源数据源实现

DBCP

C3P0

Druid:阿里巴巴

使用了这些数据库之后,我们在项目开发中就不需要编写连接数据库的代码了

> sql:

[外链图片转存中...(img-aEWalbao-1618197532138)]

> DBCP配置文件

[外链图片转存中...(img-zdiJSgRJ-1618197532138)]

[外链图片转存中...(img-MADiIBt1-1618197532140)]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值