目录
JDBC的环境配置
JDBC的使用步骤(Java操作数据库)
建立数据库连接
方式一:DriverManager
方式二:DataSource(数据源/数据库连接池)
DataSource与DriverManager的对比
创建操作命令对象Statement
Statement
PreparedStatement
CallableStatement
执行SQL语句
处理结果集
释放资源
JDBC实现查询操作完整代码
什么是JDBC?
JDBC即Java Database Connectivity,Java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个api由java.sql.*、javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.
· 多种:可以同时支持多种关系型数据库,可以任意切换(兼容性)
· 统一:使用一套标准的jdbc api操作的代码
JDBC的优势
· Java语言访问数据库操作完全面向抽象接口编程
· 开发数据库应用不用限定在特定数据库厂商的API
· 程序的可移植性增强
①首先需要提前准备数据库驱动包
②创建项目,并创建一个lib目录,将jar包放置在lib目录中
③项目右键,打开当前项目的设置
④按照如下顺序将依赖包添加至项目中
⑤进行完上述步骤后即配置完成,之后检验是否配置成功即可.
只要能看到如上提示即配置成功.
数据库:是一个网络主机上的数据库服务端进程,需要使用URL来连接.
· 协议名:网络传输数据的格式
· 服务器地址:服务器(进程)所在主机对应的地址(ip,域名)
本机的ip:127.0.0.1
域名:localhost
· 服务器端口号:主机中端口绑定的一个进程
· 带层次的文件路径:服务资源(资源可能是一个文件,也可能是虚拟资源)
再进行下列jdbc操作之前,首先需要建立一个数据库,例如在下列演示中,我使用的是自己提前建好的db_test数据库,并针对其进行操作
import java.sql.*;
public class First {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1、建立数据库连接
Class.forName("com.mysql.jdbc.Driver");
/**
* DriverManager是jdbc的api,Connection也是(Java.sql开头)
* url:
* ①服务器地址,看看是不是要连接的数据库ip/域名
* ②带层次的路径:数据库名
* ③用户名,密码
*/
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test?user=root&password=142516&useUnicode=true&characterEncoding=UTF-8");
}
}
连接池初始化时就创建了一定数量的数据库连接对象(Connection),一个程序连接某个数据库使用一个连接池就行.
import java.sql.Connection;
import java.sql.SQLException;
public class CourseQuery {
public static void main(String[] args) throws SQLException {
/**
* 使用数据库连接池来获取数据库连接对象
* 一个Java程序,创建多个还是1个连接池对象一个
*/
MysqlDataSource ds = new MysqlDataSource();
//url中的参数,可以使用方法来设置
ds.setURL("jdbc:mysql://localhost:3306/db_test");
ds.setUser("root");
ds.setPassword("142516");
//安全连接,如果不设置有警告
ds.setUseSSL(false);
//设置编码格式:按某个编码保存数据,也要按一样的编码来使用
ds.setCharacterEncoding("UTF-8");
Connection c = ds.getConnection();
}
}
· DriverManager每次都是新建一个物理连接,释放的时候是关闭物理连接,相当于实际操作MySQL中的点击关闭
· DataSource是初始化的时候就创建一定数量的连接,释放时只是重置并放回连接池,即可以实现复用
· DriverManager效率低,而DataSource效率高
Statement对象用于执行sql代码,共有三种操作命令对象,分别为:Statement、PreparedStatement、CallableStatement.
不带占位符简单操作命令对象,用于执行不带参数的简单SQL语句
//2、创建操作命令对象
Statement s = c.createStatement();
使用PreparedStatement创建操作命令对象时,需要对其传入sql语句
· 其用于执行带或不带参数的sql语句
· SQL语句会预编译在数据库系统
· 执行速度快于Statement对象
//2.创建操作命令对象
//使用PreparedStatement创建操作命令对象时,必须对其传入sql语句
String sql = "select id, name from course where name=?";
PreparedStatement ps = c.prepareStatement(sql);
用于执行存储过程的,后续学习后会记录在该博客中.
· 如果是插入、修改、删除操作,调用executeUpdate方法,返回int类型表示处理成功多少条
//插入,修改,删除,都调用executeUpdate,返回int是执行成功多少条
int n = ps.executeUpdate();
· 如果是查询操作,处理结果集ResultSet,调用excuteQuery方法,返回结果集
由于在利用PreparedStatement创建操作命令对象时已经传入了sql语句,因此在执行的时候就不需要再传了.
//Statement创建操作命令对象
ResultSet rs = s.executeQuery("select id, name from course");
//PreparedStatement创建操作命令对象
ResultSet rs = ps.executeQuery();
while(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(String.format("id: %d,name: %s\n",id, name));
}
反向释放(ResultSet -> Statement -> Connection),都是调用close方法释放
//关闭结果集
if(rs != null) {
try {
rs.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
//关闭命令
if(s != null) {
try {
s.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
//关闭连接
if(c != null) {
try {
c.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
下述为Java操作数据库实现查询操作的完整代码,创建操作命令对象时利用Statement创建,并实现根据用户输入来查询的操作.
package org.example;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.*;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: Li_yizYa
* Date: 2022—05—03
* Time: 19:43
*/
public class CourseQuery {
public static void main(String[] args) throws SQLException {
//1.连接数据库
/**
* 使用数据库连接池来获取数据库连接对象
* 一个Java程序,创建多个还是1个连接池对象一个
*/
MysqlDataSource ds = new MysqlDataSource();
//url中的参数,可以使用方法来设置
ds.setURL("jdbc:mysql://localhost:3306/db_test");
ds.setUser("root");
ds.setPassword("142516");
//安全连接,如果不设置有警告
ds.setUseSSL(false);
//设置编码格式:按某个编码保存数据,也要按一样的编码来使用
ds.setCharacterEncoding("UTF-8");
Connection c = ds.getConnection();
Scanner scan = new Scanner(System.in);
System.out.print("请输入要查找的书名:>");
String inputName = scan.nextLine();
//2.创建操作命令对象
//使用PreparedStatement创建操作命令对象时,必须对其传入sql语句
String sql = "select id, name from course where name=?";
PreparedStatement ps = c.prepareStatement(sql);
/**
* 替换占位符: setXXX(index, value)
* XXX: 值的类型
* index: 是占位符的索引位置(从1开始)
* value: 要替换的值
*/
ps.setString(1, inputName);
//3.执行sql语句
ResultSet rs = ps.executeQuery();
//4.处理结果集
while (rs.next()){//遍历每一行数据
//获取id字段的值
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.printf("id: %s, name: %s\n", id, name);
}
//5.释放资源:反向释放(resultSet, Statement, Connection).close()
if(rs != null) {
try {
rs.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
//关闭命令
if(ps != null) {
try {
ps.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
//关闭连接
if(c != null) {
try {
c.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}
· 数据库中目前存储了六本书,可以随意查询以下六本书