目录
发布成功 (csdn.net) :上半部分 (基础)
28、事务ACID原则、脏读、不可重复读
- 事务原则:ACID
- 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency)
事务前后数据的完整性必须保持一致。
- 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
- 隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 隔离产生的问题:
- 脏读:
- 不可重复读
- 虚读
29、测试事务实现转账
mysql默认自动开启事务:
事务执行过程:
一组事务的提交:(回滚后回到上一次提交的状态)
30、索引介绍及索引的分类
- MysQL官方对索引的定义为:索引(ndex)是帮助MySQL高效获取数据的数据结构。提取句子主千,就可以得到索引的本质:索引是数据结构。
- 索引分类:
- 主键索引 primary key(不可重复,只能有一个列为主键)
- 唯一索引 UNIQUE KEY (避免重复列出现,多个列都可标识为唯一索引)
- 常规索引 KEY/INDEX (默认的)
- 全文索引 FullText(特定数据库引擎才有,目的也是快速定位数据)
基础语法:
31、SQL编程创建100万条数据测试索引
写一个函数
结果(55s):
创建索引后,搜索时间缩短到毫秒级别:
32、索引原则和明日安排
- 经常变动的数据不加索引
- 数据量较小没有必要加索引
索引数据结构:
INNODB默认btree,
了解底层原理:CodingLabs - MySQL索引背后的数据结构及算法原理
33、数据库用户管理
权限管理:
34、MySQL备份
方式:
- 直接物理备份文件
- 在sqlyog里手动导出
- 命令行 mysqldump导出
导入:
35、如何设计一个项目的数据库
bbs论坛系统、crm管理系统、blog博客系统
36、数据库的三大范式
数据规范化:避免 信息重复、更新异常、插入异常
- 1NF:每一个字段都要是不可分的原子项
- 2NF:满足1NF,且每张表只描述一件事情
- 3NF:在2NF上消除传递依赖
- 规范性和性能不可兼得:
37、数据库驱动和JDBC
数据库驱动:
java.sql
javax.sql
38、第一个JDBC程序
useSSL在sql版本高于connect时候应该改为false:
SHOW CREATE DATABASE dbestudy;
/*
CREATE DATABASE `dbestudy`
/*!40100 DEFAULT CHARACTER SET utf8mb3 */
/*!80016 DEFAULT ENCRYPTION='N'
*/
SHOW CREATE TABLE users
CREATE TABLE `users` (
`id` INT NOT NULL,
`NAME` VARCHAR(40) DEFAULT NULL,
`PASSWORD` VARCHAR(40) DEFAULT NULL,
`email` VARCHAR(60) DEFAULT NULL,
`birthday` DATE DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb3
package com.xinge.learning01;
import java.sql.*;
//jdbc测试程序
public class JdbcTest01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//创建信息
String url = "jdbc:mysql://localhost:3306/dbestudy?useUnicode=true&characterEncoding=utf8&useSSL=false";
String name = "root";
String password = "31415926xG";
//连接数据库对象
Connection connection = DriverManager.getConnection(url,name,password);
//执行对象
Statement statement = connection.createStatement();
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"));
}
//释放
resultSet.close();
statement.close();
connection.close();
}
}
39、JDBC中对象解释
40、Statement对象详解
40、Statement对象详解_哔哩哔哩_bilibili
41、SQL注入问题
SQL存在漏洞,可能被攻击 ,sql会被拼接
42、PreparedStatement对象
这个对象不会被拼接,可以避免sql注入问题,而且效率更高
43、使用IDEA连接数据库
44、JDBC操作事务
如果失败默认回滚,没有必要显式定义
45、DBCP-C3P0连接池
- 数据库连接-释放十分浪费资源,可以预先准备资源,后面直接连接准备好的资源
- 最小连接数一般设置为最小连接数,业务最高承载上限是最大连接数,超过最大连接的等待,
- DataSource接口
- 开源数据源实现(DBCP、C3P0,Druid阿里巴巴),使用此方法就不用手写代码连接数据库了
- DBCP加入jar包:
- C3P0导入jar包:
DBCP实例:
测试类: