文章摘要
JDBC 介绍
1、很重要要要要! Java程序 对 数据库 进行 交互 操作
< => Java DataBase Connectivity => 简称 JDBC
2、JDBC 基于驱动程序
实现 与数据库的 连接 与 操作
3、可以理解 JDBC 是一堆接口
驱动程序 就是一些 实现 了 JDBC 的类
4、要熟悉 了解 反射机制 更容易理解JDBC
单词 汇总
Statement
|
/ˈsteɪtmənt/ 声明 Driver|
/ˈdraɪvər/ 驱动 Manager|
/ˈmænɪdʒər/ 管理 Connection|
/kəˈnekʃn/ 连接
create|
/kriˈeɪt/ 创造 executeQuery|
执行查询 Result(Set)|
/rɪˈzʌl / 结果集 prepared|
/prɪˈperd/ 有准备的
一、JDBC使用步骤 - 5 个步骤
① 、加载并注册JDBC驱动
1.1JDBC的驱动长什么样?
1.2添加依赖-把jar包导入工程
1.3加载JDBC驱动
浅析:JDBC的驱动是谁提供的? 要看数据库厂商了
加载JDBC驱动 就是 加载 某数据库厂商 提供的 JDBC接口 的 实现类
//用于加载指定的类
Class.forName("com.mysql.cj.jdbc.Driver");
//该字符串描述了该类的位置
② 、创建数据库连接
程序 和 数据库网络通信
//获取数据库连接 url 用户名 密码
Connection conn = DriverManager.getConnection("jdbc:mysql;//localhost:3306/哪个数据库名字?jdbc:mysql://localhost:3306/babytun?useUnicode=true&character=utf8&useSSL=false&serverTimezone=UTC"
,"root"
,"root")
//返回 Connection对象
//java.sql.Connection是一个接口,具体由驱动实现
③ 、创建Statement对象
Statement对象 是用来执行SQL 语句的
Statement stmt = conn.createStatement();
//返回一个 结果集 SQL语句
ResultSet rs = stmt.executeQuery("select * from biao");
注:在结果集中有我们查询的数据,如果要提取出来就要走下面的遍历步骤
④ 、遍历查询结果
//next() 是结果集中提供的判断方法
while(rs.next()){
//将 当前行 第一列的数据,作为整型获取
Integer eno = rs.getInt(1);
//将 当前行 ename的数据,作为字符串获取
String ename = rs.getString("ename");
Float salary = rs.getFloat("salary");
System.out.println(eno+"-"+ename+""+"-"+salary);
}
⑤ 、关闭连接,释放资源
//当前连接是否被关闭
if(conn != null && conn.isClosed() == false){
conn.close();
}
实际要把 conn.close(); 放到 finally 块中
二、SQL注入攻击的应对
利用输入的语句 故意去和SQL语句进行拼接
。会造成数据的泄露。
例···原始语句:
ResultSet rs = stmt.executeQuery("select * from table where ename='" + x + "'");
如果控制台输入 ' or 1=1 or 1='
SQL语句就会发生拼接 如下所示:
slecr * from table where ename='' or 1=1 or 1=''
注入攻击 - 应对
因为执行SQL语句的是 Statement 对象。所以要放弃Statement 改用 PreparedStatement 处理SQL
Statement stmt = conn.createStatement();
//返回一个 结果集 SQL语句
ResultSet rs = stmt.executeQuery("select * from biao where ename='" + x + "'"");
上面代码 改成 下方形式
上面代码中SQL 查询是放在 executeQuery() 中执行的。
下面代码 则是 先 放入SQL语句,然后调用excuteQuery()。
PreparedStatement pstmt= conn.preoareStatement("select * from biao where ename=?");
pstmt.setString(1,x);//设置SQL参数,参数从第一个开始
ResultSet rs = pstmt.executeQuery();
============================================== JDBC 基操完结================================================
============================================== 优化、使用细节================================================
三、封装 DBUtils 工具类
其实也就是把一些重复的代码 整合起来 放进某些方法中,啥时候使用啥时候调用。这样JDBC 使用起来会很舒服。
比如:创建连接部分+关闭连接部分
public class DBUtils{
//获取连接,返回Connection对象
public static Connection getConnection()throw 各种异常{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url,user,password);
return conn;
}
//关闭连接,释放资源 prepardeStatement是Statement的子接口,关Statement一样
public static void closeConnection(ResultSet rs,Statement stmt,Connection conn){
rs.close();
stmt.close();
conn.close();
}
}
四、事务机制
为了防止程序在操作数据库中 出现意外情况 导致 数据 传递过程出现 异常:
要么把事情做完,要么不做,不能做一半
MySQL通过事务区
作为数据缓冲地带:
·通过 事务区机制 等待程序发起 commit提交 或者 robllback回滚:
···如果commit提交成功 所有事务区的数据 将写入表中。
···如果robllack 永远不会写入目标表 会将事务区中做好的 数据 撤销掉。
注:日常开发中 大多数都需要手动控制事务机制。
提交指令:commit
回滚指令:rollback
JDBC的 两种 事务模式
①、自动提交事务模式
每执行一次execute...();
时都会提交一次
不书写 默认 是 开启状态:
conn.setAutoCommit(true)
关闭自动提交:
//关闭自动提交
conn.setAutoCommit(false)
②、手动提交事务模式
1、获取数据库连接以后
2、手动 书写 关闭自动提交
3、然后 显示调用 conn.commit()
与 conn.rollback()
方法管理事务
注:如果提交过程出现异常,当然 conn.rollback(); 要写在 catch块 里面 进行事务的回滚。
五、实体类的封装分页、JDBC中 Date日期对象的处理、批处理
此处跳过…🙏
六、连接池
连接池好比是仓库
连接池 负责创建管理
连接,程序只 负责取用与归还
。
Druid 使用步骤
1、如何获取?GitHub上搜寻Druid并下载
2、把该jar包 加入依赖
3、src目录下创建 druid-config.propertues
属性文件
//驱动类的名字
driverClassName=com.mysql.cj.jdbc.Driver
url=......
userName=...
password=...
//如果要在程序 启动的时候 初始化 一定数量的数据库连接 下面继续配置
initialSize=10 //初始的数量
maxActive=20
4、如何利用Druid对 上面 属性文件 进行加载和读取呢?
·4.1、加载属性文件
Properties properties = new Properties();
//利用 Properties对象 来保存编写的 属性文件信息
String str= 当前类名.class.getResource("/druid-config.properties").getpath();
//获取属性文件路径
str = new URLDecoder().decode(str,"UTF-8")
//确保获取的路径名正确 例如遇到空格等 进行转化
properties.load(new FileInputStream(str));
//将属性文件的物理地址,放到文件输入流中 完成加载.
·4.2、获取DataSource数据源对象
注:DataSource 是 java.sql包中提供的一个接口,利用DataSource指代我们要操作的数据库是什么
所谓的 数据源 就是 数据库在JDBC中的别称
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
·4.3、创建数据库连接
Connection conn = dataSource .getConnection();
5、关闭连接
不使用连接池:conn.close(); 关闭连接
使用连接池:conn.close(); 将连接 回收 至连接池
C3P0 使用步骤
1、如何获取?百度C3P0 官网
2、把该jar包 加入依赖
3、src目录下创建 c3p0-config.xml
配置文件
注:文件名 固定
<?xml version="1.0" encoding="UTF-8"?>
此文件根节点固定
<c3p0-config>
默认配置信息
<default-config>
驱动类名
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
连接字符串
<property name="jdbcUrl">......</property>
<property name="user">...</property>
<property name="password">...</property>
初始化连接属性
<property name="initialPoolSize">10</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
4、如何利用C3P0对 上面 配置文件 进行加载和读取呢?
·4.1、加载配置文件
·4.2、创建DataSource
DataSource dataSource = new CombopooledDataSource();
·4.3、得到数据库连接
Connection conn = dataSource.getConnection();
5、关闭连接
总结:即使是不同的连接池产品 主要步骤也就是
1、加载相应的文件
2、拿到数据源对象
3、获取数据库连接
七、Apache Commons DBUtils
- 由Apache提供的开源JDBC工具类库
- 简单封装了JDBC
支持 druid、c3p0
使用步骤
1、什么是Commons DBUtils?
2、加入依赖
3、如何使用?(无非查询 和 写 这两块的操作)
·3.1、查询如下:
因为 支持 连接池 所以在获取 连接池以后Properties properties = new Properties(); String str= 当前类名.class.getResource("/druid-config.properties").getpath(); str = new URLDecoder().decode(str,"UTF-8") properties.load(new FileInputStream(str)); 获取DataSource数据源对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); //查询执行者 传入 指定哪一个数据库 进行操作 QueryRunner qr = new QueryRunner(dataSource); //将结果自动转换成实体类 List<实体类> list = qr.query("select * from table limit ?,10", //查询结果要转换成哪个实体对象 new BeanListHandler<>(实体类的名.class), //用数组进行 SQL参数传值 new Object[]{1});
上面没有涉及到 任何连接的操作,在执行query方法的时候,DBUtils会自动创建连接。当执行完毕后自动关闭。
·3.2、更改如下:
因为 一些列写操作
牵扯到事务
,所以需要获取数据库连接Properties properties = new Properties(); String str= 当前类名.class.getResource("/druid-config.properties").getpath(); str = new URLDecoder().decode(str,"UTF-8") properties.load(new FileInputStream(str)); DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); 创建数据库连接 Connection conn = datSource.getConnection(); conn.setAutoCommit(false); //关闭自动提交 String sql = "update table set salary=salary+1000 where eno=?"; 不用传入数据源对象 QueryRunner qr = new QueryRunner(); // sql 要传入的参数 qr.update(conn,sql,new Object[]{1007}); conn.commit(); 再往下就是响应的 connn.rollback()回滚、以及资源的释放或关闭
总结
我爱你 ~ 任凭上面的代码雨阑珊,淋不湿屋内的你,我是代码雨,你还是你。💔💔💔
🙏愿: 宇宙的尽头没有JDBC。