Cодержание
- Database использующийся в данной статье
- Что такое JDBC?
- На каком принципе подключается Java к базе данных?
- Скачать некоторые важные драйверы (Driver)
- Создать project, чтобы начать пример с JDBC
- Connection
- Использование JDBC API для запроса данных
- Виды ResultSet
- Пример Insert данных
- PreparedStatement
- CallableStatement
- Управление транзакцией (Transaction)
- Реализовать командную партию (Batch)
Руководство Java JDBC
View more Tutorials:
- Database использующийся в данной статье
- Что такое JDBC?
- На каком принципе подключается Java к базе данных?
- Скачать некоторые важные драйверы (Driver)
- Создать project, чтобы начать пример с JDBC
- Connection
- Использование JDBC API для запроса данных
- Виды ResultSet
- Пример Insert данных
- PreparedStatement
- CallableStatement
- Управление транзакцией (Transaction)
- Реализовать командную партию (Batch)

В этом документе вы узнаете, как использовать Java для соединения с базой данных.
Модель базы данных, используемая в этом документе - "simplehr". Вы можете просмотретьсценарии создания базы данных по ссылке:
Модель базы данных, используемая в этом документе - "simplehr". Вы можете просмотретьсценарии создания базы данных по ссылке:
Java Database Connectivity (JDBC) - это стандартный API для взаимодействия с реляционными базами данных. JDBC имеет набор классов и интерфейсов, которые могут использоваться для Java-приложения и разговаривать с базой данных,.

Основные компоненты JDBC Api включают:
- DriverManager:
- Это класс, использующийся для управления списком Driver (database drivers).
- Driver:
- Это интерфейс, использующийся для соединения коммуникации с базой данных, управления коммуникации с базой данных. Когда загружается Driver, программисту не нужно конкретно вызывать его.
- Connection :
- Интерфейс со всеми методами связи с базой данных. Он описывает коммуникационный контекст. Вся связь с базой данных осуществляется только через объект соединения (connection).
- Statement :
- Это интерфейс, включающий команду SQL отправленный в базу данных для анализа, обобщения, планирования и выполнения.
- ResultSet представляет набор записей, извлеченных из-за выполнения запроса.
Java с использует JDBC для работы с базой данных.

Например, при работе с Oracle Database из Java вам необходимо иметь Driver (это класс, управляющий соединением с видами баз данных, которые вы хотите). В JDBC API у нас есть java.sql.Driver, это только интерфейс, и он доступен в JDK. Таким образом, вы должны загрузить библиотеку Driver, совместимую с видом необходимой вам базы данных.
- Например, с Oracle, класс реализующий интерфейс java.sql.Driver является oracle.jdbc.driver.OracleDriver
Посмотрите на иллюстрацию ниже:

У нас есть два способа работы с определенной базой данных.
- Способ 1: вы предоставляете Driver управляющий этим видом базы данных, это прямой способ. Если вы используете DB oracle (или другой DB), вам нужно будет загрузить конкретную библиотеку JDBC этой BD.
- Способ 2: объявите "ODBC Datasource" и используйте мост JDBC-ODBC для соединения с этим "ODBC Datasource". Мост JDBC-ODBC доступен в JDBC API.

Вопрос для нас в том, что такое "ODBC DataSource"?
ODBC - Open Database Connectivity: Это набор открытых библиотек, которые могут подключаться практически ко всем видам различных баз данных, и это бесплатно. Предоставляется Microsoft.
ODBC DataSource: в операционной системе Windows вы можете объявить соединение ODBC с определенным видом BD. В результате у нас есть источник данных (Data Source).
В JDBC API, JDBC-ODBC Bridge (мост) был настроен так, что JDBC может работать с ODBC Data Source.
ODBC - Open Database Connectivity: Это набор открытых библиотек, которые могут подключаться практически ко всем видам различных баз данных, и это бесплатно. Предоставляется Microsoft.
ODBC DataSource: в операционной системе Windows вы можете объявить соединение ODBC с определенным видом BD. В результате у нас есть источник данных (Data Source).
В JDBC API, JDBC-ODBC Bridge (мост) был настроен так, что JDBC может работать с ODBC Data Source.
Что касается скорости, первый способ быстрее, чем второй, потому что второй должен использовать мост.
Если вы не хотите использовать JDBC-ODBC, вы можете напрямую подключиться к базе данных. В этом случае вам необходимо загрузить драйвер, соответствующий с каждым видом базы данных. Здесь я покажу вам как скачать один вид драйвера для распространенных баз данных:
- Oracle
- MySQL
- SQLServer
- ....
Вы можете смотреть инструкцию здесь:
В результате у нас есть несколько файлов:

Создание нового проекта JavaJdbcTutorial:

Создайте папку libs в проекте, скопируйте библиотеки подключенные напрямую к видам баз данных Oracle, MySQL, SQLServer, которые вы только что загрузили. Вы можете скопировать все или одну из этих библиотек, совместимую с используемым видом базы данных.
Примечание: Вам просто нужно загрузить драйвер, соответствующий виду знакомой вам базы данных. База данных использующаяся в качестве примера в этой статье, вы можете получить по ссылке:

Кликните правой кнопкой мыши на проект и выберите Properties:


Теперь вы готовы работать с одним из баз данных (Oracle, MySQL, SQL Server)
В этой статье я покажу вам как подключиться ко всем трем видам баз данных:
- MySQL
- SQLServer
- Oracle
На практике вам просто нужно работать с видом базы данных (DB), к которому вы привыкли.

Создаем класс ConnectionUtils для получения Connection чтобы подключиться к базе данных.

ConnectionUtils.java
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.SQLException; public class ConnectionUtils { public static Connection getMyConnection() throws SQLException, ClassNotFoundException { // Using Oracle // You may be replaced by other Database. return OracleConnUtils.getOracleConnection(); } // // Test Connection ... // public static void main(String[] args) throws SQLException, ClassNotFoundException { System.out.println("Get connection ... "); // Get a Connection object Connection conn = ConnectionUtils.getMyConnection(); System.out.println("Get connection " + conn); System.out.println("Done!"); } }
OracleConnUtils.java
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class OracleConnUtils { // Connect to Oracle. public static Connection getOracleConnection() throws SQLException, ClassNotFoundException { String hostName = "localhost"; String sid = "db11g"; String userName = "simplehr"; String password = "1234"; return getOracleConnection(hostName, sid, userName, password); } public static Connection getOracleConnection(String hostName, String sid, String userName, String password) throws ClassNotFoundException, SQLException { // Declare the class Driver for ORACLE DB // This is necessary with Java 5 (or older) // Java6 (or newer) automatically find the appropriate driver. // If you use Java> 5, then this line is not needed. Class.forName("oracle.jdbc.driver.OracleDriver"); String connectionURL = "jdbc:oracle:thin:@" + hostName + ":1521:" + sid; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
MySQLConnUtils.java
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class MySQLConnUtils { // Connect to MySQL public static Connection getMySQLConnection() throws SQLException, ClassNotFoundException { String hostName = "localhost"; String dbName = "simplehr"; String userName = "root"; String password = "1234"; return getMySQLConnection(hostName, dbName, userName, password); } public static Connection getMySQLConnection(String hostName, String dbName, String userName, String password) throws SQLException, ClassNotFoundException { // Declare the class Driver for MySQL DB // This is necessary with Java 5 (or older) // Java6 (or newer) automatically find the appropriate driver. // If you use Java> 5, then this line is not needed. Class.forName("com.mysql.jdbc.Driver"); String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
SQLServerConnUtils_JTDS.java
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQLServerConnUtils_JTDS { // Connect to SQLServer // (Using JDBC Driver of JTDS library) public static Connection getSQLServerConnection() throws SQLException, ClassNotFoundException { String hostName = "localhost"; String sqlInstanceName = "SQLEXPRESS"; String database = "simplehr"; String userName = "sa"; String password = "1234"; return getSQLServerConnection(hostName, sqlInstanceName, database, userName, password); } // Connect to SQLServer & using JTDS library public static Connection getSQLServerConnection(String hostName, String sqlInstanceName, String database, String userName, String password) throws ClassNotFoundException, SQLException { // Declare the class Driver for SQLServer DB // This is necessary with Java 5 (or older) // Java6 (or newer) automatically find the appropriate driver. // If you use Java> 5, then this line is not needed. Class.forName("net.sourceforge.jtds.jdbc.Driver"); // Example: // jdbc:jtds:sqlserver://localhost:1433/simplehr;instance=SQLEXPRESS String connectionURL = "jdbc:jtds:sqlserver://" + hostName + ":1433/" + database + ";instance=" + sqlInstanceName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
SQLServerConnUtils_SQLJDBC.java
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQLServerConnUtils_SQLJDBC { // Connect to SQLServer // (Using JDBC Driver: SQLJDBC) public static Connection getSQLServerConnection() throws SQLException, ClassNotFoundException { String hostName = "localhost"; String sqlInstanceName = "SQLEXPRESS"; String database = "simplehr"; String userName = "sa"; String password = "1234"; return getSQLServerConnection(hostName, sqlInstanceName, database, userName, password); } // // Connect to SQLServer & using SQLJDBC Library. public static Connection getSQLServerConnection(String hostName, String sqlInstanceName, String database, String userName, String password) throws ClassNotFoundException, SQLException { // Declare the class Driver for SQLServer DB // This is necessary with Java 5 (or older) // Java6 (or newer) automatically find the appropriate driver. // If you use Java> 5, then this line is not needed. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // jdbc:sqlserver://ServerIp:1433/SQLEXPRESS;databaseName=simplehr String connectionURL = "jdbc:sqlserver://" + hostName + ":1433" + ";instance=" + sqlInstanceName + ";databaseName=" + database; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
ODBCConnUtils.java
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ODBCConnUtils { // Connect to ODBC Data Source named "simplehr-ds". public static Connection getJdbcOdbcConnection() throws SQLException, ClassNotFoundException { String odbcDataSourceName = "simplehr-ds"; String userName = "simplehr"; String password = "simplehr"; return getJdbcOdbcConnection(odbcDataSourceName, userName, password); } public static Connection getJdbcOdbcConnection(String odbcDataSourceName, String userName, String password) throws SQLException, ClassNotFoundException { // Declare the class Driver for JDBC-ODBC Bridge // This is necessary with Java 5 (or older) // Java6 (or newer) automatically find the appropriate driver. // If you use Java> 5, then this line is not needed. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String connectionURL = "jdbc:odbc:" + odbcDataSourceName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn; } }
Вы можете изменить класс ConnectionUtils для подключения к знакомой базе данных и запустить этот класс для тестирования соединения.
Примечание: Если вы используете MySQL или SQL Server по умолчанию, эти две базы данных препятствуют подключению к нему с другого IP-адреса. Вам нужно настроить его так, чтобы это соединение было разрешено. Вы можете посмотреть инструкцию в статье по установке и конфигурации MySQL, SQL Server на o7planning.Установка и конфигурация MySQL Community:Установка и конфигурация SQL Server:

Это изображение данных в таблице Employee. Мы посмотрим, как Java запрашивает данные через пример:

ResultSet - это объект Java, возвращаемый при запросе (query) данных. Используйте ResultSet.next() для перемещения курсора к следующим записям (перемещается строка ). В определенной записи вы используете методы ResultSet.getXxx () для получения значений в столбцах. Столбцы упорядочены по порядковому номеру 1, 2, 3 ...
** ResultSet **
public String getString(int columnIndex) throws SQLException; public boolean getBoolean(int columnIndex) throws SQLException; public int getInt(int columnIndex) throws SQLException; public double getDouble(int columnIndex) throws SQLException; ... public String getString(String columnLabel) throws SQLException; public boolean getBoolean(String columnLabel) throws SQLException; public int getInt(String columnLabel) throws SQLException; public double getDouble(String columnLabel) throws SQLException; ....
Иллюстрированный пример:
QueryDataExample.java
package org.o7planning.tutorial.jdbc.basic; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class QueryDataExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Get Connection Connection connection = ConnectionUtils.getMyConnection(); // Create statement Statement statement = connection.createStatement(); String sql = "Select Emp_Id, Emp_No, Emp_Name from Employee"; // Execute SQL statement returns a ResultSet object. ResultSet rs = statement.executeQuery(sql); // Fetch on the ResultSet // Move the cursor to the next record. while (rs.next()) { int empId = rs.getInt(1); String empNo = rs.getString(2); String empName = rs.getString("Emp_Name"); System.out.println("--------------------"); System.out.println("EmpId:" + empId); System.out.println("EmpNo:" + empNo); System.out.println("EmpName:" + empName); } // Close connection. connection.close(); } }
Результат запуска примера:

Вы уже ознакомились с использованием ResultSet в приведенных выше примерах. По умолчанию ResultSet при просмотре данных курсор может перемещаться только сверху вниз и слева направо. Это значит, что при использовании ResultSet по умолчанию, вы не можете вызывать:
- ResultSet.previous() : Отменить запись.
- В той же записи нельзя сначала вызвать ResultSet.getXxx(4), а затем вызвать ResultSet.getXxx
public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException; // Example: Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); // ResultSet can scroll & readonly ResultSet rs = statement.executeQuery(sql);
resultSetType | Значение |
TYPE_FORWARD_ONLY | - ResultSet только позволяет просматривать сверху вниз и слева направо. Это по умолчанию ResultSet. |
TYPE_SCROLL_INSENSITIVE | - ResultSet позволяет прокручивать вперед, назад, налево, направо. но не чувствителен к изменениям данных ниже DB. То есть при просмотре записи и повторного просмотра записи, он не будет брать новейшие данные записи, которые могли быть изменены кем-то. |
TYPE_SCROLL_SENSITIVE | - ResultSet позволяет прокручивать вперед, назад, налево, направо, и чувствителен к изменениям данных. |
resultSetConcurrency | Значение |
CONCUR_READ_ONLY | - При просмотре данных с ResultSet этого вида вы можете только читать данные. |
CONCUR_UPDATABLE | - При просмотре данных с ResultSet этого вида вы можете только менять данные где стоит курсор, например обновить значения определенного столбца. |
ScrollableResultSetExample.java
package org.o7planning.tutorial.jdbc.basic; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class ScrollableResultSetExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Get a Connection Connection connection = ConnectionUtils.getMyConnection(); // Create a Statement object // can be srolled, but not sensitive to changes under DB. // ResultSet is readonly (Cannot update) Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String sql = "Select Emp_Id, Emp_No, Emp_Name from Employee"; // Execute statement, return ResultSet. ResultSet rs = statement.executeQuery(sql); // Jump the cursor to last record. boolean last = rs.last(); System.out.println("last : "+ last); if(last) { // Print out data of last record System.out.println("EmpId:" + rs.getInt(1)); System.out.println("EmpNo:" + rs.getString(2)); System.out.println("EmpName:" + rs.getString(3)); } System.out.println("--------------------"); // Move cursor to previous record boolean previous =rs.previous(); System.out.println("Previous 1: "+ previous); // Move cursor to previous record previous =rs.previous(); System.out.println("Previous 2: "+ previous); // Fetch in the ResultSet while (rs.next()) { // Get value of column 2 String empNo = rs.getString(2); // Then get the value of column 1. int empId = rs.getInt(1); String empName = rs.getString("Emp_Name"); System.out.println("--------------------"); System.out.println("EmpId:" + empId); System.out.println("EmpNo:" + empNo); System.out.println("EmpName:" + empName); } // Close connection. connection.close(); } }
Результат запуска примера:

InsertDataExample.java
package org.o7planning.tutorial.jdbc.basic; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class InsertDataExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Get Connection Connection connection = ConnectionUtils.getMyConnection(); Statement statement = connection.createStatement(); String sql = "Insert into Salary_Grade (Grade, High_Salary, Low_Salary) " + " values (2, 20000, 10000) "; // Execute statement // executeUpdate(String) using for Insert, Update, Delete statement. int rowCount = statement.executeUpdate(sql); System.out.println("Row Count affected = " + rowCount); } }
Результат запуска примера:

PreparedStatement - это подинтерфейс Statement
PreparedStatement используется для подготовки SQL-команд, и многократного использования, позволяющих ускорить работу программы.
PreparedStatement используется для подготовки SQL-команд, и многократного использования, позволяющих ускорить работу программы.
PrepareStatementExample.java
package org.o7planning.tutorial.jdbc.pareparedstatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class PrepareStatementExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Get a connection Connection connection = ConnectionUtils.getMyConnection(); // Create a SQL statement with two parameters (?) String sql = "Select emp.Emp_Id, emp.Emp_No, emp.Emp_Name," + " emp.Dept_Id from Employee emp " + " where emp.Emp_Name like ? and emp.Dept_Id = ? "; // Create a PreparedStatement object. PreparedStatement pstm = connection.prepareStatement(sql); // Set value for the first parameter (First '?') pstm.setString(1, "%S"); // Set value for the second parameter (Second '?') pstm.setInt(2, 20); ResultSet rs = pstm.executeQuery(); while (rs.next()) { System.out.println(" ---- "); System.out.println("EmpId : " + rs.getInt("Emp_Id")); System.out.println("EmpNo : " + rs.getString(2)); System.out.println("EmpName : " + rs.getString("Emp_Name")); } System.out.println(); System.out.println("Set other parameters .."); // Reuse PreparedStatement // Set other values pstm.setString(1, "KI%"); pstm.setInt(2,10); // Execute statement. rs = pstm.executeQuery(); while (rs.next()) { System.out.println(" ---- "); System.out.println("EmpId : " + rs.getInt("Emp_Id")); System.out.println("EmpNo : " + rs.getString(2)); System.out.println("EmpName : " + rs.getString("Emp_Name")); } } }
Результат запуска примера:

CallableStatement разработан для вызова процедуры (procedure) или функции (function) SQL.
// Statement call procedure from Java String sql = "{call procedure_name(?,?,?)}"; // Statement call function from Java. String sql ="{? = call function_name(?,?,?)}";
Для выполнения примера с CallableStatement нам нужна функция или процедура в DB. С Oracle, MySQL или SQLServer вы можете быстро создать процедуру, как показано ниже:
- ORACLE
Get_Employee_Info
-- This procedure retrieves information of an employee, -- Input parameter: p_Emp_ID (Integer) -- There are four output parameters v_Emp_No, v_First_Name, v_Last_Name, v_Hire_Date Create Or Replace Procedure Get_Employee_Info(p_Emp_Id Integer ,v_Emp_No Out Varchar2 ,v_First_Name Out Varchar2 ,v_Last_Name Out Varchar2 ,v_Hire_Date Out Date) Is Begin v_Emp_No := 'E' || p_Emp_Id; -- v_First_Name := 'Michael'; v_Last_Name := 'Smith'; v_Hire_Date := Sysdate; End Get_Employee_Info;
- MySQL
Get_Employee_Info
-- This procedure retrieves information of an employee, -- Input parameter: p_Emp_ID (Integer) -- There are four output parameters v_Emp_No, v_First_Name, v_Last_Name, v_Hire_Date CREATE PROCEDURE get_Employee_Info(p_Emp_ID Integer, out v_Emp_No Varchar(50) , out v_First_Name Varchar(50) , Out v_Last_name Varchar(50) , Out v_Hire_date Date) BEGIN set v_Emp_No = concat( 'E' , Cast(p_Emp_Id as char(15)) ); -- set v_First_Name = 'Michael'; set v_Last_Name = 'Smith'; set v_Hire_date = curdate(); END
- SQL Server
Get_Employee_Info
-- This procedure retrieves information of an employee, -- Input parameter: p_Emp_ID (Integer) -- There are four output parameters v_Emp_No, v_First_Name, v_Last_Name, v_Hire_Date CREATE PROCEDURE Get_Employee_Info @p_Emp_Id Integer , @v_Emp_No Varchar(50) OUTPUT, @v_First_Name Varchar(50) OUTPUT, @v_Last_Name Varchar(50) OUTPUT, @v_Hire_Date Date OUTPUT AS BEGIN set @v_Emp_No = 'E' + CAST( @p_Emp_Id as varchar) ; -- set @v_First_Name = 'Michael'; set @v_Last_Name = 'Smith'; set @v_Hire_date = getdate(); END
CallableStatementExample.java
package org.o7planning.tutorial.jdbc.callablestatement; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Date; import java.sql.SQLException; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class CallableStatementExample { public static void main(String[] args) throws ClassNotFoundException, SQLException { // Get a connection Connection connection = ConnectionUtils.getMyConnection(); String sql = "{call get_Employee_Info(?,?,?,?,?)}"; // Create a CallableStatement object. CallableStatement cstm = connection.prepareCall(sql); // Set parameter value for first question mark // (p_Emp_ID) cstm.setInt(1, 10); // Registers the OUT parameter for 2st question mark. // (v_Emp_No) cstm.registerOutParameter(2, java.sql.Types.VARCHAR); // Registers the OUT parameter for 3rd question mark. // (v_First_Name) cstm.registerOutParameter(3, java.sql.Types.VARCHAR); // Registers the OUT parameter for 4th question mark. // (v_Last_Name) cstm.registerOutParameter(4, java.sql.Types.VARCHAR); // Registers the OUT parameter for 5th question mark. // (v_Hire_Date) cstm.registerOutParameter(5, java.sql.Types.DATE); // Execute statement. cstm.executeUpdate(); String empNo = cstm.getString(2); String firstName = cstm.getString(3); String lastName = cstm.getString(4); Date hireDate = cstm.getDate(5); System.out.println("Emp No: " + empNo); System.out.println("First Name: " + firstName); System.out.println("Last Name: " + lastName); System.out.println("Hire Date: " + hireDate); } }
Результат запуска примера:

Транзакция (transaction) - это важное понятие в SQL.
Например, лицо A отправляет 1000$ на счет лица В, поэтому в базе данных происходят два действия:
Например, лицо A отправляет 1000$ на счет лица В, поэтому в базе данных происходят два действия:
- Кредит 1000$ с счета лица А
- Дебит 1000$ на счету В.
TransactionExample.java
package org.o7planning.tutorial.transaction; import java.sql.Connection; import java.sql.SQLException; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class TransactionExample { private static void doJob1(Connection conn) { // Todo something here. } private static void doJob2(Connection conn) { // Todo something here. } public static void main(String[] args) throws ClassNotFoundException, SQLException { // Get a connection Connection connection = ConnectionUtils.getMyConnection(); // Set auto-commit to false connection.setAutoCommit(false); try { // Do something related to the DB. doJob1(connection); doJob2(connection); // Explicitly commit statements to apply changes connection.commit(); } // Handling exception catch (Exception e) { e.printStackTrace(); // Rollback changes connection.rollback(); } // Close connection. connection.close(); } }
BatchExample.java
package org.o7planning.tutorial.transaction; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class BatchExample { public static void main(String[] args) throws SQLException, ClassNotFoundException { Connection conn = ConnectionUtils.getMyConnection(); try { // Create statement object Statement stmt = conn.createStatement(); // Set auto-commit to false conn.setAutoCommit(false); // Create SQL statement to insert into Employee table. String sql1 = "Update Employee emp set emp.Salary = emp.Salary + 100 " + " where emp.Dept_Id = 10 "; // Add above SQL statement in the batch. stmt.addBatch(sql1); // Create one more SQL statement String sql2 = "Update Employee emp set emp.Salary = emp.Salary + 20 " + " where emp.Dept_Id = 20 "; // Add above SQL statement in the batch. stmt.addBatch(sql2); // Create one more SQL statement String sql3 = "Update Employee emp set emp.Salary = emp.Salary + 30 " + " where emp.Dept_Id = 30 "; // Add above SQL statement in the batch. stmt.addBatch(sql3); // Create an int[] to hold returned values int[] counts = stmt.executeBatch(); System.out.println("Sql1 count = " + counts[0]); System.out.println("Sql2 count = " + counts[1]); System.out.println("Sql3 count = " + counts[2]); // Explicitly commit statements to apply changes conn.commit(); } catch (Exception e) { e.printStackTrace(); conn.rollback(); } } }
Результат запуска примера:

BatchExample2.java
package org.o7planning.tutorial.transaction; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.UUID; import org.o7planning.tutorial.jdbc.ConnectionUtils; public class BatchExample2 { public static void main(String[] args) throws ClassNotFoundException, SQLException { Connection conn = ConnectionUtils.getMyConnection(); try { String sql = "Insert into Timekeeper(Timekeeper_Id, Date_Time, In_Out, Emp_Id) " + " values (?,?,?,?) "; // Create statement object PreparedStatement stmt = conn.prepareStatement(sql); // Set auto-commit to false conn.setAutoCommit(false); // Set values for parameters stmt.setString(1, UUID.randomUUID().toString()); stmt.setDate(2, new Date(System.currentTimeMillis())); stmt.setString(3, "I"); stmt.setInt(4, 7839); // Add to batch stmt.addBatch(); // Set other values for parameters. stmt.setString(1, UUID.randomUUID().toString()); stmt.setDate(2, new Date(System.currentTimeMillis())); stmt.setString(3, "I"); stmt.setInt(4, 7566); // Add to batch. stmt.addBatch(); // Create an int[] to hold returned values int[] counts = stmt.executeBatch(); System.out.println("counts[0] = " + counts[0]); System.out.println("counts[1] = " + counts[1]); // Explicitly commit statements to apply changes conn.commit(); } catch (Exception e) { e.printStackTrace(); conn.rollback(); } } }
Результат запуска примера:
