目录
🌾Java的数据库编程:JDBC
🌈1. JDBC是什么?
JDBC,就是Java Database connectivity,java 的数据库连接。是一种用于执行SQL语句的Java API,它是java中的数据库连接规范。它为java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
🌈2.JDBC常用接口和类
1、数据库连接的获取方式(2种)
(1)通过DriverManager(驱动管理类)的静态方法获取;其中,DriverManager类获取的Connection连接,是无法重复利用的,每次利用完以后释放资源时,通过connection.close()关闭物理连接。
//加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
Connection connection = DriverManager.getConnection(URL);
(2) 通过DataSource(数据源)对象获取。实际应用中使用。其中DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些数量是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收。
private static DataSource dataSource = null;
//1、初始化数据源
MysqlDataSource mysqlDataSource = new MysqlDataSource();
//2、设置连接的参数
mysqlDataSource.setURL(URL);
mysqlDataSource.setUser(USER);
mysqlDataSource.setPassword(PASSWORD);
//3、将构建好的MySQL数据源赋值给JDBC中的datasource
dataSource = mysqlDataSource;
2、Statement对象
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。但是最常用的是PreparedStatement:用于执行带或者不带参数的SQL语句,SQL语句会预编译在数据库系统,执行速度快于Statement对象。
其余两种:Statement:用于执行不带参数的简单SQL语句;CallableStatement用于执行数据库村塾过程中的调用。
两种执行SQL的方法:
(1)executeQuery()方法执行后返回单个结果集。通常用于select语句;
(2)executeUpdate()方法返回的是一个整数,指示受影响的行数。通常用于update,insert,delete语句。
关键:
一个PreparedStatement是从java.sql.connection对象和所提供的sql字符串得到的,sql字符串中包含问号(?),调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值。注意用setXXX方式设置时,需要与数据库中的字段类型对应,例如mysql中字段为varchar,就需要使用setString方法,如果为Date类型,就需要使用setDate方法来设置具体sql的参数.
例如:String sql = "select id,name from student where id=? andname=?"; PreparedStatement ps =conn.prepareStatement(sql); ps.setint(1,id); ps.setstring(2,name); ResultSet rs = ps.executeQuery();
3、ResultSet对象
ResultSet对象被称为结果集,它代表符合SQL语句的所有行,并且通过一套getXXX方法提供了对这些行中数据的访问。ResultSet里的数据一行一行排列,每一行又有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。如果我们想要获取某一条记录,就要使用ResultSet的next()方法;如果我们想要得到ResultSet里的所有记录,就要使用while循环。
🌈3. JDBC使用步骤总结
五部曲:创建数据库连接Connection -> 创建操作命令Statement -> 使用操作命令来执行SQL ->
处理结果集ResultSet - > 释放资源。
🌰栗子:查询studnet表中的学号为X的学生信息:
实现过程:
(1)文件1:a01_Connection.java文件(其中,关闭资源的时候要按照从后往前的顺序)
import com.mysql.cj.jdbc.MysqlDataSource;
import com.sun.deploy.util.SyncAccess;
import javax.rmi.CORBA.StubDelegate;
import javax.sql.ConnectionEvent;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Scanner;
public class a01_Connection {
/*
* 构建数据源——>获取连接——>写sql语句——>执行sql语句并获取结果——>释放数据源
*/
//定义一个数据源对象
private static DataSource dataSource = null;
//数据库的用户名
private static final String USER = "root";
//数据库的密码
private static final String PASSWORD = "123456";
//数据库连接的字符串
private static final String URL = "jdbc:mysql://127.0.0.1:3306/java78?" +
"characterEncoding=utf8&useSSL= true&serverTimezone=Asia/Shanghai";
public static void main(String[] args) {
//1、初始化数据源
MysqlDataSource mysqlDataSource = new MysqlDataSource();
//2、设置连接的参数
mysqlDataSource.setURL(URL);
mysqlDataSource.setUser(USER);
mysqlDataSource.setPassword(PASSWORD);
//3、将构建好的MySQL数据源赋值给JDBC中的datasource
dataSource = mysqlDataSource;
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
//1、通过数据源获取一个数据库连接
connection = dataSource.getConnection();
//接收用户输入的值
System.out.println("请输入学号 ->");
Scanner sc = new Scanner(System.in);
String sn = sc.next();
//2、定义SQL语句
String sql = "select * from student where sn = ?";
System.out.println("sql-->" + sql);
//3、获取statement对象
//获取一个预处理对象
statement = connection.prepareStatement(sql);
//处理占位符的值
statement.setString(1,sn);
//4、执行sql语句
resultSet = statement.executeQuery();
//5、解析结果集,resultSet.next()表示结果集中是否有记录
if(resultSet.next()){
//创建表示结果的java对象
Student student = new Student();
//依次获取结果集中的数据并赋值给java对象
student.setId(resultSet.getInt(1));
student.setSn(resultSet.getString(2));
student.setName(resultSet.getString(3));
student.setMail(resultSet.getString(4));
student.setClassesId(resultSet.getInt(5));
//打印结果
System.out.println(student);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//依次关闭资源
if(resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭资源
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
(2)文件2:Studnet.java(里面创建的所有的变量id,sn,name mail,classesId都一一对应数据库中student表中的字段名)
public class Student {
private int id;
private String sn;
private String name;
private String mail;
private int classesId;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public int getClassesId() {
return classesId;
}
public void setClassesId(int classesId) {
this.classesId = classesId;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", sn='" + sn + '\'' +
", name='" + name + '\'' +
", mail='" + mail + '\'' +
", classesId=" + classesId +
'}';
}
}
(3)工具类
package sqlConnection.utils;
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
public class DBUtils {
//定义一个数据源对象
private static DataSource dataSource = null;
//数据库的用户名
private static String USER = "root";
//数据库的密码
private static String PASSWORD = "123456";
//数据库的连接字符串
private static final String URL = "jdbc:mysql://127.0.0.1:3306/java78?" +
"characterEncoding=utf8&useSSL= true&serverTimezone=Asia/Shanghai";
static {
//获取一个数据源对象
MysqlDataSource mysqlDataSource = new MysqlDataSource();
//初始化数据源
mysqlDataSource.setURL(URL);
mysqlDataSource.setUser(USER);
mysqlDataSource.setPassword(PASSWORD);
//将获取到的数据源对象赋值给JDBC中的datasource
dataSource = mysqlDataSource;
}
//使用private修饰构造方法,使外部不能new这个类的对象
private DBUtils(){};
/**
* 函数作用获取一个数据库连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 函数作用:关闭对象并释放资源
* @param resultSet
* @param statement
* @param connection
*/
public static void close(ResultSet resultSet, PreparedStatement statement, Connection connection){
//依次关闭对象,释放资源
if(resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
查询结果: