文章目录
- 1、对JDBC本质的理解
- 2、代码模拟JDBC的本质
- 3、JDBC编程的六步
- 4、通过类加载的方式注册驱动
- 5、属性配置文件与JDBC
- 6、处理查询结果集
1、对JDBC本质的理解
Java DataBase Connectivity(Java语言连接数据库),其本质是SUN公司指定的一套接口(interface),这套接口在 java.sql.* 下
既然是一套接口,接口都有调用者和实现者,面向接口调用,面向接口写实现类,都属于面向接口编程。面向接口编程的优势是解耦合,降低程序的耦合度,提高程序的扩展力。
驱动:
数据库的驱动大多以jar包的形式存在,解压后得到很多class文件,这些class文件就是对JDBC接口的实现,驱动由各大数据库厂家提供。
2、代码模拟JDBC的本质
SUN公司提供接口规范:
/**
* SUN公司提供
*/
public interface JDBC {
//连接数据库的方法
void getConnection();
}
各数据库厂商面向接口写各自的实现类,称驱动:
/**
* 数据库厂商角色,如MySql
* 编写JDBC接口的实现类,称为驱动
*/
public class MySQL implements JDBC{
@Override
public void getConnection() {
//这里写MySQL底层的一些具体实现
System.out.println("连接MySQL成功");
}
}
用户面向接口编程:
/**
* Programmer面向接口编程
*/
public class JavaProgrammer {
public static void main(String[] args) {
JDBC jdbc = new MySQL();
jdbc.getConnection();
}
}
运行效果:
3、JDBC编程的六步
- 注册驱动:告诉Java程序,即将要连接的是哪个品牌的数据库
- 获取连接:表示JVM进程和数据库进程之间的通道打开,属于进程之间的通信
- 获取数据库操作对象:即专门执行SQL语句的对象
- 执行SQL语句:DQL、DML…
- 处理查询结果集:只有上一步是SELECT查询语句的时候,才有这一步
- 释放资源:资源使用完成后,关闭资源
IDEA配置JDBC驱动—方式一
MySQL驱动下载地址:http://dev.mysql.com/downloads/connector/j/
解压完成后,将驱动(jar包)复制到对应工程的lib目录下,右键Add as a library
IDEA配置JDBC驱动—方式二
在对应模块上右键,选择open Moudle Setting
选择Libraries后点击加号
选择对应的jar驱动包,点击OK
选择对应需要添加的模块后点击OK
代码实现:
import java.sql.*;
public class JdbcTest {
public static void main(String[] args) {
Connection conn = null;
Statement statement = null;
try {
/**
* 注册驱动
*/
Driver driver = new com.mysql.cj.jdbc.Driver(); //多态,左边的是Driver接口java.sql.Driver,右边的是MySQL的实现类Driver
DriverManager.registerDriver(driver);
/**
* 获取连接
*/
String url = "jdbc:mysql://127.0.0.1:3306/testDB";
String user = "root";
String password = "code9527";
conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接对象:" + conn);
/**
* 获取数据库操作对象
*/
statement = conn.createStatement();
/**
* 执行SQL语句
*/
String sql = "insert into dept(deptno,dname,loc) VALUES (001,'研发','天津')";
int count = statement.executeUpdate(sql);
System.out.println(count == 1 ? "保存成功" : "保存失败");
/**
* 处理查询结果集
* 上面不是SELECT,暂时不管
*/
} catch (SQLException e) {
e.printStackTrace();
} finally {
/**
* 在finally中释放资源,确保被一定关闭
* 从小到大依次关闭,分别try..catch
*/
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
☀ 代码格式化调整快捷键Alt+Ctrl+L
- 注意区分两个Driver:
java.sql.Driver 是Java提供的Driver接口
com.mysql.jdbc.Driver 是MySQL厂商写的MySQL驱动类,实现了上面的Driver接口
- int executeUpdate(String sql)方法是用来执行INSERT、UPDATE、DELETE语句的,返回值是“影响数据库中记录的条数”,如上面程序中插入了一条数据,则返回1
运行结果:
4、通过类加载的方式注册驱动
分析com.mysql.jdbc.Driver的源代码,发现其在静态代码块中进行了注册驱动的操作:
而类加载的时候会执行静态代码块:(小复习)
所以可以通过调用forName方法让类加载进而来注册驱动,这时也不用接收返回值,因为我们要的仅仅是类加载这个动作:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcTest1 {
public static void main(String[] args) {
Connection conn= null;
Statement statement = null;
try{
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","95279527");
//获取数据库操作对象
statement = conn.createStatement();
//执行SQL语句
String sql = "UPDATE dept SET dname='智能研发' WHERE deptno=1";
int count = statement.executeUpdate(sql);
System.out.println(count == 1 ? "更新成功" : "更新失败");
}catch(ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
//关闭资源
}
}
}
牢记:通过类加载注册驱动 Class.forName(“com.mysql.cj.jdbc.Driver”);
运行后:
5、属性配置文件与JDBC
将驱动信息与数据库连接信息全部写入properties配置文件:
实际开发中,不要把数据库的信息写死在Java程序中。引入配置文件后:
6、处理查询结果集
返回的结果集对象是如下的一个东西:
-
光标(resourceSet.next())返回true,说明这一行有数据。调用getString()方法取出数据即可。
-
getString()方法:不管数据库中的数据类型是什么,都以String类型取出
-
getString方法可以传入列的下标(JDBC中下标从1开始),也可以传入列名,但后者更加健壮
-
getString方法传入列名的时候,传入的是查询结果集的列名。如下:此时,传入getString的应该是no,而不是deptno
Sting sql = "select deptno as no ,dname,loc from dept";
- 和getString类比,想以int类型取出数据,则用getInt(),依此有getDouble()等。这样拿出来以后就可以直接做数学运算了
- close的时候,根据关系,应该是先resultSet再statement,最后是conn
完整代码:
import java.sql.*;
import java.util.ResourceBundle;
public class JdbcTest3 {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
statement = conn.createStatement();
String sql = "SELECT deptno as no,dname,loc FROM dept";
/**
* executeQuery方法是专门执行查询语句的(DQL),返回时ResultSet类型
* executeUpdate是专门执行增删改语句的,返回时int
*/
resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int deptno = resultSet.getInt("no");
String dname = resultSet.getString("dname");
String loc = resultSet.getString("loc");
System.out.println(deptno + " " + dname + " " + loc);
}
} catch (Exception 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(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
运行结果: