花了一天时间在b站看的黑马的教学视频,粗略记了点笔记
文章目录
一、JDBC简介
思想
- 分层思想
- 在 Java 上面只有一种数据库连接统一接口——JDBC。JDBC 为数据库开发人员提供了一个标准的 API,据此可以构建更高级的工具和接口使数据库开发人员能够用纯 Java API 编写数据库应用程序。
- 说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
IDEA配置JDBC
https://blog.csdn.net/qq_34622844/article/details/102817852
JDBC驱动类型
-
JDBC 驱动程序实现 JDBC API 中定义的接口,用于与数据库服务器进行交互。JDBC 驱动程序可以打开数据库连接,并通过发送 SQL 或数据库命令,然后在收到结果与 Java 进行交互。
-
(jdk1.8已经移除)JDBC-ODBC 桥接 ODBC 驱动程序:它是将 JDBC 翻译成 ODBC, 然后使用一个 ODBC 驱动程序与数据库进行通信。
-
本地 API 用 Java 来编写的驱动程序:这种类型的驱动程序把客户机 API 上的 JDBC 调用转换为 Oracle、Sybase、 Informix、DB2 或其它 DBMS 的调用。
-
JDBC 网络纯 Java 驱动程序:这种驱动程序将 JDBC 转换为与 DBMS 无关的网络协议,这是最为灵活的 JDBC 驱动程序。它是一个三层的方法来访问数据库,在 JDBC 客户端使用标准的网络套接字与中间件应用服务器进行通信。然后由中间件应用服务器进入由 DBMS 所需要的的调用格式转换,并转发到数据库服务器。
-
本地协议纯 Java 驱动程序:这种类型的驱动程序将 JDBC 调用直接转换为 DBMS 所使用的专用网络协议。是 Intranet 访问的一个很实用的解决方法。它是直接与供应商的数据库进行通信,通过 socket 连接一个纯粹的基于 Java 的驱动程序。这是可用于数据库的最高性能的驱动程序,并且通常由供应商本身提供。
二、快速入门:连接数据库
- 导入 JDBC 驱动:导入jar包
- 注册 JDBC 驱动程序:这一步会导致 JVM 加载所需的驱动类实现到内存中,然后才可以实现 JDBC 请求。
- 数据库 URL 指定:创建具有正确格式的地址,指向到要连接的数据库。
- 获取数据库连接对象 Connection:最后,代码调用 DriverManager 对象的 getConnection() 方法来建立实际的数据库连接。
- 定义 sql 语句
- 获取执行 sql 语句的对象 Statement
- 执行 sql,返回执行结果
- 释放Connection资源
三、JDBC的一些重要接口
DriverManager
1、注册驱动
告诉程序该使用哪个数据库驱动jar
static void registerDriver(Driver driver)
加载"com.mysql.jdbc.Driver"的时候执行了静态代码块,其实就是调用了registerDriver
Class.forName("com.mysql.jdbc.Driver");
2、获取数据库连接
public static Connection getConnection(String url,String user,String password)
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/book?
useUnicode=true&characterEncoding=UTF-8
&serverTimezone=Asia/Shanghai","root","123456");
Connection
1、获取执行sql的对象:Statement
,PrepareStatement
2、事务管理
开始事务:void setAutoCommit(boolean autoCommit)(设置false就是开启事务)
提交事务:void commit()
回滚事务:void rollback(Savepoint savepoint)
Statement
1、该对象用于执行静态SQL语句并返回它产生的结果。
2、int excuteUpdate(String sql)
- 执行DML语句(增删改,insert,update,delete)
- DDL语句(表和库的创建和删除create,drop,alter)
- 返回值是影响的行数,如果大于0的话就是执行成功
3、ResultSet executeQuery(String sql)
执行给定的DQL(select)语句,返回一个 ResultSet
对象。
ResultSet
1、结果集对象,封装查询结果
2、如何查询结果:next()
PrepareStatement
1、防止SQL注入:SQL注入问题,在拼接sql的时候 ,有一些sql的特殊字参与字符串的拼接,会造成安全性问题
2、解决sql注入问题,需要用PrepareStatement对象解决
3、预编译的sql:参数使用?作为占位符
4、后期都会使用PrepareStatement: 效率更高,并且可以防止注入
四、JDBC来控制事务
我们在编写 java 程序的时候,在默认情况下,JDBC 连接是在自动提交模式下,即每个 SQL 语句都是在其完成时提交到数据库。但有时候我们为了提高程序运行的性能或者保持业务流程的完整性,以及使用了分布式事务管理方式,这个时候我们可能想关闭自动提交而自己管理和控制自己的事务。
让多条 SQL 在一个事务中执行,并且保证这些语句是在同一时间共同执行的时候,我们就应该为这多条语句定义一个事务。一个事务是把单个 SQL 语句或一组 SQL 语句作为一个逻辑单元,并且如果事务中任何语句失败,则整个事务失败。如果我们要启动一个事务,而不是让 JDBC 驱动程序默认使用 auto-commit 模式支持。这个时候我们就要使用 Connection 对象的 setAutoCommit() 方法。我们传递一个布尔值 false 到 setAutoCommit() 中,就可以关闭自动提交。反之我们传入一个 true 便将其重新打开。
代码
知道怎么开启,关闭和回滚就可以了
import com.lqr.util.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 事务的操作
* @author KyrieLuo
* @create 2020/9/24-10:16
*/
public class JdbcDemo4 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {
conn = JdbcUtils.getConnection();
//1、开启事务
conn.setAutoCommit(false);
String sql1 = "update account set balance = balance - ? where id = ?";
String sql2 = "update account set balance = balance + ? where id = ?";
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
pstmt1.setDouble(1,500);
pstmt1.setInt(2,1);
pstmt2.setDouble(1,500);
pstmt2.setInt(2,2);
pstmt1.executeUpdate();
pstmt2.executeUpdate();
//2、提交事务
conn.commit();
} catch (Exception throwables) {
//3、一旦出现异常,开始回滚事务
try {
if(conn != null){
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JdbcUtils.close(pstmt1,conn);
JdbcUtils.close(pstmt2,null);
}
}
}
五、数据库连接池
概念:一个存放数据库连接的容器,当系统初始化后容器被创建,容器中会申请一些连接对象,当用户访问数据库时从容器中获取连接对象,用完后放回容器。
实现
获取连接:getConnection
关闭连接:close
如果对象是从连接池中获取的,那么调用close方法不是关闭连接而是把连接归还
一般使用两种数据库连接池:
C3P0
Druid
C3P0
Druid
步骤:
1、导入jar包
2、定义配置文件
3、获取数据库连接池对象:通过工厂类来获取DruidDataSourceFactory
4、获取连接
六、Spring JdbcTemplate
我在另一篇文章中有详细写:https://blog.csdn.net/weixin_44369928/article/details/108936430