个人觉得JDBC在Java的学习中比较重要,实现了数据库与Java的代码的互动,所以还是写一篇文章来巩固一下
为了在Java语言中提供对数据库访问的支持,Sun公司于1996年提供了一套访问数据库的标准Java类库JDBC。JDBC的全称是Java数据库连接(Java Database Connectivity)它是一套用于执行 SQL语句的Java API。应用程序可通过这套API连接到关系数据库完成对数据库中数据的査询、更新和删除等操作。
JDBC是SUN公司制定的一套接口(interface)
目的:解耦合——>降低程序的耦合度,提高程序的扩展力
第一步:加载驱动(作用为:告诉Java程序,即将连接那个品牌的数据库)
反射的方式加载数据库驱动,代码如下:
Class.forName(“com.mysql.jdbc.Driver”);
第二步: 创建连接(表示JVM的进程和数据库进程之间的通道打开)
利用java.sql.Drivermanager类中的getConnection()方法与数据库建立连接。
DriverManager.getConnection(“jdbc:mysql://数据库地址:端口号/数据库名”,”用户名”, “密码”);
第三步: 获取数据库操作对象(专门执行sql语句的对象)
利用java.sql.Connection创建用于执行SQL语句的Statement。(建议使用Statement的子类preparedStatement)
Statement statement = connection.createStatement();
第四步: 执行sql语句
利用java.sql.Statement执行SQL语句,其常用方法如下:
execute(String sql ) 该方法可以执行任意SQL语句。当且仅当执行select语句且有返回结果时该方法返回true, 其他情况下该方法返回false
executeUpdate(String sql ) 该方法常用于执行DML( INSERT、UPDATE或DELETE)和DDL语句。执行DML语句时返回受SQL语句影响的行数,执行DDL语句时返回0
executeQuery( String sql) 该方法通常执行査询语句,执行后返回代表结果集的ResultSet对象
ResultSet resultSet = statement.executeQuery(sql);
第五步: 处理查询结果集(只有第四步执行的是查询语句时,才有处理结果集)
在从ResultSet中获取到数据库中数据后,我们就将这些数据封装到JavaBean中。在此请注意Java的数据类型与数据库的数据类型的对应关系:
数据库中的数据类型 | Java的数据类型 |
---|---|
int | int |
smallint | short |
bigint | long |
tityint | byte |
float | float |
double | double |
charvarchar | String |
date | Date |
第六步: 释放资源(使用完之后需要关闭资源。Java和数据库属于进程之间的通信,开启之后一定要关闭)
数据库资源非常宝贵,数据库允许的并发访问连接数量有限。因此,当数据库资源用完后切记释放资源。为了保证资源的释放,常在finally代码块中关闭与数据库操作相关的资源。
请添加MySQL所需jar包(例如:mysql-connector-java-5.1.7-bin.jar)至Java项目lib文件夹中并执行Build Path,如下图所示位置:
sql命令如下(在数据库中mydb建立student表并存入数据):
-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;
-- 创建学生表
CREATE TABLE student (
studentid INT,
studentname VARCHAR(50)
);
-- 向学生表插入数据
INSERT INTO student (studentid,studentname) VALUES (1,"张三");
INSERT INTO student (studentid,studentname) VALUES (2,"李四");
INSERT INTO student (studentid,studentname) VALUES (3,"王五");
INSERT INTO student (studentid,studentname) VALUES (4,"赵六");
DOS窗口运行结果如下:
代码如下(学生类的JavaBean):
public class Student {
private int studentID;
private String studentName;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int studentID, String studentName) {
super();
this.studentID = studentID;
this.studentName = studentName;
}
public int getStudentID() {
return studentID;
}
public void setStudentID(int studentID) {
this.studentID = studentID;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
@Override
public String toString() {
return "Student [studentID=" + studentID + ", studentName=" + studentName + "]";
}
}
代码如下(示例):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectTest {
public static void main(String[] args) {
JDBCSelectTest jdbcSelectTest = new JDBCSelectTest();
jdbcSelectTest.findAllStudent();
}
private void findAllStudent() {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 1、启动驱动
Class.forName("com.mysql.jdbc.Driver");
// 2、建立连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
// 3、获取数据库操作对象
String sql = "select * from student";
preparedStatement = connection.prepareStatement(sql);
// 4、执行sql语句
resultSet = preparedStatement.executeQuery();
// 5、处理结果集
while (resultSet.next()) {
Student student = new Student();
int id = resultSet.getInt("studentid");
String name = resultSet.getString("studentname");
student.setStudentID(id);
student.setStudentName(name);
System.out.println(student);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6、关闭资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
resultSet = null;
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
preparedStatement = null;
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connection = null;
}
}
}
}
代码如下(输出):
Student [studentID=1, studentName=张三]
Student [studentID=2, studentName=李四]
Student [studentID=3, studentName=王五]
Student [studentID=4, studentName=赵六]
JavaBean 还有数据表我就继续用上面准备好的就行。
这里我只演示“增”(即向学生表中添加一条数据),其他的“删”和“改”基本过程都一样,只有sql语句和站位符位置不一样,留给大家自由探索
代码如下(示例):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCAddTest {
public static void main(String[] args) {
JDBCAddTest jdbcAddTest = new JDBCAddTest();
jdbcAddTest.addStudent();
}
private void addStudent() {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 1、启动驱动
Class.forName("com.mysql.jdbc.Driver");
// 2、建立连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
// 3、获取数据库操作对象
Student student = new Student(5, "jack");
String sql = "insert into student values(?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(2, student.getStudentName());
preparedStatement.setInt(1, student.getStudentID());
// 4、执行sql语句
int executeUpdate = preparedStatement.executeUpdate();
System.out.println(executeUpdate);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6、关闭资源
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
preparedStatement = null;
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connection = null;
}
}
}
}
代码如下(输出):
这里输出的1代表的是数据库中有一条数据受到了影响(如果是其他的数值的返回对相应的就是数据库中有几条数据被影响了)
1
为了保险起见查看一下数据库中的学生表
这里面需要注意的是,第五步执行sql语句的时候执行查询是preparedStatement.executeQuery(),而其他三个操作是preparedStatement.executeUpdate()对于刚开始学的人,特别需要注意。
关于JDBC的扩展可以参考以下文章: