Java基礎 - 使用JDBC連接mysql數據庫

最近複習了一下Java的基礎,包括封裝、繼承、多態、IO、多線程、反射等等,但我感覺JDBC是個大塊,花了半天時間實踐總結了一下,順帶記錄一波。主要是模板,在以後編程中大概率會用到,尤其是下學期的《數據庫編程》課程。

就記錄一下基礎的,至於遊標、觸發器、存儲過程以後有機會了再詳細寫吧。


JDBC

JDBC是Java和數據庫之間的一個橋樑。Java代碼需要連接數據庫,就可以通過JDBC來連接。

首先是應用模板,因爲我每次來看博客,都是因爲某段代碼忘記則麼敲了。需要看具體原理實現的請往下拉。

以下所有代碼純手打,我都親自試過好幾遍,複製即可用。


使用前提:

  1.  導入一個jar包,包全名是mysql-connector-java-5.1.22-bin.jar
  2.  mysql數據庫名稱爲test,表名爲dbtable,賬戶名爲root,密碼爲123456    當然也可以自行修改
  3.  test數據庫中,有dbtable表,三個字段:a_id (int),a_name(String),a_password(String)   可自行修改

第1/3步:新建一個 JdbcUtils 類,該類作用只是連接上mysql數據庫,僅僅如此。

getConnection()方法用來獲取連接,static靜態,執行一次即可

import java.sql.*;

public class JdbcUtils {

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection() throws SQLException {
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                "root","123456");
        return conn;
    }
    
    public static void close(ResultSet rs, Statement st,Connection conn){
        if (rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(st != null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

第2/3步:新建一個 JdbcDao 類,該類是用來對數據庫進行增刪改查的,在測試函數內可以直接調用insert(),等方法使用。

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

public class JdbcDao {

    private JdbcUtils jdbcUtils = new JdbcUtils();
    private String TableName = "dbtable";

    public int insert(User user) throws SQLException {
        Connection conn = jdbcUtils.getConnection();
        String sql = "insert into " + TableName +" values(?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql); // 預編譯

        int a_id = user.getId();
        String a_name = user.getName();
        String a_password = user.getPassword();

        ps.setInt(1,a_id);
        ps.setString(2,a_name);
        ps.setString(3,a_password);

        int ans = ps.executeUpdate();
        return ans;
    }
    public int update(String name,String password) throws SQLException {
        Connection conn = jdbcUtils.getConnection();
        String sql = "update " + TableName + " set a_password = ? where a_name = ?";
        PreparedStatement ps = conn.prepareStatement(sql); // 預編譯

        ps.setString(1,password);
        ps.setString(2,name);

        int ans = ps.executeUpdate();
        return ans;
    }
    public int delete(int id) throws SQLException {
        Connection conn = jdbcUtils.getConnection();
        String sql = "delete from "+ TableName +" where a_id = ?";
        PreparedStatement ps = conn.prepareStatement(sql); // 預編譯
        ps.setInt(1,id);
        int ans = ps.executeUpdate();
        return ans;
    }
    public void findPassword(String name) throws SQLException {
        Connection conn = jdbcUtils.getConnection();
        String sql = "select a_password from "+ TableName + " where a_name = ?";
        PreparedStatement ps = conn.prepareStatement(sql); // 預編譯
        ps.setString(1,name);
        ps.execute();
        ResultSet rs = ps.executeQuery();
        while(rs.next()){
            System.out.println("密碼爲  " +  rs.getString("a_password"));
        }
    }
}

第3/3步:新建測試函數 DbMain ,分別對 JdbcDao 的增刪改查方法進行測試。

import java.sql.SQLException;

public class DbMain {
    public static void main(String[] args) throws SQLException {
        JdbcDao jdbcDao = new JdbcDao();
        jdbcDao.insert(new User(1,"zwz","123"));
        jdbcDao.update("zwz","123456789");
        jdbcDao.findPassword("zwz");
        jdbcDao.delete(1);
    }
}

以上是實際編程的時候,經常需要用到的模板。 


接着來好好總結一下這幾天看的JDBC

第一步:首先最最基礎的,就是連接上mysql

    Class.forName("com.mysql.jdbc.Driver");
    String URL = "jdbc:mysql://localhost:3306/test";
    String USER = "root";
    String PASS = "123456";
    Connection conn = DriverManager.getConnection(URL,USER,PASS);

代碼第一行 Class.forName()的用途,是利用Java的反射機制,加載mysql的驅動。就好比有了聲卡驅動,纔有可能有聲音;有了打印機驅動,你的打印機纔可能正常運行。

第五行 DriverManager.getConnection方法,是用來創建一個對象和mysql數據庫(以mysql爲例)進行連接,並返回這個Collection對象。是數據庫編程中最重要的一個對象,就好比一個信使,客戶端與數據庫所有交互都是通過connection對象完成的。


第二步:連接mysql成功之後,就是利用sql代碼進行一系列操作

這裏有兩個類供我們選擇,一個是Statement,另外一個是PreparedStatement(前者的子類)。他們都是用於向數據庫發送SQL語句。但是Statement只能發送靜態的SQL語句,比如“select * from admin where name = 'zwz' ”,其中的屬性不能修改,而且存在SQL注入等安全性問題,所以我推薦使用PreparedStatement,一者是安全性高,再者是功能強大。

我們先用Statement試一下,Statement 對象 st 獲取用於向數據庫發送sql語句。

ResultSet 對象 rs 用於接受數據庫返回的查詢結果。

    Statement st = conn.createStatement();
    String sql = "select * from admin";
    ResultSet rs =  st.executeQuery(sql);

接着,我們可以對查詢結果進行輸出顯示

    while(rs.next()){
        String id = rs.getString("a_id");
        String user = rs.getString("a_name");
        String passwd = rs.getString("a_password");
        System.out.println(id + " " + user + " " + passwd);
    }

Statement的最大缺點就是隻能靜態,而PreparedStatement類可以彌補這個缺陷。PreparedStatement也是一樣,是一個緩存中轉站,用於向數據庫發送SQL語句。

    String sql = "select * from admin where a_id = ?";
    int idd = 1;
    PreparedStatement ps = conn.prepareStatement(sql);//預編譯
    ps.setInt(1,idd);
    ps.executeQuery();
    ResultSet rs = ps.executeQuery();
    while(rs.next()){
        String id = rs.getString("a_id");
        String name = rs.getString("a_name");
        String passwd = rs.getString("a_password");
        System.out.println(id + " " + name + " " + passwd);
    }

以上代碼,可以實現where字句對查詢結果的篩選。一個很明顯的語法格式,就是預編譯

其中SQL語句有若干個問號,代表某個值我等下要放進去,等PreparedStatement預編譯完成之後,再通過set方法插入剛剛缺少的值,最後提交到數據庫。

不管是什麼SQL語句,某個字段需要動態改變的,都預先放一個問號,然後再set導入即可。


第三步 釋放對象

養成良好的習慣,new了什麼,就關閉什麼。

if(conn != null)   conn.close();

遊標、觸發器、存儲過程也用成功了,有點小複雜,以後再補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章