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)]