三大范式
数据库的范式:是设计数据库一种规范要求,每一个范式呈递次规范;
第一范式1NF:数据库表中每一列是不可在拆分的原子性,不能出现复合列!(集合数据)
第二范式2NF:在1NF基础上,每一张表描述一件事情;非主键字段完全依赖于主键字段;
第三范式3NF:在2NF基础上,非主键字段和主键字段不能产生传递依赖,使用外键约束来操作数据库的三大范式
1NF:数据库表中的每一列不可在拆分的原子数据项,必须独立的列;
2NF:在1NF基础上,数据库表中非主键字段必须完全依赖于主键字段,完全依赖是指不能存在仅依赖主键一部分的列。
3NF:在2NF基础上,任何非主列不得传递依赖于主键。
举例:
1NF:
员工表每个员工只有一个员工ID,只有一个姓名,一个性别,只属于一个部门,但是在我们的实际生活中,每个人真的只有一个联系电话吗?这里是假设最少的情况,每个人都有个人电话和家庭电话,那么联系电话这一字段就是可再分的。这张表的结构设计就没有达到第一范式。
解决方案:把联系电话这一字段分为个人电话字段和家庭电话字段,就完全符合了第一范式
事务
事务:是关系型数据库的一种机制: 当批量操作sql或者多张表同时操作(update,inseret into,delete),这些语句的执行要么同时执行成功,要么同时执行失败;当执行成功了,将事务提交,直接影响数据的记录数;当执行失败,需要回滚事务;
应用场景:
在某些业务中,同时操作(update,inseret into,delete)多张表的时候(同时执行多个sql),就需要开启事务,否则在执行多个sql中如果出现异常,一部分成功,一部分失败,就会导致数据紊乱!
举例:
提交订单----->生成订单---给order以及order_item都需要插入数据
订单表 order
订单项表 order_item
商品表 product
数据库事务的特点以及隔离级别
事务的特点:ACID
原子性:针对数据的操作要么同时成功,要么同时失败
一致性:数据的操作前后数据总量不变的
隔离性:事务就是管理业务操作,业务和业务独立,那么事务和事务是互相不影响的,是分离!
持久性:针对数据的操作,如果提交事务了,即使关机,数据永久保存!
事务的隔离级别:
read uncommitted; 读未提交
read committed ;读已提交
repeatable read ;可重复读,有效防止脏读以及不可重复读 (mysql的默认隔离级别)
serializable ; 串行化(序列化) 隔离级别最高,安全性最高,效率最低!
jdbc本质
Java数据库连接,java可以操作各种关系型数据库
本质就是一个普通的java类,数据库厂商提供的驱动jar包,来实现sun公司提供一套"应用程序接口规范"
java.sql.Drvier 驱动接口
java.sql.DriverManager:驱动管理类(管理jdbc的驱动服务)
java.sql.Connection:与特定数据库的一种会话连接
java.sql.Statement:执行静态sql语句 (执行对象,操作数据库)
JDBC的基本操作步骤
jdbc原生7大操作步骤 入门
1)注册驱动
2)获取数据库的连接对象
3)准备好的sql语句
4)获取数据库的执行对象---执行sql语句
5)数据库的执行对象 去操作数据库
6)返回结果
7)释放资源
public class JdbcDemo {
public static void main(String[] args) throws Exception {
//1)导包并且注册驱动
Class.forName("com.mysql.jdbc.Driver") ;
//mysql5.1以上5.7以下 的jar包"com.mysql.jdbc.Driver"
//mysql8.0的jar包 "com.mysql.cj.jdbc.Driver"
//2)获取数据库的连接对象
//java.sql.DriverManager:里面有静态方法获取数据库连接对象
// public static Connection getConnection(String url, //统一资源定位符
// String user, // 当前mysql的用户名 root 用户
// String password)throws SQLException //当前mysql的登录密码
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/myee_2203_02",//库名
//使用的mysql驱动包5.7以上包括5.7以及8.0的包
//"jdbc:mysql://localhost:3306/myee_2203_02? characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"
"root",
"root"
);//alt+enter键 :补全代码
//3)准备好的sql语句
String sql = "insert into accout(name,balance) values('园园',1000)";
//4)获取数据库的执行对象---执行sql语句
//通过连接对象获取 Connection--- Statement createStatement():创建执行对象,准备将sql发送数据库
Statement stmt = conn.createStatement();
//5)数据库的执行对象 去操作数据库
//Statement--->int executeUpdate(String sql)
int count = stmt.executeUpdate(sql);
//6)返回结果
System.out.println("影响了"+count+"行");
//7)释放资源
stmt.close();
conn.close();
}
}