一、JDBC的常用接口和类:
1、DriverManager:主要用于管理JDBC驱动的服务类。在程序中使用该类的主要功能是获取Connection对象,该类包含如下方法:
- public static synchronized Connection getConnection(String url, String user, String password) throws SQLException:该方法获取数据库的连接。
2、Connection:代表数据库连接对象,而每一个Connection代表一个物理连接会话。要想访问数据库就必须先获得数据库的连接,否则无法对数据库进行操作。常见方法如下:
- Statement createStatement() throws SQLException:该方法返回一个Statement对象
- PreparedStatement prepareStatement(String sql) throws SQLException:该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。
- CallableStatement prepareCall(String sql) throws SQLException:该方法返回CallableStatement对象,该对象用于调用存储过程。
注:想要执行SQL语句应先获取Statement对象。
Connection控制事务的方法:
- Savepoint setSavepoint():创建一个保存点
- Savepoint setSavepoint(String name):以指定名字来创建一个保存点
- void setTransactionIsolation(int level):设置事务的隔离级别
- void rollback():回滚事务
- void rollback(Savepoint savepoint):将事务保存到指定的保存点
- void setAutoCommit(boolean autoCommit):关闭自动提交,打开事务
- void commit():提交事务
3、Statement:用于执行SQL语句的工具接口。该对象既可以用于执行DDL、DCL语句,也可以用于执行DML语句,还可以用于执行SQL查询。当执行SQL查询时,返回查询到的结果集。常用方法如下:
- ResultSet executeQuery(String sql) throws SQLException:该方法用于执行查询语句,并返回查询结果对应的ResultSet对象。该方法只能用于执行查询语句。
- int executeUpdate(String sql) throws SQLException:该方法用于执行DML语句,并返回受影响的行数,该方法也可用于执行DDL语句,执行DDL语句将返回0。
- boolean execute(String sql) throws SQLException:该方法可执行任何SQL语句。
如果执行后第一个结果为ResultSet对象,则返回true 如果执行后第一个结果为受影响的行数或没有任何结果,则返回false 4、PreparedStatement:预编译的Statement对象。PreparedStatement是Statement的子接口,它允许数据库预编译SQL语句(这些SQL语句通常带有参数),以后每次只改变SQL命令的参数,避免数据库每次都需要编译SQL语句,故性能更好,实际开发中用的较多。独有(异于Statement)的方法:
- void setXxx(int parameterIndex, Xxx value):该方法根据传入的参数值的类型不同,需要使用不同的方法。传入的值根据索引传给SQL语句中指定位置的参数。
5、ResultSet:结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名称获得列数据。它包含了如下常用的方法来移动记录指针。
- void close():释放ResultSet对象
- boolean absolute(int row):将结果集的记录指针移动到第row行,如果row是负数,则移动到倒数第row行。如果移动后的记录指针指向一条有效记录,则该方法返回true。
- void beforeFirst():将ResultSet的记录指针定位到首行之前,这是ResultSet结果集记录指针的初始状态----记录指针的起始位置位于第一行之前。
- boolean first():将ResultSet的记录指针定位到首行。如果移动后的记录指针指向一条有效记录,则该方法返回true
- boolean previous():将ResultSet的记录指针定义到上一行,如果移动后的记录指针指向一条有效记录,则该方法返回true
- boolean next():将ResultSet的记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则该方法返回true
- boolean last():将ResultSet的记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则该方法返回true
- void afterLast():将ResultSet的记录指针定位到最后一行之后。
二、JDBC的编程步骤
1、加载数据库驱动,通常采用Class类的forName() 静态方法来加载驱动。
//加载驱动
Class.forName(driverClass);
//加载MySQL的驱动
Class.forName("com.mysql.jdbc.Driver");
- //加载Oracle的驱动
- Class.forName("oracle.jdbc.driver.OracleDriver");
2、通过DriverManager获取数据库连接:
//获取数据库连接
DriverManager.getConnection(String url, String user, String password);
//MySQL数据库URL的写法
jdbc:mysql://hostname:port/databasename
//Oracle数据库URL的写法
jdbc:oracle:thin:@hostname:port:databasename
3、通过Connection对象创建Statement对象。创建方法有如下几个:
- createStatement():创建基本的Statement对象
- preparedStatement(String sql):根据传入的SQL语句创建预编译的Statement对象
- preparedCall(String sql):根据传入的SQL语句创建CallableStatement对象
4、使用Statement执行SQL语句。所有的Statement都有如下三个方法来执行SQL语句
- execute():可以执行任何SQL语句,但比较麻烦
- executeUpdate():主要用于执行DML和DDL语句。执行DML语句返回受SQL语句影响的行数,执行DDL语句返回0
- executeQuery():只能执行查询语句,执行后返回代表查询结果的ResultSet对象
5、操作结果集。
6、释放数据库资源,关闭连接。
简单示例:package com.sqq.mystudy.JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args) {
try {
//1、加载MySQL数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、使用DriverManager获取数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mytest",
"root","pwd"
);
//3、使用Connection创建一个Statement对象
Statement stmt = conn.createStatement();
//4、执行SQL语句
ResultSet rs = stmt.executeQuery("SELECT * FROM mtest");
while (rs.next()) {
System.out.println(rs.getInt(1) + "\t"
+ rs.getString(2) + "\t\t"
+ rs.getString(3));
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
运行结果:
三、事务处理
1、事务
- 概念:事务是由一步或多步数据库操作序列组成的逻辑执行单元,这一系列的单元要么全部执行,要么全部放弃执行。(程序和事务是两个不同的概念。一般而言,一个程序中可能包含多个事务)
- 事务的特性(4个): 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、和持续性(Durability)。简称为 ACID性
- MySQL默认关闭事务(如果打开会自动提交),若要开启MySQL的事务支持,可以显示调用如下命令:
SET AUTOCOMMIT = {0 | 1} #0为关闭自动提交,即开启事务
- 如果只想临时性的开启事务,可以使用 start transaction 或者 begin
2、JDBC的事务支持
- JDBC连接的事务支持由Connection提供,Connection默认打开自动提交,即关闭事务。此时的每条SQL语句一旦执行,便会立即提交到数据库,永久生效,无法进行回滚操作; 如果想要关闭,可以调用Connection的setAutoCommit()方法来关闭自动提交,开启事务:
//关闭自动提交,开启事务
conn.setAutoCommit(false);
- 此时使用Statement对象执行SQL语句之后,必须调用Connection的commit()方法来手动提交事务:
- 如果有SQL语句执行失败,此时也可以使用Connection的rollback()方法来回滚事务:
- 简单的示例:
public static void commitTransaction(String[] sqls) {
//加载驱动
try {
Class.forName(dbPar.getDriver());
Connection conn = null;
try {
conn = DriverManager.getConnection(dbPar.getUrl(),
dbPar.getUser(), dbPar.getPassword());
//关闭自动提交事务
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
for (String sql : sqls) {
System.out.println(sql);
}
//提交事务
conn.commit();
//关闭连接
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
Java解惑 之 MySQL与JDBC编程
原文:http://www.cnblogs.com/sunqiangqiang/p/6914645.html