文章目录
1.开发需要使用的包
java.sql : 所有与 JDBC 访问数据库相关的接口和类
javax.sql : 数据库扩展包,提供数据库额外的功能。如:连接池
数据库的驱动: 由各大数据库厂商提供,需要额外去下载,是对 JDBC 接口实现的类
2. 使用
2.1 核心API
DriverManager 类 | 1) 管理和注册数据库驱动 |
2) 得到数据库连接对象 | |
Connection 接口 | 一个连接对象,可用于创建 Statement 和 PreparedStatement 对象 |
Statement 接口 | 一个 SQL 语句对象,是 Statement 的子接口 |
ResultSet 接口 | 用于封装数据库查询的结果集,返回给客户端 Java 程序 |
2.2 加载和注册驱动
Class.forName | 加载和注册数据库驱动,数据库驱动由 mysql 厂商 "com.mysql.jdbc.Driver" |
2.3 使用DriverManager类
使用方法:
Connection getConnection (String url, String user, String password) | 通过连接字符串,用户名,密码来得到数据 库的连接对象 |
Connection getConnection (String url, Properties info) | 通过连接字符串,属性对象来得到连接对象 |
参数说明
用户名 | 登录的用户名 |
密码 | 登录的密码 |
连接字符串 URL | 不同的数据库 URL 是不同的,mysql 的写法 jdbc:mysql://localhost:3306/数据库[?参数名=参数值] |
驱动类的字符串名 | com.mysql.jdbc.Driver |
2.4 Statement接口
-
JDBC访问数据库的步骤
注册和加载驱动(可以省略) -> 获取连接 -> Connection 获取 -> Statement 对象 -> 使用 Statement 对象执行 SQL 语句 -> 返回结果集 -> 释放资源 -
Statement的方法
int executeUpdate(String sql) | 用于发送 DML 语句,增删改的操作,insert、update、delete 参数:SQL 语句 返回值:返回对数据库影响的行数 |
ResultSet executeQuery(String sql) | 用于发送 DQL 语句,执行查询的操作。select 参数:SQL 语句 返回值:查询的结果集 |
- 释放资源
需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
释放原则:先开的后关,后开的先关。ResultSet -> Statement -> Connection
放在哪个代码块中:finally 块
2.5 ResultSet接口
作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。
boolean next() | 游标向下移动 1 行 返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false |
数据类型 getXxx() | 通过字段名,参数是 String 类型。返回不同的类型 通过列号,参数是整数,从 1 开始。返回不同的类型 |
关于 ResultSet 接口中的注意事项:
- 如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set
- 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set
- 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection
3.案例
3.1 得到连接对象
package JDBC_use;
import java.lang.ProcessHandle.Info;
import java.sql.Connectio
n;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class Demo1Connect {
public static void conByUrl(String url){
try(Connection connection = DriverManager.getConnection(url, "root", "***")){
System.out.println(connection);
}catch(SQLException e){
e.printStackTrace();
}
}
public static void conByInfo(String url){
try{
Properties Info = new Properties();
Info.setProperty("user", "root");
Info.setProperty("password", "***");
Connection connection = DriverManager.getConnection(url, Info);
System.out.println(connection);
}catch(SQLException e){
e.printStackTrace();
}
}
public static void main(String[] args){
String url = "jdbc:mysql://localhost:3306/learn_sql";
conByInfo(url);
}
}
3.2 执行DDL(Data Definition Language)操作
使用JDBC在Mysql中创建学生表
package JDBC_use;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
public class DemoCreate {
public static void main(String[] args){
Connection con = null;
Statement state = null;
try{
//1.创建连接
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/learn_sql", "root", "***");
//2.得到语句对象
state = con.createStatement();
state.executeUpdate("create table if not exists student (id INT PRIMARY KEY AUTO_INCREMENT," +
"name varchar(20) not null, gender boolean, birthday date)");
System.out.println("创建成功");
}catch(SQLException e){
e.printStackTrace();
}finally{
if(con != null){
try{con.close();}
catch(SQLException e){
e.printStackTrace();
}
}
if(state != null){
try{
state.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
}
3.3 执行DML(Data Manipulation Language)操作
package JDBC_use;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo5DML {
public static void main(String[] args){
Connection con = null;
Statement sta = null;
try{
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/learn_sql", "root", "***");
sta = con.createStatement();
int count = 0;
count += sta.executeUpdate("insert into student values (null, '孙悟空', 1, '1993-03-24'), "
+ "(null, '白骨精', 0, '1995-03-24'),"
+ "(null, '猪八戒', 1, '1993-03-24'),"
+ "(null, '嫦娥', 0, '1993-03-11')");
System.out.println("成功更新" + count + "条记录");
}catch(SQLException e){
e.printStackTrace();
}finally{
if(con != null){
try{con.close();}
catch(SQLException e){
e.printStackTrace();
}
}
if(sta != null){
try{sta.close();}
catch(SQLException e){
e.printStackTrace();
}
}
}
}
}
3.3 执行DQL(Data Query Language)操作
package JDBC_use;
import java.sql.*;
public class DemoDQL {
public static void main(String[] args){
Connection con = null;
Statement sta = null;
ResultSet rs = null;
try{
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/learn_sql", "root", "***");
sta = con.createStatement();
rs = sta.executeQuery("select * from student");
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
boolean gender = rs.getBoolean("gender");
Date birthday = rs.getDate("birthday");
System.out.println("id:" + id + " name:" + name + " gender:" + gender + " birthday:" + birthday);
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
rs.close();
con.close();
sta.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
4. JdbcUtil类
很明显,上述的代码太过冗余,我们需要将对应的代码抽象出来
package JDBC_use;
import java.sql.*;
public class JdbcUtils {
private static final String USER = "root";
private static final String PWD = "***";
private static final String URL = "jdbc:mysql://localhost:3306/learn_sql";
private static final String DRIVER = "com.mysql.jdbc.Driver";
//注册驱动
static{
try{
Class.forName(DRIVER);
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection con = null;
try{
con = DriverManager.getConnection(URL, USER, PWD);
}catch(SQLException e){
e.printStackTrace();
}
return con;
}
public static void close(Connection conn, Statement sta){
if(sta != null){
try{
sta.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
public static void close(Connection conn, Statement sta, ResultSet rs){
if(rs != null){
try{
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
}
close(conn, sta);
}
}