先阐述一下JDBC的一些核心API
java.sql.* JDBC规范都是当前包内
java.sql.DriverManager 驱动管理类,工具类
–| static void registerDriver(java.sql.Driver driver); 注册加载驱动,提供给当前程序使用
–| static java.sql.Connection getConnection(String url, String user, String password);
获取当前数据库连接对象,对应的URL,user,和password
interface java.sql.Connection 数据库连接接口
–| java.sql.Statement createStatement(); 获取数据库SQL语句搬运工,只是把SQL语句搬运到MySQL数据库中,不会对SQL语句做任何的判断。
–| java.sql.PreparedStatement PrepareStatement(String sql); 获取数据库SQL语句的预处理对象,可以预处理SQL语句,判断一些SQL异常,降低MySQL数据库压力,提供执行效率
interface java.sql.Statement 数据库SQL语句搬运工
–| int executeUpdate(String sql); 执行insert, update, delete, create, drop这些修改数据库内容提供的语句,返回值类型是int类型,返回的数据是当前SQL语句执行MySQL数据操作受到影响的行数
–| java.sql.ResultSet executeQuery(String sql); 执行select语句,获取到数据库查询结果集对象。ResultSet Never null
interface java.sql.PreparedStatement 数据库SQL语句预处理搬运工 【重点】
–| int executeUpdate(); 执行在获取PreparedStatement实现类对象时预处理SQL语句,insert,update,delete,主要操作的内容是对于数据库的数据修改。能够有效的防止【SQL注入】
–| java.sql.ResultSet executeQuery(); 执行在获取PreparedStatement实现类对象时预处理SQL语句,select语句,获取查询结果集对象。能够有效的防止【SQL注入】
–| setXXX(int index, Object value); 设计SQL语句执行所需参数
setInt setFloat set
interface java.sql.ResultSet 查询结果集
–| boolean next(); 判断当前结果集对象是否可以继续遍历
–| XXX getXXX(int index); 获取指定下标对应字段的数据
–| XXX getXXX(String fieldName); 获取指定字段名对应的数据
对应db.properties文件
user=root
password=123456
url=jdbc:mysql://localhost:3306/javaeestudy?useSSL=true
driverClass=com.mysql.jdbc.Driver
封装
package util;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
*/
public class JdbcUtil {
// 准备一些必要的参数
private static String user = null;
private static String password = null;
private static String url = null;
// 1. 使用静态代码块,完成当前程序的一些初始化参数过程
static {
try {
// Properties 属性类,保存的数据形式都是键值对形式,用于从文件中读取内容
Properties properties = new Properties();
// 创建db.properties文件的字节输入流对象
InputStream in = new FileInputStream("./src/db.properties");
// Properties加载对应的db.properties
properties.load(in);
// 从db.properties读取对应的属性
user = properties.getProperty("user");
password = properties.getProperty("password");
url = properties.getProperty("url");
Class.forName(properties.getProperty("driverClass"));
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
/**
* 对当前工具类外提供的获取数据库连接对象的方法
*
* @return java.sql.Connection 数据库连接对象,如果连接失败返回null
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 数据库连接对象关闭方法
* @param connection java.sql.Connection 数据连接对象
*/
public static void close(Connection connection) {
close(connection, null, null);
}
/**
* 关闭数据库连接对象,statement数据库搬运工对象
* @param connection java.sql.Connection 数据连接对象
* @param statement java.sql.Statement 数据库SQL语句搬运工对象
*/
public static void close(Connection connection, Statement statement) {
close(connection, statement, null);
}
/**
* 关闭数据库连接对象,statement数据库搬运工对象,resultSet查询结果集对象
* @param connection java.sql.Connection 数据连接对象
* @param statement java.sql.Statement 数据库SQL语句搬运工对象
* @param resultSet java.sql.ResultSet 查询结果集对象
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
使用C3P0线程池和jar包
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/javaeestudy?useSSL=true root 123456 5 5 10 40 200 5package util;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.*;
public class JdbcUtil {
/*
创建C3P0数据库连接池对象工具,会自动加载在src目录下的c3p0-config.xml文件
*/
private static ComboPooledDataSource pool = new ComboPooledDataSource();
/**
* 对当前工具类外提供的获取数据库连接对象的方法
*
* @return java.sql.Connection 数据库连接对象,如果连接失败返回null
*/
public static Connection getConnection() {
Connection conn = null;
try {
// 获取数据库连接从数据库连接池对象中获取
conn = pool.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 数据库连接对象关闭方法
* @param connection java.sql.Connection 数据连接对象
*/
public static void close(Connection connection) {
close(connection, null, null);
}
/**
* 关闭数据库连接对象,statement数据库搬运工对象
* @param connection java.sql.Connection 数据连接对象
* @param statement java.sql.Statement 数据库SQL语句搬运工对象
*/
public static void close(Connection connection, Statement statement) {
close(connection, statement, null);
}
/**
* 关闭数据库连接对象,statement数据库搬运工对象,resultSet查询结果集对象
* @param connection java.sql.Connection 数据连接对象
* @param statement java.sql.Statement 数据库SQL语句搬运工对象
* @param resultSet java.sql.ResultSet 查询结果集对象
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
URL 统一资源定位符,地址
jdbc:mysql://localhost:3306/数据库名?useSSL=true
jdbc: JDBC规范的总协议
mysql: 目前的数据库选择,并且是子协议
//localhost:3306: 数据库的主机名,IP地址 3306是MySQL数据库的默认端口号
/javaee1906: 告知MySQL数据库,目前操作的数据库是javaee1906 ==> use javaee1906
JDBC的URL=协议名+子协议名+数据源名。
a 协议名总是“jdbc”。
b 子协议名由JDBC驱动程序的编写者决定。
c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
几种常见的数据库连接
-------------------------------oracle------------------
驱动:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@machine_name:port:dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1521
-------------------------------mysql-------------------
驱动:com.mysql.jdbc.Driver
URL:jdbc:mysql://machine_name:port/dbname
注:machine_name:数据库所在的机器的名称;
port:端口号,默认3306
---------------------------SQL Server------------------
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://
注:machine_name:数据库所在的机器的名称;
port:端口号,默认是1433