一、概念
1、JDBC(Java Data Base Connectivity,Java数据库连接)
是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
2、数据库驱动
我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。
二、JDBC由两层构成
三、步骤
- ①加载JDBC驱动程序
- ②建立数据库连接Connection
- ③创建执行SQL的语句Statement
- ④处理执行结果ResultSet
- ⑤释放资源
使用后依次关闭对象及连接:ResultSet → Statement → Connection
四、常用接口
1、Driver接口
-
Driver接口由数据库厂家提供,对于Java开发者而言,只需要使用Driver接口就可以了。 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。
-
驱动:就是各个厂商实现Sun公司提出的JDBC接口。即对Connection等接口的实现类的jar文件。
-
装载mysql驱动:Class.forName(“com.mysql.jdbc.Driver”);
-
装载oracle驱动:Class.forName(“com.jdbc.driver.OracleDriver”);
查阅API文档:
2、Connection接口
-
Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。
-
连接MySql数据库:Connection conn = DriverManager.getConnection(“jdbc:mysql://host:port/database”, “user”, “password”);
-
连接Oracle数据库:Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@host:port:database”, “user”, “password”);
-
连接SqlServer数据库:Connection conn = DriverManager.getConnection(“jdbc:microsoft:sqlserver://host:port; DatabaseName=database”, “user”, “password”);
-
常用方法:
close()----- 关闭该数据库连接
commit()------ 提交所有更改内容(事务)并释放该Connection对象锁定的资源
createStatement()-----基于本Connection对象,创建Statement对象
getAutoCommit()-----获取当前是否是自动提交模式
getMetaData()---- 获取本连接相关的数据库元数据
isClosed()----- 返回当前连接对象是否已经被关闭
preparedStatement()------ 基于本连接对象,创建PreparedStatement对象
rollback()----- 取消本轮事务中前面已经提交的更改(回滚)
setAutoCommmit(boolean autoCommit)------- 设置事务是否自动提交
prepareCall(sql)--------创建执行存储过程的callableStatement对象。
3.Statement接口
-
用于执行静态SQL语句并返回它所生成结果的对象。
-
三种Statement类:
①Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
②PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
③CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。 -
常用Statement方法:
execute(String sql):运行语句,返回是否有结果集
executeQuery(String sql):运行select语句,返回ResultSet结果集。
executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
addBatch(String sql) :把多条sql语句放到一个批处理中。
executeBatch():向数据库发送一批sql语句执行。
4.ResultSet接口
- 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
- 常用方法:
close() ---------------- 关闭ResultSet对象
getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
getlnt(int collndex) ---------------- 以int形式获取结果集当前行指定列号值
getlnt(String colLabel) ---------------- 以int形式获取结果集当前行指定列名值
getFloat(String collndex) ---------------- 以float形式获取结果集当前行指定列名值
getFloat(String colLabel) ---------------- 以float形式获取结果集当前行指定列名值
getString(int collndex) ---------------- 以String形式获取结果集当前行指定列号值
getString(String colLable) ---------------- 以String形式获取结果集当前指定列名值
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
五、细节
1、注册驱动 (只进行一次)
记得进行异常处理
Class.forName("com.MySQL.jdbc.Driver");
2、建立连接
Connection conn = DriverManager.getConnection(url, user, password);
URL的格式:(第三行)
MySql:jdbc:mysql://localhost:xxx/xxx
六、例子一
简单的顺序输出表
/**
* 顺序查询
*/
package com.study.mysql.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test1 {
public static Connection conn;
public static Statement sql;
public static ResultSet rs;
public static final String url = "jdbc:mysql://localhost:3306/ming";
public static final String user = "root";
public static final String password = "******";
public Connection getConnection() {// 将连接数据库的方法放在一起
try {
Class.forName("com.mysql.jdbc.Driver");//注册驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;// 返回Connection对象
}
public static void main(String[] args) {
Test1 t = new Test1();
t.getConnection();// 连接数据库
try {
sql = conn.createStatement();//实例化Statement对象
//执行sql语句
rs = sql.executeQuery("select * from test_02;");
while(rs.next()) {//如果当前语句不是最后一条,则进行循环(最后一条则返回false)
String id = rs.getString("id");//获取列名是id的字段值
String name = rs.getString("name");//获取列名是name的字段值
String sex = rs.getString("sex");//获取列名是sex的字段值
String birthday = rs.getString("birthday");//获取列名是birthday的字段值
System.out.print( " | " + "编号:" + id + " | ");
System.out.print(" 姓名:" + name+ " | ");
System.out.print(" 性别:" + sex+ " | ");
System.out.println(" 出生日期:" + birthday+ " | ");
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
七、例子二
CURD(增删改查)操作
/**
* 简单的CURD
*/
package com.study.mysql.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Test5 {
public static Connection conn;
public static PreparedStatement sql;// 声明预处理对象
public static java.sql.ResultSet rs;// 声明结果集对象
public static final String url = "jdbc:mysql://localhost:3306/ming";
public static final String user = "root";
public static final String password = "******";
public Connection getConnection() {// 连接数据库
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;// 返回Connection对象
}
public void shutConn() {// 关闭连接
// 关闭连接,释放资源
if (rs != null) {// 查询结果集
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if (sql != null) {// sql语句
try {
sql.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {// 连接
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Test5 t = new Test5();
t.getConnection();// 获取连接
try {
sql = conn.prepareStatement("select * from test_02");
rs = sql.executeQuery();
System.out.println("------------------执行CURD前的数据------------------");
while (rs.next()) {
String id = rs.getString("id");// 获取列名是id的字段值
String name = rs.getString("name");// 获取列名是name的字段值
String sex = rs.getString("sex");// 获取列名是sex的字段值
String birthday = rs.getString("birthday");// 获取列名是birthday的字段值
System.out.print(" | " + "编号:" + id + " | ");
System.out.print(" 姓名:" + name + " | ");
System.out.print(" 性别:" + sex + " | ");
System.out.println(" 出生日期:" + birthday + " | ");
}
// 预处理添加数据
sql = conn.prepareStatement("insert into test_02 values(?,?,?,?)");
sql.setInt(1, 5);
sql.setString(2, "张一");
sql.setString(3, "女");
sql.setString(4, "2012-08-08");
sql.executeUpdate();
// 预处理更新数据
sql = conn.prepareStatement("update test_02 set birthday = ? where id = ?");
sql.setString(1, "2018-8-27");
sql.setInt(2, 3);
sql.executeUpdate();
// 预处理删除数据
sql = conn.prepareStatement("delete from test_02 where id = ? ");
sql.setInt(1, 1);
sql.executeUpdate();
System.out.println("------------------执行CURD后的数据------------------");
// 查询修改后的数据
sql = conn.prepareStatement("select * from test_02");
rs = sql.executeQuery();
while (rs.next()) {
String id = rs.getString("id");// 获取列名是id的字段值
String name = rs.getString("name");// 获取列名是name的字段值
String sex = rs.getString("sex");// 获取列名是sex的字段值
String birthday = rs.getString("birthday");// 获取列名是birthday的字段值
System.out.print(" | " + "编号:" + id + " | ");
System.out.print(" 姓名:" + name + " | ");
System.out.print(" 性别:" + sex + " | ");
System.out.println(" 出生日期:" + birthday + " | ");
}
} catch (Exception e) {
e.printStackTrace();
}
t.shutConn();// 关闭连接
}
}