1.數據庫連接四要素不應該寫死在代碼中,擴展性不高,應該抽取到配置文件中動態讀取:
擴展文件名.properties
DRIVER_CLASS_NAME = com.mysql.jdbc.Driver
URL = jdbc:mysql:///mysql_jdbc
USER = root
PASSWORD = root
2.動態讀取操作,只需要執行一次,所以解析代碼寫在靜態代碼塊
Class.forName(),註冊也只需要執行一次,所以也放在靜態代碼塊
static {
try {
Properties properties = new Properties();
properties.load(new FileInputStream("jdbc.properties"));
DRIVER_CLASS_NAME = properties.getProperty("DRIVER_CLASS_NAME");
URL = properties.getProperty("URL");
USER = properties.getProperty("USER");
PASSWORD = properties.getProperty("PASSWORD");
// System.out.println(DRIVER_CLASS_NAME+"-"+URL+"-"+USER+"-"+PASSWORD);
Class.forName(DRIVER_CLASS_NAME);
} catch (Exception e) {
e.printStackTrace();
}
}
3.爲數據庫的連接專門寫個工具類用於獲取連接和釋放資源,以及公共代碼
/*
工具類封裝步驟:
1.jdbc中每次都要寫註冊獲取連接和資源釋放
2.參數數據,不應該直接寫在代碼中,直接抽取到最上面,便於後期開發維護
3.數據庫連接四要素,不應該寫死在代碼中,擴展性不高,應該抽取到配置文件中動態讀取
4.動態讀取操作,只需要執行一次,所以解析代碼寫在靜態代碼塊
5.class.forName(),註冊也只需要執行一次,所以也放在靜態代碼塊
*/
public class JdbcUtil {
public static String DRIVER_CLASS_NAME ;
public static String URL ;
public static String USER ;
public static String PASSWORD ;
//如果要保證一部分代碼僅僅動態讀取一次,則使用靜態代碼塊
static {
try {
Properties properties = new Properties();
properties.load(new FileInputStream("jdbc.properties"));
DRIVER_CLASS_NAME = properties.getProperty("DRIVER_CLASS_NAME");
URL = properties.getProperty("URL");
USER = properties.getProperty("USER");
PASSWORD = properties.getProperty("PASSWORD");
// System.out.println(DRIVER_CLASS_NAME+"-"+URL+"-"+USER+"-"+PASSWORD);
Class.forName(DRIVER_CLASS_NAME);
} catch (Exception e) {
e.printStackTrace();
}
}
//獲取連接
public static Connection getConnection() {
Connection connection = null;
try {
//ctrl+Alt+C抽取
connection = DriverManager.getConnection(URL, USER,PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
//資源釋放
public static void release(ResultSet resultSet, Statement statement,Connection connection){
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
resultSet = null;//避免內存泄漏
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
statement = null;//避免內存泄漏
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
connection = null;//避免內存泄漏
}
}
}
4.用戶登錄實例
package Login_01;
import java.sql.*;
import java.util.Scanner;
public class LoginDemo {
public static void main(String[] args) throws SQLException {
//提醒用戶輸入用戶名
System.out.println("請輸入用戶名:");
Scanner scanner = new Scanner(System.in);
String username = scanner.nextLine();
System.out.println("請輸入登錄密碼:");
Scanner scanner1 = new Scanner(System.in);
String password = scanner1.nextLine();
//提醒用戶輸入密碼
Connection connection = JdbcUtil.getConnection();
Statement statement = connection.createStatement();
String sql = "SELECT count(*) FROM USER WHERE username = '"+username+"' AND password = '+password+' ;";
ResultSet resultSet = statement.executeQuery(sql);
int count = 0;
while (resultSet.next()) {
count = resultSet.getInt("count(*)");
}
System.out.println(count >0 ? "登錄成功" :" 登錄失敗");
JdbcUtil.release(resultSet,statement,connection);
}
}
簡單測試DemoTest:
import util.JDBCUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcUtilTest {
public static void main(String[] args) throws SQLException {
Connection connection = JDBCUtils.getConnection();
Statement statement = connection.createStatement();
String sql = "Update user set password = '54321'";
int i = statement.executeUpdate(sql);
System.out.println(i);
JDBCUtils.release(null,statement,connection);
}
}