1. 程式人生 > >jdbc的簡單封裝(使用properties檔案)

jdbc的簡單封裝(使用properties檔案)

在前面兩篇部落格preparedstatement簡單操作statement簡單操作中,我們會發現很明顯的一個問題就是,jdbc的Driver,connection的url,mysql的username和password具體的值都寫在了java檔案之中,這樣子是不利於我們維護的,比如說,我們做專案的時候是使用本地的資料庫進行測試,當我們專案做完了,交接的時候自然要用客戶自己的資料庫,難道要讓客戶深入到程式碼去修改上面的值嗎….

最好的做法是將這些需要更改的東西寫進一個配置檔案之中…這樣客戶自己去修改配置檔案就可以的…無需對我們寫的程式碼傷筋動骨的….

我把上述的值都寫進了一個叫jdbc.properties的檔案之中(.properties檔案是配置檔案哦)…
檔案的內容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=true
jdbc.username=root
jdbc.password=scott

寫了這個配置檔案之後,我寫了一個工具類來獲取這些值,和封裝了的帶connection和關閉流的方法,
工具類的具體內容如下:

package JDBCUtils;

import java.io.InputStream;
import java.sql.Connection;
import
java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; public class JDBCUtils { private static Properties p = new Properties(); static{ try { InputStream is = Thread.currentThread(). getContextClassLoader().getResourceAsStream("jdbc.properties"
); p.load(is); Class.forName(p.getProperty("jdbc.driverClassName")); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection(){ try { return DriverManager.getConnection(p.getProperty("jdbc.url"), p.getProperty("jdbc.username"),p.getProperty("jdbc.password")); } catch (Exception e) { e.printStackTrace(); return null; } } public static void close(Connection conn , PreparedStatement ps , ResultSet rs ){ if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ if(ps != null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } } } } } }

下面是重頭戲:
在前面兩篇部落格之中,我們都要很幸苦的一個一個的給preparedstatement的佔位符設定值..
我們就將這些東西封裝好,以後就不用反覆設定了…

我們對資料庫的操作有四種,增刪查改,而粗略的分,只有兩種,就是更新(此處是隻對資料庫的更新)和查詢,所以我封裝了query和update兩個方法
下面是程式碼:

package JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBC_Functions {
    //DML操作....
    public static Integer update(String sql , Object...params){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            if(params != null){
                for(int i = 0 ; i<params.length ; i++){
                    ps.setObject(i+1, params[i]);
                }
            }
            ps.execute();
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }finally{
            JDBCUtils.close(conn, ps, null);
        }
    }

    //DDL操作....
    public static <T> T query(String sql , IResultSetHandler<T> rsh,Object...params){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            if( params != null){
                for(int i = 0 ; i < params.length ; i++ ){
                    ps.setObject(i+1, params[i]);
                }
            }
            rs = ps.executeQuery();
            return (T) rsh.handler(rs);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally{
            JDBCUtils.close(conn, ps, rs);
        }
    }
}

通過上面的程式碼,你會發現,每次進行資料庫操作的時候,只需要將sql語句和佔位符?的值傳進封裝好的query或者update方法裡面就大功告成了….那我們的dao層方法只需要幾行程式碼就可以了…..

看到這裡,你可能會問,query的第二個引數IResultSetHandler rsh是什麼東西呢….
因為我每次將資料從資料庫裡取出來,都會把它們轉化成java的物件,之前通過ResultSet做迴圈取值和設值來轉化,如果在query方法裡面來完成這個轉化,那這個query方法就不是通用的了…

因為有些類具有不一樣的欄位,用一個方法就完成不同類的轉化,這不太可能…所以我寫了一個介面,裡面有一個負責完成從資料庫資料轉化成java物件的方法…..

介面具體程式碼如下:

package JDBCUtils;

import java.sql.ResultSet;

public interface IResultSetHandler<T> {
    T handler(ResultSet rs);
}

所以每有一個類需要這種轉化,我們都需要實現這個介面,實現這個方法,將具體的轉化過程寫在這個實現的方法裡面…這也是介面的意義所在(制定一套規範,在後面實現….)

好了,下面我用User類做師範,實現一下對User的增刪查改,
User的程式碼如下:

package Pojo;

public class User {
    private Integer id;
    private String username;
    private String password;
------------------------------
    getter和setter方法
------------------------------

    public User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User() {
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + "]\n";
    }
}

首先要實現一個IResultSetHandler的介面,程式碼如下….

package JDBCUtils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import Pojo.User;

public class UserResultSetHandler implements IResultSetHandler<List<User>>{

    public List<User> handler(ResultSet rs) {
        List<User> userList = new ArrayList<User>();
        try {
            while(rs.next()){
                int id = rs.getInt("ID");
                String username = rs.getString("USERNAME");
                String password = rs.getString ("PASSWORD");
                User u = new User(id,username,password);
                userList.add(u);
            }
            return userList;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

}

實現介面之後,我們寫一個UserDao,封裝對User進行增刪查改的四個方法…..
程式碼如下:

package Dao;

import java.util.List;

import JDBCUtils.JDBC_Functions;
import JDBCUtils.UserResultSetHandler;
import Pojo.User;

public class UserDao {
    public void findUsers(){
        String sql = "SELECT * FROM USER";
        List<User> userList = JDBC_Functions.query(sql, new UserResultSetHandler());
        System.out.println(userList);
    }

    public void deleteUser(int id){
        String sql = "DELETE FROM USER WHERE ID = ?";
        JDBC_Functions.update(sql, id);
        System.out.println("刪除成功.....");
    }

    public void addUser(User u){
        String sql = "INSERT INTO USER(ID,USERNAME,PASSWORD) VALUES(?,?,?)";
        JDBC_Functions.update(sql, u.getId(),u.getUsername(),u.getPassword());
        System.out.println("新增成功....");
    }

    public void updateUser(User u ){
        String sql = "UPDATE USER SET USERNAME = ? ,PASSWORD = ? WHERE ID = ?";
        JDBC_Functions.update(sql, u.getUsername(),u.getPassword(),u.getId());
        System.out.println("更新成功....");
    }
}

下面是開始測試了:

package App;

import Dao.UserDao;
import Pojo.User;

public class JDBCTest3 {
    public static void main(String[] args) {

        UserDao ud = new UserDao();

        System.out.println("------增加前--------");
        ud.findUsers();
        User u = new User(7,"white","9999999");
        ud.addUser(u);
        System.out.println("------增加後--------");
        ud.findUsers();

        System.out.println("\n");
        ud.deleteUser(7);
        System.out.println("------刪除後--------");
        ud.findUsers();

        System.out.println("\n");
        u = new User(3,"UZI","666666");
        ud.updateUser(u);
        System.out.println("------更新後--------");
        ud.findUsers();
    }
}

結果如下:
結果

相關推薦

Android----------OkHttp網路請求框架Get和Post簡單封裝泛型

請求框架的類: OkHttp依賴: compile 'com.squareup.okhttp3:okhttp:3.8.1' RecyclerView依賴: compile 'com.android.support:recyclerview-v7:26.0.0-alpha1

jdbc簡單封裝使用properties檔案

在前面兩篇部落格preparedstatement簡單操作和statement簡單操作中,我們會發現很明顯的一個問題就是,jdbc的Driver,connection的url,mysql的username和password具體的值都寫在了java檔案之中,這樣子

利用jdbc簡單封裝一個小框架類似DBUtils

add string url lar conn () 列名 lang con 利用jdbc寫的一個類似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.

jdbc中對mysql數據庫操作的簡單封裝--僅做備忘記錄

nihao lse bin javaee sub getc eva 目的 web-inf 本次使用jdbc中的mysql-connector-java-5.1.47-bin.jar的連接包,下載這個jar包放在javaee項目的WEB-INF/lib目錄下,再把它作為外包j

jdbc簡單封裝使用map處理結果集

在上一片篇部落格中,我們在查詢的時候,是採用實現IResultSetHandler這個類的handle方法來處理查詢返回的資料的,但是這樣做有一個缺點,查詢不同的表,每次都要實現這個handle方法,增

利用JavaCompiler編譯java檔案一個簡單封裝的工具類

  最近,在利用java做一個Online Judge系統,裡面涉及到編譯java檔案為class檔案,當時看過API文件,也百度過別人的一些部落格,感覺都不太符合個人胃口。雖然,有說得詳細的,也有很多權威的,也有很多使用例子的。但是主要是感覺學習成本過高了,他們都過多過少

windows下Libevent的多執行緒封裝檔案傳輸為例

1、主執行緒負責監聽,子執行緒負責響應連線,同時每個子執行緒增加了連結串列來管理連線進來的客戶端,將上一節中的記憶體管理類也封裝進去。總體框架是不變的。 2、封裝類的實現: #pragma once #include "winsock2.h" #include "event2/liste

利用ServletContext物件讀取資原始檔比如properties檔案

讀取資原始檔要根據資原始檔所在的位置來決定,一般分為以下兩種情況:   4.1:檔案在WebRoot資料夾下,即Web應用的根目錄。這時候我們可以使用ServletContext來讀取該資原始檔。 假設我們Web根目錄下有一個配置資料庫資訊的dbinfo.properties檔

阿里雲OSS單檔案斷點續傳+前端 簡單展示springmvc架構

業務沒有需要多檔案一起上傳,所以這裡只是單檔案,多檔案的話也是在獲得File的地方變成List即可,多個迴圈,多一些執行緒,網上有程式碼 一、pom.xml <dependencys> <dependenc

讀取配置檔案的工具類 properties檔案和xml檔案

讀取properties檔案的工具類 import java.io.File; import java.io.IOException; import java.util.Properties; /** * 讀取properties檔案的工具類 * @author * */ pub

Retrofit+Rxjava 網路請求的簡單封裝觀察者模式

我通過公司一個上線App介面來進行Retrofit+Rxjava 的簡單學習 http://x-phone.cn/api/v1.0/DeletePrivateContact 當然你直接訪問上面的url是無法獲取伺服器Json資料的,因為是需要封裝請求體,

ROS Learning-010 beginner_Tutorials 編寫簡單的啟動指令碼檔案.launch 檔案

ROS Indigo beginner_Tutorials-09 編寫簡單的啟動指令碼檔案 我使用的虛擬機器軟體:VMware Workstation 11 使用的Ubuntu系統:Ubuntu 14.04.4 LTS ROS 版本:ROS Indigo

Maven中的-DProperties屬性和-PProfiles配置檔案

-D代表(Properties屬性) 使用命令列設定屬性-D的正確方法是: mvn -DpropertyName=propertyValue clean package 如果propertyName不存在pom.xml,它將被設定。如果propertyName已經存在pom.xml,其值將被作為引數傳遞

C#/.NET 反射配置檔案實現簡單工廠

C# 反射(配置檔案)實現簡單工廠 配置檔案 <?xml version="1.0" encoding="utf-8"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="

Java使用JDBC連線Hive新版本API封裝

網上找了很多封裝的API,發現都是過時了的,執行報各種錯誤,經過了幾天的調錯,終於可以使用java程式碼操作hive了 首先看看所需的包 所有的分析都在程式碼裡面 注意:網上很多程式碼對於DDL都執行 res = stmt.executeQuery(

商城購物車加減控制元件的簡單封裝,解決ListView中資料錯亂的問題

在上一篇文章中,我們學習了商城購物車加減控制元件的簡單封裝,知道了封裝的思路過程和使用方法。還沒有看過上一篇文章的朋友,建議先去閱讀 商城購物車加減控制元件的簡單封裝 。這段時間收到一些小夥伴的反饋,在ListView或者是RecyclerView中存在ite

檔案 and 多下載任務的封裝---執行緒池的封裝ThreadPool,TheadManager

ThreadManager 前段時間對三級快取機制做了系統的分析,但是對於網路下載的問題還有很多,比如今天遇到的問題,針對一些需要下載大檔案,並且需要進行多執行緒下載的應用來說,(比如,像一

ajax簡單封裝個人感覺一直呼叫ajax太麻煩了---直接呼叫方法,傳入不同的引數就可以

(封裝的ajax方法 url type=1或者2 isString傳送形式 data=傳遞資料) AjaxData: function(url, type, contentType, data, funSuc, funErr) {     if (type == -1)

一個簡單的函式封裝JavaScript+html

本程式演示的是一個簡單的怎麼把程式碼寫的更好少點,提高程式碼的利用。 比如想給三個div不一樣的顏色,我們該怎麼寫?(本程式雖然很簡單,但是程式思想很好) 效果如下: 第一種寫法:<!D

PHP PDO的簡單封裝使用命名空間方式

try exec函數 sta array demo state sdf 模式 引入 直接上代碼:要點都在註釋中了 <?php namespace core; //引入全局空間類:PDO相關的3個類 use \PDO,\PDOStatement,\PDOExcep