使用JDBC完成分類表CRUD的操做

 工具類

 經過以前的案例回顧,不難發現,有不少的代碼操做是重複的,好比「獲取連接」和「釋放資源」等,未來在增刪改查中常常遇到,開發中遇到這種狀況,將採用工具類的方法進行抽取,從而達到代碼的重複利用。java

此處使用V1版本,以後還有替他版本。mysql

獲取連接git

    /**
     * 獲取鏈接方法
     * 
     * @return
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root", "root");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
View Code

釋放資源 github

    public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
View Code

 編寫查詢案例

 建立新的 Java 工程

編寫工具類 JDBCUtils.java

package cn.jayvee.jdbc;

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


/**
 * 提供獲取連接和資源的方法
 * @author Jayvee
 * @date 2019-5-12 下午4:22:24
 * @version V1.0
 *
 */
public class JDBCUtils_V1 {

    /**
     * 獲取連接方法
     * @return
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbtest","root","123456");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    
    
    public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt!=null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
}

 編寫測試類 TestUtils.java

package cn.jayvee.test;

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

import org.junit.Test;

import cn.jayvee.jdbc.JDBCUtils_V1;

/**
 * 測試工具類
 * 
 * @author Jayvee
 * @date 2019-5-12 下午4:38:54
 * @version V1.0
 */
public class TestUtils {

    /**
     * 根據id查詢用戶信息
     */
    @Test
    public void testFindUserById() {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            // 1.獲取連接
            conn = JDBCUtils_V1.getConnection();
            // 2.編寫sql語句
            String sql = "select * from student where id=?";
            // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql);
            // 4.設置參數(1表示第一個問號,2表示第一個問號的值是2)
            pstmt.setInt(1, 2);
            // 5.執行查詢操做
            rs = pstmt.executeQuery();
            // 6.處理結果集
            while (rs.next()) {
                // rs.getString(2)表示獲取這條數據的第二列的數據
                // rs.getString("age")表示獲取這條數據中age字段的之
                System.out.print(rs.getString(2) + "----" + rs.getString("age"));
            }
            // 釋放資源放在這裏不可行!
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 7.釋放資源
            JDBCUtils_V1.release(conn, pstmt, rs);
        }
    }

}

 數據庫數據

   

運行結果

  

使用 Properties 配置文件

  開發中得到連接的四個參數(驅動、URL、用戶名、密碼)一般都存在在配置文件中,方便後期維護,程序若是須要更換數據庫,只須要修改配置文件便可。web

一般狀況下,咱們習慣使用 properties 文件,此文件咱們將做以下要求:sql

  1. 文件位置:任意,建議src下。數據庫

  2. 文件名稱:任意,擴展名爲 properties 。ide

  3. 文件內容:一行一組數據,格式是「 key = value 」。工具

    a)key 命名自定義,不能帶有空格,若是是多個單詞,習慣使用點分隔。例如「 jdbc.driver 」測試

    b)value值不支持中文,不能帶有空格,若是須要使用非英文字符,將進行 Unicode 轉換。

項目練習

在 src 目錄下建立一個 db.properties 配置文件。

  

文件內編寫以下配置(具體狀況具體改)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbtest?useUnicode=true&characterEncoding=utf8
username=root
password=123456

加載配置文件:ResourceBundle 對象

  咱們在V2版本中使用JDK提供的工具類 ResourceBundle 加載 properties 文件,ResourceBundle 提供 getBundle() 方法用於只提供 properties 文件便可,以後使用 getString(key) 經過 key 得到 value的值。

編寫代碼案例 

建立一個JDBCUitls_V2.java 工具類

  

編寫內容

package cn.jayvee.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;


/**
 * 提供獲取連接和資源的方法
 * @author Jayvee
 * @date 2019-5-12 下午4:22:24
 * @version V1.0
 *
 */
public class JDBCUtils_V2 {
    
    private static String driver; private static String url; private static String username; private static String password; /** * 靜態代碼塊加載配置文件信息 */
    static{ // 加載配置文件
        ResourceBundle bundle = ResourceBundle.getBundle("db"); driver = bundle.getString("driver"); url = bundle.getString("url"); username = bundle.getString("username"); password = bundle.getString("password"); } /** * 獲取連接方法 * @return
     */
    public static Connection getConnection(){ Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url,username,password); } catch (Exception e) { e.printStackTrace(); } return conn; } /**
     * 釋放資源
     * @param conn
     * @param pstmt
     * @param rs
     */
    public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt!=null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

 編寫 TestUtils.java 文件

package cn.jayvee.test;

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

import javax.management.RuntimeErrorException;

import org.junit.Test;

import cn.jayvee.jdbc.JDBCUtils_V1;
import cn.jayvee.jdbc.JDBCUtils_V2;

/**
 * 測試工具類
 * 
 * @author Jayvee
 * @date 2019-5-12 下午4:38:54
 * @version V1.0
 */
public class TestUtils {

    
    /** * 添加用戶信息方法 */ @Test public void testAdd(){ Connection conn = null; PreparedStatement pstmt = null; try { // 1.獲取鏈接
            conn = JDBCUtils_V2.getConnection(); // 2.編寫 sql 語句
            String sql = "insert into student values(null,?,?)"; // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql); // 4.設置參數
            pstmt.setString(1, "wangjiawei"); pstmt.setString(2, "25"); // 5.執行插入操做
            int row = pstmt.executeUpdate(); if (row>0) { System.out.println("添加成功!"); }else{ System.out.println("添加失敗!"); } } catch (Exception e) { throw new RuntimeException(e); }finally{ // 6.釋放資源
            JDBCUtils_V2.release(conn, pstmt, null); } } /**
     * 根據id查詢用戶信息
     */
    public void testFindUserById() {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            // 1.獲取連接
            conn = JDBCUtils_V1.getConnection();
            // 2.編寫sql語句
            String sql = "select * from student where id=?";
            // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql);
            // 4.設置參數(1表示第一個問號,2表示第一個問號的值是2)
            pstmt.setInt(1, 2);
            // 5.執行查詢操做
            rs = pstmt.executeQuery();
            // 6.處理結果集
            while (rs.next()) {
                // rs.getString(2)表示獲取這條數據的第二列的數據
                // rs.getString("age")表示獲取這條數據中age字段的之
                System.out.print(rs.getString(2) + "----" + rs.getString("age"));
            }
            // 釋放資源放在這裏不可行!
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 7.釋放資源
            JDBCUtils_V1.release(conn, pstmt, rs);
        }
    }

}

   

  

加載配置文件:Properties 對象

   對應 properties 文件的處理,開發中也會使用 Properties 對象將進行,在V3版本中,咱們將採用加載 properties 文件得到流,而後使用 properties 對象進行處理。

建立一個JDBCUitls_V3.java 工具類

   

編寫內容

package cn.jayvee.jdbc;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 提供獲取連接和資源的方法
 * 
 * @author Jayvee
 * @date 2019-5-12 下午4:22:24
 * @version V1.0
 * 
 */
public class JDBCUtils_V3 {

    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    /**
     * 靜態代碼塊加載配置文件信息
     */
    static {
        try {
            // 1.經過當前類獲取類加載器
            ClassLoader classLoader = JDBCUtils_V3.class.getClassLoader();
            // 2.經過類加載器的方法獲取一個輸入流
            InputStream is = classLoader.getResourceAsStream("db.properties");
            // 3.建立一個properties對象
            java.util.Properties props = new java.util.Properties();
            // 4.加載輸入流
            props.load(is);
            // 5.獲取相關參數的值
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            username = props.getProperty("username");
            password = props.getProperty("password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取連接方法
     * 
     * @return
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 釋放資源
     * 
     * @param conn
     * @param pstmt
     * @param rs
     */
    public static void release(Connection conn, PreparedStatement pstmt,
            ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

在 TestUtils.java 中編寫刪除方法

package cn.jayvee.test;

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

import javax.management.RuntimeErrorException;

import org.junit.Test;

import cn.jayvee.jdbc.JDBCUtils_V1;
import cn.jayvee.jdbc.JDBCUtils_V2;
import cn.jayvee.jdbc.JDBCUtils_V3;

/**
 * 測試工具類
 * 
 * @author Jayvee
 * @date 2019-5-12 下午4:38:54
 * @version V1.0
 */
public class TestUtils {

    
    /**
     * 根據id刪除信息
     */
    @Test
    public void testDeleteById(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            // 1.獲取鏈接
            conn = JDBCUtils_V3.getConnection();
            // 2.編寫 sql 語句
            String sql = "delete from student where id=?";
            // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql);
            // 4.設置參數
            pstmt.setInt(1, 3);
            // 5.執行刪除操做
            int row = pstmt.executeUpdate();
            if (row>0) {
                System.out.println("刪除成功!");
            }else{
                System.out.println("刪除失敗!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally{
            // 6.釋放資源
            JDBCUtils_V3.release(conn, pstmt, null);
        }
    }
    
    
    
    /**
     * 添加用戶信息方法
     */
    public void testAdd(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            // 1.獲取鏈接
            conn = JDBCUtils_V2.getConnection();
            // 2.編寫 sql 語句
            String sql = "insert into student values(null,?,?)";
            // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql);
            // 4.設置參數
            pstmt.setString(1, "wangjiawei");
            pstmt.setString(2, "25");
            // 5.執行插入操做
            int row = pstmt.executeUpdate();
            if (row>0) {
                System.out.println("添加成功!");
            }else{
                System.out.println("添加失敗!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally{
            // 6.釋放資源
            JDBCUtils_V2.release(conn, pstmt, null);
        }
    }
    
    /**
     * 根據id查詢用戶信息
     */
    public void testFindUserById() {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            // 1.獲取連接
            conn = JDBCUtils_V1.getConnection();
            // 2.編寫sql語句
            String sql = "select * from student where id=?";
            // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql);
            // 4.設置參數(1表示第一個問號,2表示第一個問號的值是2)
            pstmt.setInt(1, 2);
            // 5.執行查詢操做
            rs = pstmt.executeQuery();
            // 6.處理結果集
            while (rs.next()) {
                // rs.getString(2)表示獲取這條數據的第二列的數據
                // rs.getString("age")表示獲取這條數據中age字段的之
                System.out.print(rs.getString(2) + "----" + rs.getString("age"));
            }
            // 釋放資源放在這裏不可行!
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 7.釋放資源
            JDBCUtils_V1.release(conn, pstmt, rs);
        }
    }

}

  

    

在 TestUtils.java 中編寫更新方法

package cn.jayvee.test;

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


import org.junit.Test;

import cn.jayvee.jdbc.JDBCUtils_V1;
import cn.jayvee.jdbc.JDBCUtils_V2;
import cn.jayvee.jdbc.JDBCUtils_V3;

/**
 * 測試工具類
 * 
 * @author Jayvee
 * @date 2019-5-12 下午4:38:54
 * @version V1.0
 */
public class TestUtils {

    
    /** * 根據id更新信息 */ @Test public void testUpdateById(){ Connection conn = null; PreparedStatement pstmt = null; try { // 1.獲取鏈接
            conn = JDBCUtils_V3.getConnection(); // 2.編寫 sql 語句
            String sql = "update student set age=? where id=?"; // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql); // 4.設置參數
            pstmt.setInt(1, 18); pstmt.setInt(2, 1); // 5.執行更新操做
            int row = pstmt.executeUpdate(); if (row>0) { System.out.println("更新成功!"); }else{ System.out.println("更新失敗!"); } } catch (Exception e) { throw new RuntimeException(e); }finally{ // 6.釋放資源
            JDBCUtils_V3.release(conn, pstmt, null); } } /**
     * 根據id刪除信息
     */
    public void testDeleteById(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            // 1.獲取鏈接
            conn = JDBCUtils_V3.getConnection();
            // 2.編寫 sql 語句
            String sql = "delete from student where id=?";
            // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql);
            // 4.設置參數
            pstmt.setInt(1, 3);
            // 5.執行刪除操做
            int row = pstmt.executeUpdate();
            if (row>0) {
                System.out.println("刪除成功!");
            }else{
                System.out.println("刪除失敗!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally{
            // 6.釋放資源
            JDBCUtils_V3.release(conn, pstmt, null);
        }
    }
    
    
    
    /**
     * 添加用戶信息方法
     */
    public void testAdd(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            // 1.獲取鏈接
            conn = JDBCUtils_V2.getConnection();
            // 2.編寫 sql 語句
            String sql = "insert into student values(null,?,?)";
            // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql);
            // 4.設置參數
            pstmt.setString(1, "wangjiawei");
            pstmt.setString(2, "25");
            // 5.執行插入操做
            int row = pstmt.executeUpdate();
            if (row>0) {
                System.out.println("添加成功!");
            }else{
                System.out.println("添加失敗!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally{
            // 6.釋放資源
            JDBCUtils_V2.release(conn, pstmt, null);
        }
    }
    
    /**
     * 根據id查詢用戶信息
     */
    public void testFindUserById() {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            // 1.獲取連接
            conn = JDBCUtils_V1.getConnection();
            // 2.編寫sql語句
            String sql = "select * from student where id=?";
            // 3.獲取執行sql語句對象
            pstmt = conn.prepareStatement(sql);
            // 4.設置參數(1表示第一個問號,2表示第一個問號的值是2)
            pstmt.setInt(1, 2);
            // 5.執行查詢操做
            rs = pstmt.executeQuery();
            // 6.處理結果集
            while (rs.next()) {
                // rs.getString(2)表示獲取這條數據的第二列的數據
                // rs.getString("age")表示獲取這條數據中age字段的之
                System.out.print(rs.getString(2) + "----" + rs.getString("age"));
            }
            // 釋放資源放在這裏不可行!
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 7.釋放資源
            JDBCUtils_V1.release(conn, pstmt, rs);
        }
    }

}

 

 

項目代碼https://github.com/wjw1014/JavaMysqlStudy/tree/master/web09 (小白操做,僅供參考!)

相關文章
相關標籤/搜索