1. 程式人生 > >Java連線資料庫DBHelper增刪改查[多條資料]

Java連線資料庫DBHelper增刪改查[多條資料]

補充!忘記寫思路了。。。
思路
1. 使用Class.forName()載入驅動
2. 驅動管理指定資料庫並連線 Connection conn = DriverManager.getConnection()
3. 連線後,使用連接獲取預處理(處理sql語句) PreparedStatement pst = conn.preparedStatement(“sql語句”)
4. 使用預處理執行相應操作得到一個結果集 ResultSet rs = pst.executeQuery();
5. 獲取元資料即資料庫中一部分資料 ResultSetMetaData rsd = rs.getMetaData();
6. rsd中則包含資料庫資訊一定要要判斷rsd.next() 是否有值,才能進一步操作
7. 根據資料庫欄位名獲取資料庫中相應的值 rs.getObject(“欄位名”); 8.最後關閉連線,預處理,結果集

上午一大早被吵醒…乾脆起來寫程式碼,於是就有了這個DBHelper工具類,算是複習複習。
在實際開發過程中沒有資料庫基本是不能活呀!改工具類寫了較詳細的註釋。
都是根據自己的理解寫的,如果不對之處歡迎提出!不勝感激。

檔案包括:
- jar包 oracle和mysql
- 一下描述到的類和配置檔案

檔案結構圖
這裡寫圖片描述

此類支援以下功能

  1. 增加
  2. 刪除
  3. 修改
  4. 查詢結果只有單條資料
  5. 查詢結果有多條資料
  6. 多條語句查詢

MyDbHelper類

package com.wy.mydb;

import java.io.IOException;
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; import com.wy.properties.MyProperties; public class
MyDbHelper {
private Connection conn = null; private PreparedStatement ps = null; private ResultSet rs = null; //載入驅動 static { try { //方式一 固定寫死 不方便更改資料庫操作 // Class.forName("com.mysql.jdbc.Driver"); //Oracle驅動為: oracle.jdbc.driver.OracleDriver //方式二 讀取配置檔案操作 如果需要更換資料庫只需要修改配置檔案即可 推薦 try { Class.forName(MyProperties.getInstance().getProperty("driverName")); } catch (IOException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } //驅動管理連線指定資料庫 獲取連線物件 public Connection getConnection() { try { //方式一 固定寫死 不方便更改資料庫操作 //驅動管理指定資料庫並連線 引數說明 埠資訊 資料庫賬戶 密碼 // conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "a"); //方式二 讀取配置檔案操作 如果需要更換資料庫只需要修改配置檔案即可 推薦 try { conn = DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance()); } catch (IOException e) { e.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); } return conn; } //關閉所有物件 連線 預處理 結果集 public void closeAll(Connection conn,PreparedStatement ps,ResultSet rs) { if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps!=null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } /**單條語句的增刪改 說明:在執行成功後函式返回的結果為非零整數 * @param sql 需要執行的sql語句 * @param params 執行sql語句的引數 * @return */ public int doUpdate(String sql,List<Object> params) { int result = 0; //獲取連線 conn = getConnection(); //預處理 try { ps = conn.prepareStatement(sql); //設定引數得到結果集 this.setParams(ps,params); //預處理執行得到結果反饋 result = ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally { //關閉所有物件 this.closeAll(conn, ps, rs); } return result; } /** * 多條語句的增刪改 說明:這些語句要麼同時成功,要麼都失敗 * @param sqls 多條sql語句 * @param params 執行引數 * @return */ public int doUpdate(List<String> sqls,List<Object> params) { int result = 0; //獲取連線 conn = getConnection(); try { //多條語句的執行涉及到事務 設定事務提交方式為手動 conn.setAutoCommit(false); //判斷sql語句集合 if(sqls!=null&&sqls.size()>0) { //迴圈每一條語句執行 for(int i=0;i<sqls.size();i++) { ps = conn.prepareStatement( sqls.get(i) ); //設定引數 ps.setObject(i+1, params.get(i)); //執行並反饋 result = ps.executeUpdate(); } } //手動提交資料 conn.commit(); } catch (SQLException e) { //出現錯誤則回滾資料 try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } finally { //回覆事務自動提交 try { conn.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); } //關閉所有物件 this.closeAll(conn, ps, rs); } return result; } /** * 設定預處理的引數 * @param ps 預處理 * @param params 引數集合 * @throws SQLException */ public void setParams(PreparedStatement ps,List<Object> params) throws SQLException { if(params!=null&&params.size()>0) { for(int i=0;i<params.size();i++) { ps.setObject(i+1, params.get(i)); } } } /** * 查詢sql語句單條結果 * @param sql 查詢的sql語句 * @param params執行sql所需引數 * @return */ public Map<String,Object> findSingleObject(String sql,List<Object> params){ Map<String,Object> map = new HashMap<String,Object>(); //獲取連線 conn = getConnection(); //預處理 try { ps = conn.prepareStatement(sql); //設定引數 this.setParams(ps, params); //執行查詢得到結果集 rs = ps.executeQuery(); //獲取資料庫該表所有欄位名 List<String> names = getAllColumnName(rs); if(rs.next()) { //迴圈names for(String name:names) { map.put(name, rs.getObject(name) ); } } } catch (SQLException e) { e.printStackTrace(); } finally { //關閉物件 this.closeAll(conn, ps, rs); } return map; } /** * 查詢sql語句多條結果 * @param sql * @param params * @return */ public List<Map<String,Object>> findMulitObject(String sql,List<Object> params){ List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); //連線 conn = this.getConnection(); //預處理 try { ps = conn.prepareStatement(sql); //設定引數 this.setParams(ps, params); //執行查詢得到結果集 rs = ps.executeQuery(); //獲取所有列名 List<String> names = this.getAllColumnName(rs); while(rs.next()) { //注意這裡不能用if 因為使用if的話只能執行一次 最後得到的結果就成了查一條資料 Map<String, Object> map = new HashMap<String,Object>(); //迴圈迭代 for(String name:names) { map.put(name, rs.getObject(name)); } list.add( map ); } } catch (SQLException e) { e.printStackTrace(); } return list; } /** * 根據結果集獲取資料庫中的所有列表名 * @param rs * @return */ private List<String> getAllColumnName(ResultSet rs) { List<String> names = new ArrayList<String>(); try { ResultSetMetaData rsmd = rs.getMetaData(); for(int i=0;i<rsmd.getColumnCount();i++) { names.add( rsmd.getColumnName(i+1) ); } } catch (SQLException e) { e.printStackTrace(); } return names; } }

MyProperties類 說明:用於讀取配置檔案db.properties

package com.wy.properties;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 整個類只需要建立一個物件
 * 設計成單例模式
 */
public class MyProperties extends Properties{

    private static MyProperties myProperties;

    private MyProperties() throws IOException{
        InputStream in = MyProperties.class.getClassLoader().getResourceAsStream("db.properties");
        try {
            this.load(in);
        } catch (IOException e) {       
            e.printStackTrace();
            throw e;
        }
    }

    public static MyProperties getInstance() throws IOException{
        if(null==myProperties){
            myProperties = new MyProperties();
        }
        return myProperties;
    }
}

db.properties 說明:輸入自己的資料庫連結密碼 注意 所有輸入後面不能有空格! 那句英文我感覺有錯誤…寫英文的原因是,中文會被處理

#oracle
#driverName=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#password=   please input your database password

#mysql  #please input your database password
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=   please input your database password

資料庫檔案

create table student(
    sid int primary key auto_increment,
    sname varchar(10)
)

insert into student(sname) values('馬小跳')
insert into student(sname) values('淘氣包')

select * from student where sid = 2
delete from student where sid = 3