- Database использующийся в данной статье
- Что такое JDBC?
- На каком принципе подключается Java к базе данных?
- Скачать некоторые важные драйверы (Driver)
- Создать project, чтобы начать пример с JDBC
- Connection
- Использование JDBC API для запроса данных
- Виды ResultSet
- Пример Insert данных
- PreparedStatement
- CallableStatement
- Управление транзакцией (Transaction)
- Реализовать командную партию (Batch)
Руководство Java JDBC
1. Database использующийся в данной статье
В этом документе вы узнаете, как использовать Java для соединения с базой данных.
Модель базы данных, используемая в этом документе - "simplehr". Вы можете просмотретьсценарии создания базы данных по ссылке:
Модель базы данных, используемая в этом документе - "simplehr". Вы можете просмотретьсценарии создания базы данных по ссылке:
2. Что такое JDBC?
Java Database Connectivity (JDBC) - это стандартный API для взаимодействия с реляционными базами данных. JDBC имеет набор классов и интерфейсов, которые могут использоваться для Java-приложения и разговаривать с базой данных,.
Основные компоненты JDBC Api включают:
- DriverManager:
- Это класс, использующийся для управления списком Driver (database drivers).
- Driver:
- Это интерфейс, использующийся для соединения коммуникации с базой данных, управления коммуникации с базой данных. Когда загружается Driver, программисту не нужно конкретно вызывать его.
- Connection :
- Интерфейс со всеми методами связи с базой данных. Он описывает коммуникационный контекст. Вся связь с базой данных осуществляется только через объект соединения (connection).
- Statement :
- Это интерфейс, включающий команду SQL отправленный в базу данных для анализа, обобщения, планирования и выполнения.
- ResultSet :
- ResultSet представляет набор записей, извлеченных из-за выполнения запроса.
3. На каком принципе подключается Java к базе данных?
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.
Что касается скорости, первый способ быстрее, чем второй, потому что второй должен использовать мост.
4. Скачать некоторые важные драйверы (Driver)
Если вы не хотите использовать JDBC-ODBC, вы можете напрямую подключиться к базе данных. В этом случае вам необходимо загрузить драйвер, соответствующий с каждым видом базы данных. Здесь я покажу вам как скачать один вид драйвера для распространенных баз данных:
- Oracle
- MySQL
- SQLServer
- ....
Вы можете смотреть инструкцию здесь:
В результате у нас есть несколько файлов:
Database | Library |
Oracle | ojdbc6.jar |
MySQL | mysql-connector-java-x.jar |
SQL Server | jtds-x.jar |
SQL Server | sqljdbc4.jar |
5. Создать project, чтобы начать пример с JDBC
Создание нового проекта JavaJdbcTutorial:
Создайте папку libs в проекте, скопируйте библиотеки подключенные напрямую к видам баз данных Oracle, MySQL, SQLServer, которые вы только что загрузили. Вы можете скопировать все или одну из этих библиотек, совместимую с используемым видом базы данных.
Примечание: Вам просто нужно загрузить драйвер, соответствующий виду знакомой вам базы данных. База данных использующаяся в качестве примера в этой статье, вы можете получить по ссылке:
Кликните правой кнопкой мыши на проект и выберите Properties:
Теперь вы готовы работать с одним из баз данных (Oracle, MySQL, SQL Server)
6. Connection
В этой статье я покажу вам как подключиться ко всем трем видам баз данных:
- 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 для подключения к знакомой базе данных и запустить этот класс для тестирования соединения.
Get connection ...
Get connection oracle.jdbc.driver.T4CConnection@5f54e92c
Done!
Примечание: Если вы используете MySQL или SQL Server по умолчанию, эти две базы данных препятствуют подключению к нему с другого IP-адреса. Вам нужно настроить его так, чтобы это соединение было разрешено. Вы можете посмотреть инструкцию в статье по установке и конфигурации MySQL, SQL Server на o7planning.Установка и конфигурация MySQL Community:Установка и конфигурация SQL Server:
7. Использование JDBC API для запроса данных
Это изображение данных в таблице 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();
}
}
Результат запуска примера:
EmpId:7900
EmpNo:E7900
EmpName:ADAMS
--------------------
EmpId:7934
EmpNo:E7934
EmpName:MILLER
8. Виды ResultSet
Вы уже ознакомились с использованием 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();
}
}
Результат запуска примера:
last : true
EmpId:7934
EmpNo:E7934
EmpName:MILLER
--------------------
Previous 1: true
Previous 2: true
--------------------
EmpId:7902
EmpNo:E7902
EmpName:FORD
--------------------
EmpId:7934
EmpNo:E7934
EmpName:MILLER
9. Пример Insert данных
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);
}
}
Результат запуска примера:
Row Count affected = 1
10. PreparedStatement
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"));
}
}
}
Результат запуска примера:
----
EmpId : 7566
EmpNo : E7566
EmpName : JONES
----
EmpId : 7876
EmpNo : E7876
EmpName : ADAMS
Set other parameters ...
----
EmpId : 7839
EmpNo : E7839
EmpName : KING
11. CallableStatement
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);
}
}
Результат запуска примера:
Emp No : E10
First Name: Michael
Last Name: Smith
Hire Date: 2015-03-01
12. Управление транзакцией (Transaction)
No ADS
Транзакция (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();
}
}
13. Реализовать командную партию (Batch)
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();
}
}
}
Результат запуска примера:
Sql1 count = 2
Sql2 count = 5
Sql3 count = 7
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();
}
}
}
Результат запуска примера:
counts[0] = 1
counts[1] = 1
No ADS
Java Basic
- Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
- Программирование на Java для группы с помощью Eclipse и SVN
- Руководство Java WeakReference
- Руководство Java PhantomReference
- Сжатие и декомпрессия в Java
- Настройка Eclipse для использования JDK вместо JRE
- Методы String.format() и printf() в Java
- Синтаксис и новые функции в Java 8
- Регулярные выражения Java
- Руководство Java Multithreading Programming
- Библиотеки Java JDBC Driver для различных типов баз данных
- Руководство Java JDBC
- Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
- Руководство Java Stream
- Руководство Java Functional Interface
- Введение в Raspberry Pi
- Руководство Java Predicate
- Абстрактный класс и Interface в Java
- Модификатор доступа (Access modifiers) в Java
- Руководство Java Enum
- Руководство Java Annotation
- Сравнение и Сортировка в Java
- Руководство Java String, StringBuffer и StringBuilder
- Обработка исключений Java - Java Exception Handling
- Руководство Java Generics
- Манипулирование файлами и каталогами в Java
- Руководство Java BiPredicate
- Руководство Java Consumer
- Руководство Java BiConsumer
- Что мне нужно для начала работы с Java?
- История Java и разница между Oracle JDK и OpenJDK
- Установить Java в Windows
- Установите Java в Ubuntu
- Установите OpenJDK в Ubuntu
- Установить Eclipse
- Установите Eclipse в Ubuntu
- Быстрое изучение Java для начинающих
- История бит и байтов в информатике
- Типы данных в java
- Битовые операции
- Команда if else в Java
- команды switch в Java
- Циклы в Java
- Массивы (Array) в Java
- JDK Javadoc в формате CHM
- Наследование и полиморфизм в Java
- Руководство Java Function
- Руководство Java BiFunction
- Пример Java encoding и decoding с использованием Apache Base64
- Руководство Java Reflection
- Java Удаленный вызов методов - Java RMI
- Руководство Программирование Java Socket
- Какую платформу я должен выбрать для разработки приложений Java Desktop?
- Руководство Java Commons IO
- Руководство Java Commons Email
- Руководство Java Commons Logging
- Понимание Java System.identityHashCode, Object.hashCode и Object.equals
- Руководство Java SoftReference
- Руководство Java Supplier
- Аспектно-ориентированное программирование Java с помощью AspectJ (AOP)
Show More
- Руководства Java Servlet/JSP
- Руководства Java Collections Framework
- Java API для HTML, XML
- Руководства Java IO
- Руководства Java Date Time
- Руководства Spring Boot
- Руководства Maven
- Руководства Gradle
- Руководства Java Web Services
- Руководства Java SWT
- Руководства JavaFX
- Руководства Oracle Java ADF
- Руководства Struts2 Framework
- Руководства Spring Cloud