Thủ Thuật Hướng dẫn Kết nối cơ sở tài liệu trong java với sql server 2022
Dương Gia Minh đang tìm kiếm từ khóa Kết nối cơ sở tài liệu trong java với sql server được Update vào lúc : 2022-06-07 18:06:03 . Với phương châm chia sẻ Kinh Nghiệm Hướng dẫn trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi Read Post vẫn ko hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Admin lý giải và hướng dẫn lại nha.
Tài liệu hướng dẫn này sẽ hướng dẫn những sử dụng Java link vào database. Database được sử dụng làm mẫu trong tài liệu này là "simplehr". Bạn hoàn toàn có thể xem những script tạo database tại:
JDBC (Java Database Connectivity) là một API tiêu chuẩn dùng để tương tác với nhiều chủng loại cơ sở tài liệu quan hệ. JDBC có một tập hợp những class và những Interface dùng cho ứng dụng Java hoàn toàn có thể nói rằng chuyện với những cơ sở tài liệu.
Các thành phần của JDBC Api về cơ bản gồm có:
DriverManager:
- Là một class, nó dùng để quản lý list những Driver (database drivers).
- Là một Interface, nó dùng để link những liên lạc với cơ sở tài liệu, điều khiển những liên lạc với database. Một khi Driver được tải lên, lập trình viên tránh việc phải gọi nó một cách rõ ràng.
- Là một Interface với tất cả những method cho việc liên lạc với database. Nó mô tả nội dung liên lạc. tất cả những thông tin liên lạc với cơ sở tài liệu là thông qua chỉ có đối tượng Connection.
- Là một Interface, gói gọn một câu lệnh SQL gửi tới cơ sở tài liệu được phân tích, tổng hợp, lập kế hoạch và thực hiện.
- ResultSet đại diện cho tập hợp những bản ghi lấy do thực hiện truy vấn.
Java sử dụng JDBC để thao tác với những cơ sở tài liệu.
Ví dụ bạn thao tác với cơ sở tài liệu Oracle từ Java bạn nên phải có Driver (Đó là class điều khiển việc link với loại cơ sở tài liệu bạn muốn). Trong JDBC API tất cả chúng ta có java.sql.Driver, nó chỉ là một interface, và nó có sẵn trong JDK. Như vậy bạn phải tải về thư viện Driver ứng với loại Database mà bạn mong ước.
- Chẳng hạn với Oracle thì class thi hành Interface java.sql.Driver đó là: oracle.jdbc.driver.OracleDriver
Bạn hãy xem hình minh họa dưới đây:
Chúng ta có 2 phương pháp để thao tác với một loại cơ sở tài liệu rõ ràng nào đó.
- Cách 1: Bạn hãy đáp ứng thư viện Driver điều khiển loại cơ sở tài liệu đó, đây là cách trực tiếp. Nếu bạn dùng DB oracle (hoặc DB khác) bạn phải tải về thư viện dành riêng cho loại DB này. Cách 2: Khai báo một "ODBC DataSource", và sử dụng cầu nối JDBC-ODBC để link với "ODBC DataSource" kia. Cầu nối JDBC-ODBC là thứ có sẵn trong JDBC API.
Câu hỏi của tất cả chúng ta là "ODBC DataSource" là cái gì?
ODBC - Open Database Connectivity: Nó đó đó là một bộ thư viện mở, hoàn toàn có thể link với hầu hết nhiều chủng loại cơ sở tài liệu rất khác nhau, và nó miễn phí. Được đáp ứng bởi Microsoft.
ODBC DataSource: Trên hệ điều hành Window bạn hoàn toàn có thể khai báo một link ODBC tới một loại DB nào đó. Và như vậy tất cả chúng ta có một nguồn tài liệu (Data Source).
Trong JDBC API, đã xây dựng sẵn một cầu nối JDBC-ODBC để JDBC hoàn toàn có thể nói rằng chuyện được với ODBC Data Source.
Về tốc độ, cách 1 sẽ nhanh hơn cách 2, vì cách 2 phải sử dụng tới cầu nối.
Trong trường hợp nếu bạn không thích sử dụng JDBC-ODBC, bạn hoàn toàn có thể sử dụng cách trực tiếp link vào Database, trong trường hợp đó nên phải tải về Driver ứng với mỗi loại DB này. Tại đây tôi hướng dẫn tải về một loại Driver cho những Database thông dụng:
- Oracle MySQL SQLServer ....
Bạn hoàn toàn có thể xem hướng dẫn tại:
Kết quả tất cả chúng ta có một vài file:
Database Library Oracle ojdbc6.jar MySQL mysql-connector-java-x.jar SQL Server jtds-x.jar sqljdbc4.jar
Tạo mới project JavaJdbcTutorial:
Tạo thư mục libs trên project và copy những thư viện link trực tiếp nhiều chủng loại database Oracle, MySQL, SQLServer mà bạn vừa tải về được ở trên vào. Bạn hoàn toàn có thể copy hết hoặc một trong những thư viện đó, theo loại DB mà bạn sử dụng.
Chú ý: Bạn chỉ việc tải về một Driver ứng với loại Database mà bạn quen thuộc. Cơ sở tài liệu dùng làm ví dụ trong tài liệu này bạn hoàn toàn có thể lấy tại:
Nhấn phải vào Project chọn Properties:
Giờ thì bạn hoàn toàn có thể sẵn sàng thao tác với một trong những Database (Oracle, MySQL, SQL Server)
Trong tài liệu hướng dẫn này tôi sẽ hướng dẫn những link vào cả 3 loại database:
Trong khi thực hành, bạn chỉ việc thao tác với một loại DB nào mà bạn quen thuộc.
Chúng ta tạo class ConnectionUtils để lấy ra đối tượng Connection link với Database.
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.SQLException; public class ConnectionUtils public static Connection getMyConnection() throws SQLException, ClassNotFoundException // Sử dụng Oracle. // Bạn hoàn toàn có thể thay thế bởi Database nào đó. return OracleConnUtils.getOracleConnection(); // // Test Connection ... // public static void main(String[] args) throws SQLException, ClassNotFoundException System.out.println("Get connection ... "); // Lấy ra đối tượng Connection link vào database. Connection conn = ConnectionUtils.getMyConnection(); System.out.println("Get connection " + conn); System.out.println("Done!");
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class OracleConnUtils // Kết nối vào ORACLE. public static Connection getOracleConnection() throws SQLException, ClassNotFoundException String hostName = "localhost"; String sid = "db11g"; String userName = "simplehr"; String password = "simplehr"; return getOracleConnection(hostName, sid, userName, password); public static Connection getOracleConnection(String hostName, String sid, String userName, String password) throws ClassNotFoundException, SQLException // Khai báo class Driver cho DB Oracle // Việc này thiết yếu với Java 5 // Java6 tự động tìm kiếm Driver thích hợp. // Nếu bạn dùng Java6, thì ko cần dòng này cũng khá được. Class.forName("oracle.jdbc.driver.OracleDriver"); // Cấu trúc URL Connection dành riêng cho Oracle // Ví dụ: jdbc:oracle:thin:@localhost:1521:db11g String connectionURL = "jdbc:oracle:thin:@" + hostName + ":1521:" + sid; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn;
package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class MySQLConnUtils // Kết nối vào 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 // Khai báo class Driver cho DB MySQL // Việc này thiết yếu với Java 5 // Java6 tự động tìm kiếm Driver thích hợp. // Nếu bạn dùng Java6, thì ko cần dòng này cũng khá được. Class.forName("com.mysql.jdbc.Driver"); // Cấu trúc URL Connection dành riêng cho Oracle // Ví dụ: jdbc:mysql://localhost:3306/simplehr 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 // Kết nối vào SQLServer. // (Sử dụng thư viện điều khiển JTDS) 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); // Trường hợp sử dụng SQLServer. // Và thư viện JTDS. public static Connection getSQLServerConnection(String hostName, String sqlInstanceName, String database, String userName, String password) throws ClassNotFoundException, SQLException // Khai báo class Driver cho DB SQLServer // Việc này thiết yếu với Java 5 // Java6 tự động tìm kiếm Driver thích hợp. // Nếu bạn dùng Java6, thì ko cần dòng này cũng khá được. Class.forName("net.sourceforge.jtds.jdbc.Driver"); // Cấu trúc URL Connection dành riêng cho SQLServer // Ví dụ: // 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 // Kết nối vào SQLServer. // (Sử dụng thư viện điều khiển 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); // Trường hợp sử dụng SQLServer. // Và thư viện SQLJDBC. public static Connection getSQLServerConnection(String hostName, String sqlInstanceName, String database, String userName, String password) throws ClassNotFoundException, SQLException // Khai báo class Driver cho DB SQLServer // Việc này thiết yếu với Java 5 // Java6 tự động tìm kiếm Driver thích hợp. // Nếu bạn dùng Java6, thì ko cần dòng này cũng khá được. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // Cấu trúc URL Connection dành riêng cho SQLServer // Ví dụ: // 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;package org.o7planning.tutorial.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ODBCConnUtils // Lấy ra link vào ODBC Data Source mang tên "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 // Khai báo class Driver (Cầu nối Jdbc-Odbc) // Việc này thiết yếu với Java 5 // Java6 tự động tìm kiếm Driver thích hợp. // Nếu bạn dùng Java6, thì ko cần dòng này cũng khá được. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Cấu trúc URL Connection dành riêng cho JDBC-ODBC String connectionURL = "jdbc:odbc:" + odbcDataSourceName; Connection conn = DriverManager.getConnection(connectionURL, userName, password); return conn;
Bạn hoàn toàn có thể thay đổi Class ConnectionUtils để sử dụng link tới một Database nào đó quen thuộc. Và chạy class này để test link.
Get connection ... Get connection [email protected] Done!
Chú ý: Nếu bạn sử dụng MySQL hoặc SQL Server mặc định 2 Database này chặn không được cho phép link vào nó từ một IP khác. Bạn cần thông số kỹ thuật để được cho phép điều này. Bạn hoàn toàn có thể xem hướng dẫn trong tài liệu setup và thông số kỹ thuật MySQL, SQL Server trên o7planning.
Cài đặt và thông số kỹ thuật MySQL Community:
Cài đặt và thông số kỹ thuật SQL Server:
Đây là hình ảnh tài liệu trong bảng Employee. Chúng ta sẽ xem cách Java lấy ra tài liệu thế nào thông qua một ví dụ:
ResultSet là một đối tượng Java, nó được trả về khi bạn truy vấn (query) tài liệu. Sử dụng ResultSet.next() để di tán con trỏ tới những bản ghi tiếp theo (Di chuyển dòng). Tại một bản ghi nào đó bạn sử dụng những method ResultSet.getXxx() để lấy ra những giá trị tại những cột. Các cột được đánh với thứ tự 1,2,3,...
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; ....
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 // Lấy ra đối tượng Connection link vào DB. Connection connection = ConnectionUtils.getMyConnection(); // Tạo đối tượng Statement. Statement statement = connection.createStatement(); String sql = "Select Emp_Id, Emp_No, Emp_Name from Employee"; // Thực thi câu lệnh SQL trả về đối tượng ResultSet. ResultSet rs = statement.executeQuery(sql); // Duyệt trên kết quả trả về. while (rs.next()) // Di chuyển con trỏ xuống bản ghi sau đó. 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); // Đóng link connection.close();
EmpId:7900 EmpNo:E7900 EmpName:ADAMS -------------------- EmpId:7934 EmpNo:E7934 EmpName:MILLER
Bạn đã làm quen với ResultSet với những ví dụ phía trên. Mặc định những ResultSet khi duyệt tài liệu chỉ hoàn toàn có thể chạy từ trên xuống dưới, từ trái sang phải. Điều đó nghĩa là với những ResultSet mặc định bạn không thể gọi:
- ResultSet.previous() : Lùi lại một bản ghi. Trên cùng một bản ghi không thể gọi ResultSet.getXxx(4) rồi mới gọi ResultSet.getXxx(2).
public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException; // Ví dụ: Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); // ResultSet hoàn toàn có thể cuộn (tiến lùi, sang trái sang phải). ResultSet rs = statement.executeQuery(sql);
resultSetType Ý nghĩa TYPE_FORWARD_ONLY - ResultSet chỉ được cho phép duyệt từ trên xuống dưới, từ trái sang phải. Đây là kiểu mặc định của những ResultSet. TYPE_SCROLL_INSENSITIVE - ResultSet được cho phép cuộn tiến lùi, sang trái, sang phải, nhưng không nhạy với những sự thay đổi tài liệu dưới DB. Nghĩa là trong quá trình duyệt qua một bản ghi và lúc nào đó duyệt lại bản ghi đó, nó không lấy những tài liệu tiên tiến nhất của bản ghi mà hoàn toàn có thể bị ai đó thay đổi. TYPE_SCROLL_SENSITIVE - ResultSet được cho phép cuộn tiến lùi, sang trái, sang phải, và nhạy cảm với sự thay đổi tài liệu.
resultSetConcurrency Ý nghĩa CONCUR_READ_ONLY - Khi duyệt tài liệu với những ResultSet kiểu này bạn chỉ hoàn toàn có thể đọc tài liệu. CONCUR_UPDATABLE - Khi duyệt tài liệu với những ResultSet kiểu này bạn chỉ hoàn toàn có thể thay đổi tài liệu tại nơi con trỏ đứng, ví dụ update giá trị cột nào đó.
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 // Lấy ra đối tượng Connection link tới DB. Connection connection = ConnectionUtils.getMyConnection(); // Tạo một đối tượng Statement // Có thể cuộn tài liệu, nhưng không nhậy với những thay đổi dưới DB. // Con trỏ chỉ hoàn toàn có thể đọc, không hoàn toàn có thể update tài liệu trong quá trình duyệt. Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String sql = "Select Emp_Id, Emp_No, Emp_Name from Employee"; // Thực thi câu lệnh SQL trả về đối tượng ResultSet. ResultSet rs = statement.executeQuery(sql); // Nhẩy con trỏ tới cuối boolean last = rs.last(); System.out.println("last : "+ last); if(last) // Ghi ra thông tin bản ghi cuối. System.out.println("EmpId:" + rs.getInt(1)); System.out.println("EmpNo:" + rs.getString(2)); System.out.println("EmpName:" + rs.getString(3)); System.out.println("--------------------"); // Nhẩy con trỏ lùi lại lần 1 boolean previous =rs.previous(); System.out.println("Previous 1: "+ previous); // Nhẩy lùi con trỏ lần 2 previous =rs.previous(); System.out.println("Previous 2: "+ previous); // Duyệt trên kết quả trả về. while (rs.next()) // Lấy tài liệu cột 2 String empNo = rs.getString(2); // Rồi mới lấy tài liệu cột 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); // Đóng link 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
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 // Lấy ra link tới cơ sở tài liệu. Connection connection = ConnectionUtils.getMyConnection(); Statement statement = connection.createStatement(); String sql = "Insert into Salary_Grade (Grade, High_Salary, Low_Salary) " + " values (2, 20000, 10000) "; // Thực thi câu lệnh. // executeUpdate(String) sử dụng cho những loại lệnh Insert,Update,Delete. int rowCount = statement.executeUpdate(sql); // In ra số dòng được trèn vào bởi câu lệnh trên. System.out.println("Row Count affected = " + rowCount);
PreparedStatement là một Interface con của Statement.
PreparedStatement sử dụng để sẵn sàng sẵn sàng trước những câu lệnh SQL, và tái sử dụng nhiều lần, tương hỗ cho chương trình thực hiện nhanh hơn.
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 // Lấy ra link tới cơ sở tài liệu. Connection connection = ConnectionUtils.getMyConnection(); // Tạo một câu SQL có 2 tham số (?) 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 = ? "; // Tạo một đối tượng PreparedStatement. PreparedStatement pstm = connection.prepareStatement(sql); // Sét đặt giá trị tham số thứ nhất (Dấu ? thứ nhất) pstm.setString(1, "%S"); // Sét đặt giá trị tham số thứ hai (Dấu ? thứ hai) 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 .."); // Tái sử dụng PreparedStatement. // Sét đặt những tham số khác. pstm.setString(1, "KI%"); pstm.setInt(2,10); // Thực thi câu lệnh truy vấn. 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
CallableStatement được xây dựng để gọi một thủ tục (procedure) hoặc hàm (function) của SQL.
// Câu lệnh gọi thủ tục SQL trên Java String sql = "call procedure_name(?,?,?)"; // Câu lệnh gọi một hàm SQL trên Java String sql ="? = call function_name(?,?,?)";
Để làm ví dụ với CallableStatement tất cả chúng ta cần một hàm hoặc một thủ tục trong DB. Với Oracle, MySQL hoặc SQLServer bạn hoàn toàn có thể tạo nhanh một thủ tục như dưới đây:
-- Thủ tục lấy ra thông tin của một nhân viên cấp dưới, -- Truyền vào tham số p_Emp_ID (Integer) -- Có 4 tham số đầu ra 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;
-- Thủ tục lấy ra thông tin của một nhân viên cấp dưới, -- Truyền vào tham số p_Emp_ID (Integer) -- Có 4 tham số đầu ra 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
-- Thủ tục lấy ra thông tin của một nhân viên cấp dưới, -- Truyền vào tham số p_Emp_ID (Integer) -- Có 4 tham số đầu ra 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 // Lấy ra link tới cơ sở tài liệu. Connection connection = ConnectionUtils.getMyConnection(); // Câu lệnh gọi thủ tục (***) String sql = "call get_Employee_Info(?,?,?,?,?)"; // Tạo một đối tượng CallableStatement. CallableStatement cstm = connection.prepareCall(sql); // Truyền tham số vào hàm (p_Emp_ID) // (Là dấu chấm hỏi thứ 1 trên câu lệnh sql ***) cstm.setInt(1, 10); // Đăng ký nhận giá trị trả về tại dấu hỏi thứ 2 // (v_Emp_No) cstm.registerOutParameter(2, java.sql.Types.VARCHAR); // Đăng ký nhận giá trị trả về tại dấu hỏi thứ 3 // (v_First_Name) cstm.registerOutParameter(3, java.sql.Types.VARCHAR); // Đăng ký nhận giá trị trả về tại dấu hỏi thứ 4 // (v_Last_Name) cstm.registerOutParameter(4, java.sql.Types.VARCHAR); // Đăng ký nhận giá trị trả về tại dấu hỏi thứ 5 // (v_Hire_Date) cstm.registerOutParameter(5, java.sql.Types.DATE); // Thực thi câu lệnh 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
Giao dịch (Transaction) là một khái niệm quan trọng trong SQL.
Ví dụ người A chuyển một khoản tiền 1000$ vào tài khoản người B như vậy trong Database ra mắt 2 quá trình:
- Trừ số dư tài khoản của người A đi 1000$ Thêm vào số dư tài khoản của người B 1000$.
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) // Làm gì đó tại đây. // Insert update dữ liêu. private static void doJob2(Connection conn) // Làm gì đó tại đây. // Insert update dữ liêu. public static void main(String[] args) throws ClassNotFoundException, SQLException // Lấy ra link tới cơ sở tài liệu. Connection connection = ConnectionUtils.getMyConnection(); // Sét đặt chính sách tự động Commit thành false // Để tự quản lý việc commit trên chương trình. connection.setAutoCommit(false); try // Làm một việc gì đó liên quan tới DB. doJob1(connection); // Lamf trách nhiệm thứ 2 doJob2(connection); // Gọi method commit tài liệu xuống DB. connection.commit(); // Có vấn đề gì đó lỗi xẩy ra. catch (Exception e) e.printStackTrace(); // Rollback tài liệu connection.rollback(); // Đóng Connection. connection.close();
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 // Tạo câu lệnh Insert tài liệu vào bảng Employee String sql1 = "Update Employee emp set emp.Salary = emp.Salary + 100 " + " where emp.Dept_Id = 10 "; // Add above SQL statement in the batch. // Thêm câu lệnh SQL trên vào lô 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. // Thêm vào lô 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. // Thêm vào lô 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
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); // Sét đặt những tham số. stmt.setString(1, UUID.randomUUID().toString()); stmt.setDate(2, new Date(System.currentTimeMillis())); stmt.setString(3, "I"); stmt.setInt(4, 7839); // Thêm vào lô. stmt.addBatch(); // Sét đặt những giá trị tham số khác stmt.setString(1, UUID.randomUUID().toString()); stmt.setDate(2, new Date(System.currentTimeMillis())); stmt.setString(3, "I"); stmt.setInt(4, 7566); // Thêm vào lô. 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