★ JDBC的核心就是:
注册驱动 → 获取连接 → 获取sql执行对象 → 执行sql → 释放资源
java">-------------------------------------- jdbc.properties 配置文件 ------------------------------------------------
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/myDB?serverTimezone=GMT%2B8
username=root
password=******
initialSize=5
maxActive=10
maxWait=3000
java">--------------------------------------- JDBCUtils.java 工具类-------------------------------------------------
/**
* JDBCUtils工具类
*
* 使用工具类时,先自动执行静态代码块,从配置文件读取信息,并【注册驱动】;
* 并且封装了两个静态方法:【获取连接】【释放资源(有重载)】
*/
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* 静态代码块———读取配置文件中的值,赋给上面的成员变量
*/
static {
try{
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL absoluteURL = classLoader.getResource("jdbc.properties");
String path = absoluteURL.getPath();
pro.load(new FileReader(path)); // 这里的path必须使用上面获取的绝对路径,相对路径会找不到文件
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{
return DriverManager.getConnection(url, user, password);
}
/**
* 释放资源
* @param statement
* @param conn
*/
public static void close(Statement statement, Connection conn){
if(statement != null){
try{
statement.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
/**
* 释放资源
* @param result
* @param statement
* @param conn
*/
public static void close(ResultSet result, Statement statement, Connection conn){
if(result != null){
try{
result.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(statement != null){
try{
statement.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
java">--------------------------------------------- Login.java -------------------------------------------------
public class Login {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入账户 : ");
String account = scanner.nextLine();
System.out.print("请输入密码 : ");
String password = scanner.nextLine();
if(new Login().login(account, password)){
System.out.println("登录成功!");
}else{
System.out.println("登录失败!");
}
}
public boolean login(String account, String password) {
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet result = null;
try {
conn = JDBCUtils.getConnection();
String sql = "select * from accountTable where account = ? and password = ?";
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, account);
preparedStatement.setString(2, password);
result = preparedStatement.executeQuery();
return result.next();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(result, preparedStatement, conn);
}
return false;
}
}
java">--------------------------------------------- 运行结果 -------------------------------------------------
>>> 请输入账户: Loli
>>> 请输入密码: 123456
>>> ...
>>> 登录成功!
java">
-------------------------------- JDBCUtils.java 工具类(内部为连接池版本) ------------------------------------
/**
* JDBCUtils工具类
*
* 内部通过连接池实现。
* 使用工具类时,先自动执行静态代码块,从配置文件读取信息,并【注册驱动】;
* 并且封装了两个静态方法:【获取连接】【释放资源(有重载)】
*/
public class JDBCUtils {
private static DataSource pool = null; // 只需要一个连接池成员变量;连接池自动帮我们完成注册驱动
/**
* 静态代码块 ———— 创建连接池
*/
static {
try{
Properties pro = new Properties();
InputStream stream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(stream);
pool = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接池
* (一般不用,直接用下面的getConnection就可以的)
* @return
*/
public static DataSource getDataSourse(){
return pool;
}
/**
* 获取连接
* @return 返回连接对象
*/
public static Connection getConnection() throws SQLException {
return pool.getConnection();
}
/**
* 释放资源
* @param statement
* @param conn
*/
public static void close(Statement statement, Connection conn){
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet result, Statement statement, Connection conn){
if(result != null){
try {
result.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
-------------------------------- 只是内部实现不同。从外部看来,使用完全一致。 -----------------------------------