JDBC基础


JDBC基础

9066868d2fbcdaa7f34a2a8687d8242e

1 数据库驱动2 JDBC3 JDBC程序4 Statement对象5 CURD测试6 SQL注入7 PreparedStatement对象8 事务9 数据库连接池

1 数据库驱动

未命名文件(2)

程序通过数据库驱动和数据库交互

2 JDBC

为了简化对(数据库的统一)操作,提供了一个(java操作数据库的)规范,简称JDBC

未命名文件(3)

需要的包:

  • java.sql
  • javax.sql
  • 数据库驱动:mysql-connector-java-5.1.47.jar

3 JDBC程序

创建测试数据库

xxxxxxxxxx
11712345678910111213141516

创建JAVA项目 导入数据库驱动

在项目创建lib目录并将jar包拷入,添加为Library

image-20211126185321584

连接数据库测试:

x
139123456789101112131415161718192021222324252627282930313233343536373839

总结步骤:

  • 1.加载驱动
  • 2.连接数据库 DriverManager
  • 3.获得sql对象
  • 4.获得返回结果集
  • 5.释放连接

加载驱动

xxxxxxxxxx
1

image-20211127000528250

URL

x
123

连接数据库

x
1234

执行

x
1234567

查询结果

x
1312345678910111213

释放资源

41234

4 Statement对象

JDBC的Statement对象用于向指定数据库发送SQL语句

插入

实例:

x
123456

删除

实例:

x
123456

更新

实例:

x
123456

查询

实例:

x
123456

5 CURD测试

数据库连接配置文件db.properties

xxxxxxxxxx
11234

数据库连接工具类

xxxxxxxxxx
155123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354

插入

xxxxxxxxxx
12312345678910111213141516171819202122

更新

xxxxxxxxxx
12212345678910111213141516171819202122

删除

xxxxxxxxxx
12312345678910111213141516171819202122

查询

xxxxxxxxxx
12812345678910111213141516171819202122232425262728

6 SQL注入

sql注入攻击:由于程序漏洞导致,用户输入数据时输入了恶意SQL语句导致数据库信息泄露

解决:对SQL语句关键字进行屏蔽过滤

测试:

3412345678910111213141516171819202122232425262728293031323334

7 PreparedStatement对象

PreparedStatement可以防止SQL注入,效率更高

插入

x
33123456789101112131415161718192021222324252627282930313233

删除

x
301234567891011121314151617181920212223242526272829

更新

x
291234567891011121314151617181920212223242526272829

查询

x
1234567891011121314151617181920212223242526272829303132

prepareStatement防止SQL注入:把传递的参数当做字符,特殊字符就会被转义而不是拼接字符串

8 事务

ACID原则:原子性,一致性,隔离性,持久性

  • 原子性:一个事务包含的步骤,要不都完成要不都失败,不存在中间态
  • 一致性:数据库操作数据符合运算规则
  • 隔离性:多个事务同时执行互相不干扰
  • 持久性:一但提交数据持久化到数据库,不可逆
  • 隔离性问题:

    • 脏读:一个事务读取另一个事务没有提交的值
    • 不可重复读:在同一个事务内,重复读取表中的数据,表数据发生改变
    • 幻读:在一个事务内读取到别的事务插入的数据

程序模拟:

x
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

总结步骤:

  • 1.开启事务 connection.setAutoCommit(false);
  • 2.执行SQL
  • 3.若事务完成则提交事务 connection.commit();
  • 4.捕获到异常自动回滚,也可以在catch显式定义 connection.rollback();

9 数据库连接池

正常程序执行流程:数据库连接->执行->释放连接

连接与释放需要耗费大量系统资源

池化技术:(线程池类似)预先创建连接,使用时直接使用连接好的

  • 最小连接数:按常用连接数来设置
  • 最大连接数:业务承载的上限 超过则等待
  • 等待超时:等待时长超过此时长断开请求

开源数据源

  • DBCP
  • C3P0
  • Druid

编写连接池:实现DataSource接口

DBCP

准备jar包:下载DBCP 下载POOL

  • commons-dbcp-1.4.jar
  • commons-pool-1.6.jar

测试程序:

配置文件dbcpconfig.properties:

xxxxxxxxxx
134123456789101112131415161718192021222324252627282930313233

工具类jdbcUtils_DBCP:

x
1234567891011121314151617181920212223

测试程序:

x
1234567891011121314151617181920212223242526272829303132

C3P0

准备jar包:下载C3P0

  • c3p0-0.9.5.5.jar
  • mchange-commons-java-0.2.19.jar

测试程序:

配置文件c3p0-config.xml

xxxxxxxxxx
13412345678910111213141516171819202122232425262728293031323334

工具类jdbcUtils_C3P0:

x
123456789101112131415161718192021222324252627

测试程序:

xxxxxxxxxx
132123456789101112131415161718192021222324252627282930