【2019.10.13】Java 抽取JDBC工具類,實現登錄案例

工具類

  • JDBCUtils.java
package ybs.utils;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/*
JDBC工具類
 */
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /**
     * 文件的讀取,只需要讀取一次即可拿到這些值。使用靜態代碼塊
     */
    static {
        // 讀取資源文件,獲取值

        try {
            // 1. Properties 集合類
            Properties pro = new Properties();
            // 2. 加載文件
            // 獲取src路徑下的文件的方式  ——--> ClassLoader 類加載器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties");
            String path = resource.getPath();
            System.out.println(path);
            pro.load(new FileReader(path));
            // 3. 獲取屬性賦值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");

            Class.forName(driver);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 獲取連接
     * 使用配置文件
     * @return 連接對象
     */
    public static Connection getConnection() throws SQLException {
        //DriverManager.getConnection("jdbc:mysql:///db3?serverTimezone=UTC", "root", "mima");
        return DriverManager.getConnection(url, user, password);
    }

    /**
     * 釋放資源
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt, Connection conn){
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

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

配置文件

  • jdbc.properties
url=jdbc:mysql:///db3?serverTimezone=UTC
user=root
password=mima
driver=com.mysql.cj.jdbc.Driver

測試類(使用)

  • JdbcDemo4.java
// 導入JDBCUtils工具類
import ybs.utils.JDBCUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class JdbcDemo4 {
    public List<Account> findAll(){
        Connection conn = null;
        Statement statement = null;
        ResultSet rs = null;
        List<Account> list = null;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select * from account";
            statement = conn.createStatement();
            rs = statement.executeQuery(sql);
            Account account = null;
            list = new ArrayList<Account>();
            while (rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int balance = rs.getInt("balance");
                account = new Account();
                account.setId(id);
                account.setName(name);
                account.setBalance(balance);
                list.add(account);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, statement, conn);
        }
        return list;
    }

    public static void main(String[] args) {
        List<Account> list = new JdbcDemo4().findAll();
        System.out.println(list);
        System.out.println(list.size());
    }
}

將數據庫表映射到類

  • Account .java
package ybs.jdbc;

public class Account {
    private int id;
    private String name;
    private int balance;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", balance=" + balance +
                '}';
    }
}

使用JDBCUtils工具類進行登錄聯繫

需求:
1、通過鍵盤錄入用戶名和密碼
2、判斷用戶名是否登錄成功

jdbc登錄案例
  • 創建數據庫
create table user(
    id int primary key auto_increment,
    username varchar(20),
    password varchar(20)
);

insert into user values(null,'zhangsan','123');
insert into user values(null,'lisi','456');
insert into user values(null,'paulson','789');
package ybs.jdbc;

import ybs.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 * 需求:通過鍵盤錄入用戶名和密碼,判斷用戶名是否登錄成功
 */
public class JdbcDemoLogin {

    public static void main(String[] args) {
        // 1. 鍵盤錄入
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入用戶名:");
        String username = sc.nextLine();
        System.out.println("請輸入密碼:");
        String password = sc.nextLine();

        // 2. 調用方法
        boolean flag = new JdbcDemoLogin().login(username, password);
        if(flag)
            System.out.println("登錄成功");
        else
            System.out.println("用戶名或密碼錯誤");
        // 3. 判斷結果
    }


    public boolean login(String username, String password){
        if(username == null || password == null){
            return false;
        }
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select * from user where username = '"+username+"' and password = '" + password +"'";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            return rs.next();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, conn);
        }
        return false;
    }
}

但是此登錄方法有被SQL注入的風險,我們不能直接用字符串去拼接SQL語句,使用sun公司提供的PreparedStatement 方法來執行SQL

public boolean login2(String username, String password){
        if(username == null || password == null){
            return false;
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select * from user where username = ? and password = ?";
            // 執行查詢,不需要傳參
            pstmt = conn.prepareStatement(sql);
            // 給?賦值
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            rs = pstmt.executeQuery();
            return rs.next();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, pstmt, conn);
        }
        return false;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章