概述
- JDBC是什么?
Java DataBase Connectivity(Java语言连接数据库) - JDBC的本质是什么?
1、JDBC是SUN公司制定的一套接口(interface)
java.sql.*;
(这个软件包下有很多接口)
2、接口都有调用者和实现者。面向接口调用、面向接口写实现类。这都属于面向接口编程。
数据库驱动
1、不同的数据库管理系统有不同的数据库驱动(MySQL、Oracle、SqlServer...)。
2、所有的数据库驱动都是以jar包的形式存在,jar包当中有很多class文件,这些class文件就是对JDBC接口的实现。
3、驱动不是SUN公司提供的,是各大数据库厂家负责提供,下载驱动jar包需要去数据库宫网下载。
JDBC编程六步
- 概述
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示JVM进程和数据库进程之间的通道打开了,属于进程之间的通信,(重量级的)便用完之后一定要关闭。
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行SQL语句(DQL、DML...)
第五步:处理查询结果集。(只有当第四步执行的是select语句的时候,才有这一步)
第六步:释放资源。(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。) - 关于六个步骤的一些方法
1、static void registerDriver(Driver driver)
(java.sql.Driver)
注册与给定的驱动程序DriverManager 。
2、static Connection getConnection(String url, String user, String password)
(java.sql.DriverManager)
尝试建立与给定数据库URL的连接。 - 关于URL
1、URL:统一资源定位符(网络中某个资源的绝对路径)
https://www.baidu.com/
这就是URL
2、URL包括哪几部分?
通信协议、IP、PORT、资源名
3、例子:
http://14.215.177.39/index.html
http://:通信协议
182.61.200.7:服务器IP地址
80:服务器上软件的端口
index.html:是服务器上某个资源名
4、解释jdbc:mysql://localhost:3306/powernode
jdbc:mysql://:协议
127.0.0.1:IP地址
3306:MySQL数据库端口号
powernode:具体的数据库实例名。
说明:localhost和127.0.0.1都是本机IP地址。
3、Statement createStatement()
(java.sql.Connection)
创建一个Statement对象,用于将SQL语句发送到数据库。
4、int executeUpdate(String sql)
(java.sql.Statement)
执行给定的SQL语句,这可能是 INSERT,UPDATE,或DELETE语句(DML语句),或者不返回任何内容。返回值是"影响数据库中的记录条数"。
代码示例
package JDBCTest;
import java.sql.*;
public class Test {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
/*第一步:注册驱动*/
Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
/*第二步:获取连接*/
String url= "jdbc:mysql://localhost:3306/powernode?serverTimezone=UTC";
String user = "root";
String password = "数据库密码";
conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接对象 = "+conn);
/*第三步:获取数据库操作对象*/
stmt = conn.createStatement();
/*第四步:执行SQL语句*/
//JDBC的SQL语句不需要写分号
String sql = "insert into dept(deptno,dname,loc) values(50,'人事部', '成都')";
int count = stmt.executeUpdate(sql);
System.out.println(count==1 ? "保存成功" : "保存失败");
/*第五步:处理查询结果集*/
}catch (SQLException e){
e.printStackTrace();
}finally {
/*第六步:释放资源*/
/*为了保证资源一定释放,
在finally语句块中关闭资源
并且要遵循从小到大依次关闭。*/
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
JDBC执行删除与更新
JDBC执行删除
package JDBCTest;
import java.sql.*;
public class Test {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
/*第一步:注册驱动*/
Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
/*第二步:获取连接*/
String url= "jdbc:mysql://localhost:3306/powernode?serverTimezone=UTC";
String user = "root";
String password = "密码";
conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接对象 = "+conn);
/*第三步:获取数据库操作对象*/
stmt = conn.createStatement();
/*第四步:执行SQL语句*/
String sql = "delete from dept where deptno = 60";
int count = stmt.executeUpdate(sql);
System.out.println(count==1 ? "删除成功" : "删除失败");
/*第五步:处理查询结果集*/
}catch (SQLException e){
e.printStackTrace();
}finally {
/*第六步:释放资源*/
/*为了保证资源一定释放,
在finally语句块中关闭资源
并且要遵循从小到大依次关闭。*/
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
JDBC执行更新
package JDBCTest;
import java.sql.*;
public class Test {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
/*第一步:注册驱动*/
Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
/*第二步:获取连接*/
String url= "jdbc:mysql://localhost:3306/powernode?serverTimezone=UTC";
String user = "root";
String password = "密码";
conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接对象 = "+conn);
/*第三步:获取数据库操作对象*/
stmt = conn.createStatement();
/*第四步:执行SQL语句*/
String sql = "update dept set dname = '项目部' where deptno = 50";
int count = stmt.executeUpdate(sql);
System.out.println(count==1 ? "更新成功" : "更新失败");
/*第五步:处理查询结果集*/
}catch (SQLException e){
e.printStackTrace();
}finally {
/*第六步:释放资源*/
/*为了保证资源一定释放,
在finally语句块中关闭资源
并且要遵循从小到大依次关闭。*/
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
注册驱动的另外一种方式(最常用)
- 利用反射机制
1、利用反射机制来加载Driver类,利用类中的静态代码块实现对驱动的注册。
2、com.mysql.cj.jdbc
包下的Driver方法中有这样一个静态代码块:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
3、原来的注册驱动方法:
DriverManager.registerDriver(
new com.mysql.cj.jdbc.Driver());
4、利用反射机制的方法:
Class.forName("com.mysql.cj.jdbc.Driver");
- 为什么这种方式常用?
1、因为参数是一个字符串,字符串可以写到xxx.properties文件中。
2、该方法不需要接收返回值,因为我们只想用它的类加载动作。
从属性资源文件中读取数据库信息
1、properties文件:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/powernode?serverTimezone=UTC
user=root
password=密码
2、
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
public class Demo {
public static void main(String[] args) {
/*使用资源绑定器绑定属性配置文件*/
ResourceBundle bundle = ResourceBundle.getBundle("jdbc.info");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
Connection conn = null;
Statement stmt = null;
try{
/*第一步:注册驱动*/
Class.forName(driver);
/*第二步:获取连接*/
conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接对象 = "+conn);
/*第三步:获取数据库操作对象*/
stmt = conn.createStatement();
/*第四步:执行SQL语句*/
String sql = "insert into dept values(60,'人事部','广州')";
int count = stmt.executeUpdate(sql);
System.out.println(count==1 ? "添加成功" : "添加失败");
/*第五步:处理查询结果集*/
}catch (SQLException | ClassNotFoundException e){
e.printStackTrace();
}finally {
/*第六步:释放资源*/
/*为了保证资源一定释放,
在finally语句块中关闭资源
并且要遵循从小到大依次关闭。*/
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
处理查询结果集
相关方法
1、ResultSet executeQuery(String sql)
执行给定的SQL语句,该语句返回单个ResultSet对象。其中SQL语句通常为静态SQL的SELECT语句。
2、boolean next()
将光标从当前位置向前移动一行。ResultSet光标最初位于第一行之前; 第一次调用方法next使第一行成为当前行; 第二个调用使第二行成为当前行,依此类推。
3、
a)int getInt(int columnIndex)/(String columnLabel)
b)String getString(int columnIndex)/(String columnLabel)
c)double getDouble(int columnIndex)/(String columnLabel)
这个检索的当前行中指定列的值ResultSet对象分别为int、String、double的Java编程语言。
代码示例
配置文件不变
package jdbc;
import java.sql.*;
import java.util.ResourceBundle;
public class Test {
public static void main(String[] args) {
/*使用资源绑定器绑定属性配置文件*/
ResourceBundle bundle = ResourceBundle.getBundle("jdbc.info");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
/*第一步:注册驱动*/
Class.forName(driver);
/*第二步:获取连接*/
conn = DriverManager.getConnection(url, user, password);
/*第三步:获取数据库操作对象*/
stmt = conn.createStatement();
/*第四步:执行SQL语句*/
String sql = "select empno,ename,sal from emp";
rs = stmt.executeQuery(sql);
/*第五步:处理查询结果集*/
while (rs.next()){
//JDBC所有的下标从1开始
int empno = rs.getInt(1);
/*也可以用(查询结果集的)列名称来获取*/
String ename = rs.getString("ename");
double sal = rs.getDouble(3);
System.out.println(empno+","+ename+","+sal);
}
}catch (SQLException | ClassNotFoundException e){
e.printStackTrace();
}finally {
/*第六步:释放资源*/
/*为了保证资源一定释放,
在finally语句块中关闭资源
并且要遵循从小到大依次关闭。*/
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}