1.数据持久化
持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。
2.JDBC
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API)
简单理解就是:JDBC是SUN公司提供的一套API,利用这套API可以实现对具体数据库的操作(获取连接、关闭连接、DML、DDL、DCL)
3.JDBC图示理解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQTWdhK0-1584869990625)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1576591061729.png)]
好处:面向应用的API:Java API,抽象接口。供应用程序开发人员使用(连接数据库,执行sql语句,获得结果)。
面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。
--> 编程的角度:不需要关注数据库的底层细节。
--> 数据库厂商:只需要提供标准的具体实现
4.数据库的驱动
数据库厂商针对JDBC这套接口,提供的具体实现类的集合。
类似于:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRejI1Vt-1584869990628)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1576591601956.png)]
5.面向接口编程思想
JDBC是SUN 公司提供一套用于数据库操作的接口,Java程序员只需要面向接口编程即可。
不同的数据库厂商,需要针对这套接口,提供不同实现。不同实现的集合,即为不同数据库的驱动。
@Test
public void testConnection5() throws Exception {
//1.加载配置文件
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
//2.读取配置信息
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//3.加载驱动
Class.forName(driverClass);
//4.获取连接
Connection conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
其中,配置文件声明在工程的src目录下:【jdbc.properties】
user=root
password=abc123
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver
6.增删 改查操作
使用Statement操作数据表的弊端:
问题一:存在拼串操作,繁琐
问题二:存在SQL注入问题
Preparedstatement的理解:
预编译SQL Statement。可以解决SQL注入以及拼串问题。
两种思想
面向接口编程思想,ORM编程思想。
两种技术
1.使用结果集的元数据:ResultSetMetaData
getColumnCount():获取列数
getColumnLabel():获取列的别名。(如果sql中没有给字段起别名,getColumnLabel()获取的就是列名)
2.反射的使用(1.创建对应的运行时类的对象 2.运行时,动态的调用指定的运行时类的属性、方法)。
图示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dyc5GgwA-1584869990634)(C:\Users\lee\AppData\Roaming\Typora\typora-user-images\1576593675552.png)]
Preparedstatement与Statement之间的异同
-
指出二者间的关系:Preparedstatement是Statement子接口。在开发中Preparedstatement替换Statement
-
Preparedstatement能够最大可能提高性能
DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复 调用,所以语句在被DBServer的编译器编译后的执行代码缓存下来,下次再进行调用时,只要是相同的编译语句就不需要编译。
-
Preparedstatement(具有语法检查,语义检查,翻译成二进制命令,缓存)
-
Preparedstatement可以防止SQL注入。
7.数据库事务:
-.事物
一组逻辑操作状态,使数据从一种状态变换到另外一种状态。
--.事物处理原则
数据一旦提交,就不可回滚。
四大属性:
ACID
-
原子性(Atomicity)
原子性是指事物是一个不可分割的工作单位,事物中的操作要么都发生,要么都不发生。
-
一致性(Consistency)
事物必须使数据库从一个一致性状态变换到另外一个一致性状态。
-
隔离性(Isolation)
事物的隔离性是指一个事物的执行不能被其他事物干扰,即一个事物内部的操作及使用的数据对并发的其他事物是隔离的,并发执行的各个事务间不能相互干扰。
-
持久性(Durability)
持久性指的是一个事务一旦被提交,它对数据库中数据的改变就是永久的,其他操作都不会对其造成影响。
数据库并发问题:
脏读
不可重复度
幻读
数据库的四种隔离级别(一致性和并发性,相互矛盾)
设置数据库系统的全局的隔离级别:
考虑到事物以后的数据库操作:
1.获取数据库连接
Connection conn=JDBCUtils.getConnection(); //方式1:手动获取连接 方式2:数据库连接池
conn.setAutoCommit(false); //体现事务
2.如下的DML操作,作为一个事物出现
操作1:使用通用的增删改操作 //通用的增删改查操作如何实现
操作2:使用通用的增删改操作 //方式1:手动使用PreparedStatement实现
操作3:使用通用的增删改操作 //方式2:使用dbutils.jar中的QueryRunner类
conn.commit()
3.如果出现异常,则
conn.rollback()
4.关闭资源
JDBCUtils.closeResource(…,…,…) //方式1:手动关闭资源
//方式2:DbUtils类的关闭方法。
8.数据库连接池:
数据库连接池优点:
1.提高程序的响应速度(减少了创建连接响应的时间)
2.降低资源消耗(提高可重用性)
3.便于连接的管理
4.实现的方式
DBCP、C3P0、Druid***。
导入.jar文件
配置文件
DbUtils类的关闭方法。
8.数据库连接池:
数据库连接池优点:
1.提高程序的响应速度(减少了创建连接响应的时间)
2.降低资源消耗(提高可重用性)
3.便于连接的管理
4.实现的方式
DBCP、C3P0、Druid***。
导入.jar文件
配置文件