工具類
- 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;
}