- 👑专栏内容:MySQL
- ⛪个人主页:子夜的星的主页
- 💕座右铭:前路未远,步履不停
目录
- 一、JDBC工作原理
- 二、JDBC 使用
- 1、准备工作
- 2、使用实例
- 3、手动输入
一、JDBC工作原理
JDBC是Java语言中用于与数据库进行交互的一组API(应用程序接口)。JDBC允许Java应用程序通过标准的SQL语句访问数据库,并处理查询、更新和管理数据库中的数据。JDBC提供了一种统一的方式,使Java应用程序能够与各种不同类型的数据库进行通信,而不需要针对每个数据库系统编写特定的代码。
它是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。这个API由 java.sql.*
,javax.sql.*
包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
JDBC访问数据库层次结构:
二、JDBC 使用
1、准备工作
可以在中央仓库下载数据库驱动包:https://mvnrepository.com/
下载数据库驱动包,并添加到项目的依赖中: 在项目中创建文件夹lib,并将依赖包mysql-connector-java-5.1.47.jar复制到lib中。
再配置该jar包到本项目的依赖中:右键点击项目添加为库,将该lib文件夹配置进依赖中,表示该文件夹下的jar包都引入作为依赖。
2、使用实例
public class demo1 {
public static void main(String[] args) throws SQLException {
//1.创建一个数据源
DataSource dataSource = new MysqlDataSource();
//2.设置数据源的属性,为连接数据库做准备
((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:3306/java108?user=root&password=11111&useUnicode=true&characterEncoding=UTF-8");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("11111");
//3.和数据库建立连接
Connection connection = dataSource.getConnection();
//4.拼装sql语句
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
//5.执行sql语句,返回值是这次操作影响了几行
int ret = statement.executeUpdate();
System.out.println("影响了"+ret+"行");
//6.关闭释放资源
statement.close();
connection.close();
}
}
- 创建一个数据源
DataSource dataSource = new MysqlDataSource();
这里面 DataSource
是 JDBC 的 interface
MysqlDataSource
MySQL 驱动包中提供的类,这个类就实现了 DataSource interface
。同时,这个代码也是一个非常常见的向上转型操作。
- 设置数据源的属性,为连接数据库做准备
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("11111");
向下转型又回来了,目的是为了使用 setUrl 方法,因为是这个方法是子类才有的。
为什么不直接 dataSource.setUrl();
因为,按照转型的写法,可以让 MysqlDataSource
这个类不要扩散到代码的其他部分,目的是降低MySQL 的驱动包和其他代码之间的耦合关系,避免后续更换数据库导致成本太高。
setURL
为设置MySQL数据连接的URL参数格式: jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值
setUser
和 setPassword
分别为设置用户名和密码。
- 和数据库建立连接
Connection connection = dataSource.getConnection();
- 拼装 sql 语句
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);
SQL 语句本身是 String 类型的,但是 JDBC 提供了 Statement
对象,让我们把 String 转化为 Statement
再发给服务器执行。但是,我们一般使用 PreparedStatement
来代替 Statement
。
Statement
是把 SQL 原封不动的转发给数据库服务器,数据库服务器负责自己解析 SQL,而 PreparedStatement
会先在客户端这边初步解析一下 SQL 语句。
- 执行sql语句,返回值是这次操作影响了几行
int ret = statement.executeUpdate();
System.out.println("影响了"+ret+"行");
executeUpdate()
方法通常用于执行更新数据库的操作,例如插入、更新或删除数据,这个操作的返回值是影响的行数。
executeQuery()
方法通常用于读取数据库的操作。这个方法返回一个 ResultSet
对象,其中包含查询结果的数据。
下面是一个查询操作的写法:
public class demo2 {
//查询操作基本写法
public static void main(String[] args) throws SQLException {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("11111");
Connection connection = dataSource.getConnection();
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//执行查询操作,要是有executeQuery,返回值是一个ResultSet类型的对象
ResultSet resultSet = statement.executeQuery();
//遍历结果集合
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id:"+id+" "+"name:"+name);
}
}
}
- 关闭释放资源
statement.close();
connection.close();
创建的语句对象和连接对象,都会持有一些计算机硬件/软件上的资源,这些资源不用了就应该及时释放。Java 虽然有垃圾回收机制,自动释放内存,但是计算机资源不仅仅是内存。这些其他资源也是需要手动释放的。
这里也需要注意一下关闭顺序,一般整体原则是:先创建的对象后关闭,后创建的先关闭。
3、手动输入
上面的代码能执行 SQL 语句,但是有一个最重要的问题就是,代码是写死的。我们想要用户通过控制台来输入。
将上面的插入内容改成 ?
,这是一个占位符,后续 PreparedStatement
会把变量的数值带入到 ?
中。
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);