資料庫:JDBC編程,資料庫jdbc編程

來源:互聯網
上載者:User

資料庫:JDBC編程,資料庫jdbc編程

    JDBC(Java Data Base Connectivity,java資料庫連接)是一種用於執行SQL語句的Java API,可以為多種關聯式資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。說白了,它用於直接調用 SQL 命令。

主要步驟:

1.載入JDBC驅動程式    
2.建立於資料庫的串連   
3.建立一個Statement,添加相關參數
4.執行SQL語句
5.處理執行結果
6.關閉JDBC的對象


幾個重要的類:
(1)
public class DriverManager extends Object
管理一組 JDBC 驅動程式的基本服務。
主要方法是:
public static Connection getConnection(String url,String user,String password)throws SQLException
試圖建立到給定資料庫 URL 的串連。DriverManager 試圖從登入的 JDBC 驅動程式集中選擇一個適當的驅動程式。

(2)
public interface PreparedStatement extends Statement
表示先行編譯的 SQL 陳述式的對象。 SQL 陳述式被先行編譯並儲存在PreparedStatement對象中。然後可以使用此對象多次高效地執行該語句。 與Statement介面相比,Statement用於執行靜態 SQL 陳述式並返回它所產生結果的對象。 
主要方法是:
1. void setObject(int parameterIndex,Object x) throws SQLException
使用給定對象設定指定參數的值,其實就是為SQL語句預留位置的設定實際參數。

2. intexecuteUpdate() throws SQLException

在此 PreparedStatement 對象中執行 SQL 陳述式,該語句必須是一個 SQL 資料操作語言(Data Manipulation Language,DML)語句,比如 INSERT、UPDATE 或 DELETE 語句;或者是無返回內容的 SQL 陳述式,比如 DDL 語句。 
返回:
(1) SQL 資料操作語言 (DML) 語句的行數 (2) 對於無返回內容的 SQL 陳述式,返回 0 


3. ResultSet executeQuery() throws SQLException
在此 PreparedStatement 對象中執行 SQL 查詢,並返回該查詢產生的 ResultSet 對象。 
返回:
包含該查詢產生的資料的 ResultSet 對象;不會返回 null

(3)
留意執行executeUpdate()和executeQuery()方法返回的值發現executeQuery()返回的是一個結果集對象。
public interface ResultSet extends Wrapper
表示資料庫結果集的資料表,通常通過執行查詢資料庫的語句產生。

主要方法是:
1. ResultSetMetaData getMetaData() throws SQLException

擷取此ResultSet對象的列的編號、類型和屬性。 
而ResultSetMetaData的主要方法就是 int getColumnCount() 返回此 ResultSet 對象中的列數;  String getColumnName(int column) 擷取指定列的名稱。  

2. Object getObject(int columnIndex) throws SQLException

以 Java 程式設計語言中 Object 的形式擷取此 ResultSet 對象的當前行中指定列的值。 


執行個體一:MySql+JDBC

Windows使用者可以再http://dev.mysql.com/downloads/windows/installer/下載MySql的自動設定安裝版

使用Navicat作為MySql的資料庫管理工具

另外還需要下載JDBC驅動程式http://dev.mysql.com/downloads/connector/j/,工程需要引用裡面的jar包

①建立一個工具類JdbcUtils

import java.lang.reflect.Field;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class JdbcUtils {// 資料庫的登陸帳號密碼private final String USERNAME = "root";private final String PASSWORD = "123456";// JDBC驅動程式private final String DRIVER = "com.mysql.jdbc.Driver";// 資料庫地址private final String URL = "jdbc:mysql://localhost:3306/test";// 三個重要類的對象private Connection connection;private PreparedStatement ps;private ResultSet resultSet;public JdbcUtils() {try {// 步驟1:載入驅動程式Class.forName(DRIVER);// 步驟2:建立串連,這裡的處理是當執行個體化這個工具類對象時就完成這兩個步驟connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);} catch (ClassNotFoundException e) {// TODO 自動產生的 catch 塊e.printStackTrace();} catch (SQLException e) {// TODO 自動產生的 catch 塊e.printStackTrace();}}// 封裝的update函數public int update(String sql, List<Object> params) throws SQLException {int result = 0;// 步驟3:建立一個Statement,添加相關參數ps = connection.prepareStatement(sql);if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++)// 注意資料庫的下標都是從1開始的,第i個預留位置填充params的第i個值ps.setObject(i + 1, params.get(i));}// 步驟4:執行SQL語句,步驟5和6則留給用戶端處理result = ps.executeUpdate();return result;}// 封裝的query函數,返回的是List套個Map,資料庫是以索引值對的形式儲存的public List<Map<String, Object>> query(String sql, List<Object> params)throws SQLException {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();// 步驟3:建立一個Statement,添加相關參數ps = connection.prepareStatement(sql);if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++)ps.setObject(i + 1, params.get(i));}// 步驟4:執行SQL語句resultSet = ps.executeQuery();// 步驟5:處理執行結果// 擷取此ResultSet對象的列的屬性ResultSetMetaData metaData = resultSet.getMetaData();// 列的長度int col_len = metaData.getColumnCount();// 若有下一條記錄while (resultSet.next()) {// 將該條記錄以map形式儲存Map<String, Object> map = new HashMap<String, Object>();for (int i = 0; i < col_len; i++) {// 根據列名獲得索引值並存放在map中String col_name = metaData.getColumnName(i + 1);Object col_value = resultSet.getObject(col_name);map.put(col_name, col_value);}// 將該記錄添加到list中list.add(map);}// 遍曆完resultSet返回listreturn list;}// 封裝步驟6關閉JDBC對象public void release() {if (resultSet != null)try {resultSet.close();} catch (SQLException e) {// TODO 自動產生的 catch 塊e.printStackTrace();}if (ps != null)try {ps.close();} catch (SQLException e) {// TODO 自動產生的 catch 塊e.printStackTrace();}if (connection != null)try {connection.close();} catch (SQLException e) {// TODO 自動產生的 catch 塊e.printStackTrace();}}}
②TestMain類

import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.Map;public class TestMain {public static void main(String[] args) {// TODO 自動產生的方法存根JdbcUtils jdbcUtils = new JdbcUtils();/*執行一:建立表*/// String sql0 =// "create table userinfo(id int primary key auto_increment, username varchar(64), password varchar(64))";// try {// jdbcUtils.update(sql0, null);// } catch (SQLException e) {// // TODO 自動產生的 catch 塊// e.printStackTrace();// }/*執行二:增加一條記錄*/// String sql = "insert into userinfo (username,password) values(?,?)";// List<Object> params = new ArrayList<Object>();// params.add("jack");// params.add("123456");// try {// jdbcUtils.update(sql, params);// } catch (SQLException e) {// // TODO 自動產生的 catch 塊// e.printStackTrace();// }/*執行三:修改一條記錄*/// String sql1 = "update userinfo set username = ? where id = ?";// List<Object> param1 = new ArrayList<Object>();// param1.add("tommy");// param1.add(2);// try {// jdbcUtils.update(sql1, param1);// } catch (SQLException e) {// // TODO 自動產生的 catch 塊// e.printStackTrace();// }/*執行四:刪除一條記錄*/// String sql2 = "delete from userinfo where username = 'tommy'";// try {// jdbcUtils.update(sql2, null);// } catch (SQLException e) {// // TODO 自動產生的 catch 塊// e.printStackTrace();// }/*執行五:查詢所有記錄*/// String sql3 = "select * from userinfo";// try {// List<Map<String, Object>> list = jdbcUtils.query(sql3, null);// System.out.println(list);// } catch (SQLException e) {// // TODO 自動產生的 catch 塊// e.printStackTrace();// }}}
執行步驟一:建立一個新的表(以下說的執行步驟沒有說明的話都是指單獨執行,其他步驟都注釋掉)



執行步驟二:建立一個表,有三個欄位,id是主鍵


連續執行步驟三兩次:增加兩條記錄

執行步驟四:將第二條記錄修改


執行步驟五:刪除第二條記錄


執行步驟六:查詢到一條記錄


再次執行步驟一和步驟五:查詢到多條記錄



執行個體二:應用反射機制來實現查詢資料庫記錄

①建立一個和資料庫欄位匹配的類UserInfo

public class UserInfo {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "UserInfo [id=" + id + ", username=" + username + ", password="+ password + "]";}}
②在JdbcUtils類中添加一個應用反射機制的資料庫查詢函數

public <T> List<T> queryRef(String sql, List<Object> params, Class<T> cls)throws Exception {List<T> list = new ArrayList<>();ps = connection.prepareStatement(sql);if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++)ps.setObject(i + 1, params.get(i));}resultSet = ps.executeQuery();ResultSetMetaData metaData = resultSet.getMetaData();int col_len = metaData.getColumnCount();while (resultSet.next()) {// 存在記錄時,執行個體化一個對象T record = cls.newInstance();for (int i = 0; i < col_len; i++) {String col_name = metaData.getColumnName(i + 1);Object col_value = resultSet.getObject(col_name);// 將列對應的值賦給對象的相應欄位Field field = cls.getDeclaredField(col_name);field.setAccessible(true);field.set(record, col_value);}// 將這條記錄添加到List中list.add(record);}return list;}
③TestMain類,添加一個執行操作

/*執行六:反射機制查詢記錄*/String sqlQuery = "select * from userinfo";try {List<UserInfo> list = jdbcUtils.queryRef(sqlQuery, null,UserInfo.class);System.out.println(list);} catch (Exception e) {// TODO 自動產生的 catch 塊e.printStackTrace();} finally {jdbcUtils.release();}
執行步驟六



    

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.