1.前一天重点内容复习
数据库的三大范式
第一范式(1NF):表中每一列不可分割
第二范式(2NF):在满足1NF的基础上,表中非主键字段完全依赖于主键
第三范式(3NF):在满足2NF的基础上,非主键字段不能产生传递依赖
多表查询
内连接:
隐式内连接
SELECT 字段列表 FROM 表名1,表名2 WHERE 表名1的某个字段 = 表名2的某个字段
显式内连接
SELECT 字段列表 FROM 表名1 INNER JOIN 表名2 ON 连接条件
外连接:
左外连接查询
SELECT 字段列表 FROM 左表 LEFT OUTER JOIN 右表 ON 连接条件
右外连接查询
SELECT 字段列表 FROM 左表 RIGHT OUTER JOIN 右表 ON 连接条件
子查询
聚合函数加上集合比较运算符
使用in集合数据
将查询结果作为虚表和其他表连接
数据库备份和还原的命令行方式
备份:打开命令提示行窗口输入:mysqldump -u用户名 -p密码 库名 > sql文件路径
还原:新建库并且使用,之后输入source sql文件路径,回车即可
获取类字节码文件方式
通过使用Object类中的getClass()方法
对象.getClass()
任意java类型的class属性可以获取
类名.class
反射的静态功能forName
public static Class forName(String pathname)
pathname为当前类的全限定名称(包名.类名)
如何读取src目录下的资源文件
类名.class.getClassLoader().getResourceAsStream("文件名");
2.虚表连接其他表查询
将查询结果作为一个表,起一个表名与其他表进行连接
3.数据库事物
概念:实际的业务操作,用户的单个行为,可能要同时操作多个表或者多个sql语句,要么同时成功执行,要么同时失败
特点:
传统事物ACID
原子性:该事物是一个整体,要么同时执行成功,要么同时执行失败
一致性:事物操作前后总量不变, 只是发生转移
隔离性:事物和事物之间是独立的,不能相互影响
持久性:如果开启并且提交事物之后,对数据的修改永久改变
操作事物流程
开启事物:START TRANSACTION;
开启事物之后,将命令由自动提交改为手动提交
SELECT @@AUTOCOMMIT; 1为自动提交,2为手动提交
进行添加,删除,修改操作:UPDATE;/DELETE;/INSERT;...
如果执行成功,则手动提交事物:COMMIT;
如果操作没有问题,一定要手动提交事物,否则不保存操作结果
如果失败,回滚事物:ROLLBACK;
事物隔离级别:安全性从低到高,效率从高到低
read uncommitted;:读未提交,安全性最低,效率最高,会出现严重问题“脏读”,一个事物读到另一个没有提交的事物
read committed;:读已提交,较前者安全性提高,效率降低,可有效防止脏读,会出现不可重复读问题,就是在读的过程中,数据被其他用户端修改,此时读的数据也会修改,无法重复读到刚开始的数据
repeatable read;:可重复读,mysql默认隔离级别,有效防止脏读,不可重复读的问题
serializable;:串行话,级别最高,效率最低,有效防止脏读,不可重复,幻读问题
查看隔离级别
mysql8.0以下:SELECT @@tx_isolation;
mysql8.0:SELECT @@transaction_isolation;
设置隔离级别
set global transaction isolation level 隔离级别;
4.JDK动态代理
介绍:属于代理设计模式(结构型设计模式),让代理角色帮助真实角色完成事情,就是对真实角色的功能进行增强
代理模式分类
静态代理:代理角色和真实角色必须实现同一个接口
动态代理:
jdk动态代理(基于接口)
cglib动态代理(基于基础)
前提条件:必须存在一个接口,基于这个接口来完成代理
相关方法
public static Object newProxyInstance
(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h) throws IllegalArgumentException:产生jdk动态代理实例
参数
ClassLoader loader:真实角色的类加载器
Class<?>[] interfaces:真实角色实现的接口列表
InvocationHandler h:实现此接口的实现类作为处理对象
InvocationHandler:接口
Object invoke(Object proxy,方法 method,Object[] args)
参数
Object proxy:代理类的实例
方法 method:基于接口中的方法的类对象
Object[] args:调用接口方法时的实际参数数组
public Class<?>[] getInterface():获得对象实现的接口
5.JDBC
介绍:java操作数据库的一种连接器
本质:是实现sun公司提供的数据库连接接口的类,也就是数据库厂商提供的驱动包
接口分类:
Driver:驱动类必须实现的接口
Connection:特定数据库的连接会话
Statement: sql执行对象
Java连接数据库操作步骤;
导包,导入数据库的驱动jar包
ProjectStructure,Modules,Dependencies
注册驱动
Class.forName("驱动类的全限定名称");
类全限定名称
5.5:com.mysql.jdbc.Driver
8.0:com.mysql.cj.jdbc.Driver
获取数据库的连接对象
DriverManager(驱动管理类):用于管理一组jdbc驱动程序的基本服务
静态功能:public static Connection getConnection(String url,String user,String password)throws SQLException:获取数据库连接对象
参数String ur:统一资源定位符
“jdbc:数据库类型://域名:端口号/库名”
如果为mysql为8.0之后版本后面要带参数:
?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true(字符集为utf-8,是否进行数据库验证,服务器时区,是否公开访问)
参数String user:数据库用户
参数String password:数据库密码
准备静态sql语句
String sql = "sql语句";
通过数据库连接对象获得执行数据库的对象
Connection接口中的方法
Statement createStatement()throws SQLException:创建一个Statement对象,用于将SQL语句发送到数据库
数据库执行对象执行sql语句并返回结果
Statement 类中的方法:
int executeUpdate(String sql) throws SQLException:执行给定的sql语句
释放资源
数据库执行对象.close();
数据库连接对象.close();