JDBC,是Java的数据库连接,是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范.它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.
JDBC的工作原理
JDBC为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类.
JDBC的使用
共分5步骤:
1 建立数据库连接
2 创建操作命令
3执行SQL语句
4 处理结果集
5 释放资源
- 建立数据库连接
//加载JDBC驱动程序:反射,这样调用初始化com.mysql.jdbc.Driver类,即将该类加载到JVM方法区,并执行该类的静态方法块,静态属性.
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
//MySQL数据连接的URL参数格式如下
//jdbc:MySQL://服务器地址:端口/数据库名?参数名=参数值
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mall?user = root&password=root&useUnicode = true&characterEndcoding=UTF-8");
- 创建操作命令
Statement statement = connection.createStatement();
- 执行SQL语句
ResultSet resultSet = statement.executeQuery("select id,name,qq_mail,classes_id from student");
- 处理结果集
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int classes_id = resultSet.getInd("classes_id");
System.out.println(String.format("Studeng:id=%d,name=%s,classes_id=%s,id,name,classes_id));
- 释放资源
//关闭结果集
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();
}
}
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
- 一种是通过DriverManager(驱动管理类)的静态方法获取
//加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库的连接
Connection connection = DriverManager.getConnection(url);
- 一种是通过DataSource(数据源)对象获取,实际应用中会使用DataSource.
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();
这两种方式的区别是:
- DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接.
- DataSource提供连接池的支持,连接池在初始化时将创建一定数量的数据库连接,这些连接是可以重复使用的,每次使用完数据库连接,释放资源调用的connection.close()都是将Connection连接对象回收.
Statement对象
Statement对象主要是将SQL语句发送到数据库中,JDBC API中主要提供了三种Statement对象
-
Statement
用于执行不带参数的简单SQL语句 -
PreparedStatement
用于执行带或者不带参数的SQL语句
SQL语句会预编译在数据库系统
执行速度快于Statement -
CallableStatement
用于执行数据库存储过程的调用
实际开发中最常用的是PreparedStatement
- 参数化SQL查询
- 性能比Statement高
- SQL预编译
- 占位符不能使用多值
- 阻止常见SQL注入攻击
- 占位符: ? 下标从1开始
ResultSet对象
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问.
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行,我们如果想要取得某一条记录,就要使用ResultSet的next()方法,如果我们想要得到ResultSet里的所有记录,就应该使用while循环.
package com.matajie;
import java.math.BigDecimal;
import java.sql.*;
import static java.lang.Class.forName;
public class DBUtil {
private static final String URL = "jdbc:mysql://47.108.208.185:3306/mall";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Statement statement = null;
ResultSet resultSet = null;
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
System.out.println(connection);
statement = connection.createStatement();
String sql = "select id,name,chinese,math,english" + " from exam_result";
resultSet = statement.executeQuery(sql);
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
BigDecimal chinese = resultSet.getBigDecimal("chinese");
BigDecimal math = resultSet.getBigDecimal("math");
BigDecimal english = resultSet.getBigDecimal("english");
System.out.printf("id = %s,name = %s,chinese = %s,math = %s,english = %s",id,name,chinese,math,english);
System.out.println();
}
//ResultSet 类似 List<Map<String,Object>>
if(resultSet != null){
connection.close();
}
if(statement != null){
connection.close();
}
if(connection != null){
connection.close();
}
}
}