JDBC
JDB的概念
- 概念
- JDBC(Java DataBase Connectivity java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库 提供统一访问,它是由一组用Java语言编写的类和接口组成的。
- 本质
- 其实就是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接!
JDBC HelloWorld
- 导包
- 注册驱动
- 建立连接
- 获取语句执行对象
- 获取ResultSet
- 解析结果
- 关闭资源
DriverManager
-
加载驱动
- 作用:告诉JDBC真正的JDBC规范实现类是谁
//告诉JDBC真正的JDBC规范实现类是谁 DriverManager.registerDriver(new Driver());
-
获取去连接
- ip (ping ip)
- 端口 (netstat -ant | grep 端口)
- 用户名和密码
Connetion(连接)
- 创建Statement对象
- 管理事务(ACID)
- 原子性 A
- 一致性 C
- 隔离性 I
- 持久性 D
Statement(语句)
- 封装SQL语句
- 执行SQL语句
- DML:结果为int
- DQL:ResultSet
ResultSet
-
存储结构
List<Map<String, Object>>
class ResultSet { List<Map<String, Object>> data; int p = 0; Map<String, Object> curData; public boolean next() { if (p > data.size()) return false; p++; curData = data.get(p); return true; } public get(String key) { return curData.get(key); } }
-
作用: 封装mysql 服务器响应的数据
SQL注入攻击
-
什么是SQL注入攻击
- 就是利用sql语句的漏洞来对系统进行攻击
-
SQL注入攻击的原理
- 按照正常道理来说,我们在密码处输入的所有内容,都应该认为是密码的组成
- 但是现在Statement对象在执行sql语句时,将密码的一部分内容当做查询条件来执行了
-
SQL注入攻击的解决
PreparedStatement 预编译执行者对象
-
在执行sql语句之前,将sql语句进行提前编译。明确sql语句的格式后,就不会改变了。剩余的内容都会认为是参数!
-
SQL语句中的参数使用?作为占位符
-
为?占位符赋值的方法:setXxx(参数1,参数2);
- Xxx代表:数据类型
- 参数1:?的位置编号(编号从1开始)
- 参数2:?的实际参数
-
执行SQL语句
- 执行insert、update、delete语句:int executeUpdate();
- 执行select语句:ResultSet executeQuery();
JDBC管理事务
- JDBC如何管理事务
- 管理事务的功能类:Connection
- 开启事务:setAutoCommit(boolean autoCommit); 参数为false,则开启事务。
- 提交事务:commit();
- 回滚事务:rollback();
- 管理事务的功能类:Connection
数据库连接池
数据库连接池的概念
-
数据库连接的背景
- 数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出
- 对数据库连接的管理能显著影响到整个应用程序的性能指标,数据库连接池正是针对这个问题提出来的
-
数据库连接池
- 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接, 而不是再重新建立一个。这项技术能明显提高对数据库操作的性能
开源数据库连接池的使用
-
C3P0 数据库连接池的使用步骤。
① 导入 jar 包。
② 导入配置文件到 src 目录下。
③ 创建 C3P0 连接池对象。
④ 获取数据库连接进行使用。
-
Druid 数据库连接池的使用步骤。
① 导入 jar 包。 ② 编写配置文件,放在 src 目录下。
③ 通过 Properties 集合加载配置文件。
④ 通过 Druid 连接池工厂类获取数据库连接池对象。
⑤ 获取数据库连接进行使用。
策略设计模式
-
策略(策略接口)
public interface Sing { void sing(); }
-
策略实现
public class ThisSing implements Sing { @Override public void sing() { System.out.println("新的风暴已经出现!"); } }
-
-
执行者(谁执行策略)
public class Singer { public void Sing(Sing sing){ sing.sing(); } }
-
调用者
public class TestSing { public static void main(String[] args) { Singer singer = new Singer(); singer.Sing(new ThisSing()); }