抽取JDBC工具类(JdbcUtils)

  • 目的:简化书写
    • 分析:
      1. 注册驱动也抽取
      2. 抽取一个方法获取连接对象
        • 需求:不想传递参数(麻烦),还得保证工具类的通用性。
        • 解决:配置文件
          jdbc.properties
          url=
          user=
          password=

* 练习:

	* 需求:
		1. 通过键盘录入用户名和密码
		2. 判断用户是否登录成功
			* select * from user where username = "" and password = "";
			* 如果这个sql有查询结果,则成功,反之,则失败

	* 首先在mysql中:
		1. 创建数据库(bd)表 user
			CREATE TABLE USER(
				id INT PRIMARY KEY AUTO_INCREMENT,
				username VARCHAR(32),
				PASSWORD VARCHAR(32)
			
			);

			INSERT INTO USER VALUES(NULL,'zhangsan','123');
			INSERT INTO USER VALUES(NULL,'lisi','234');

       2.代码实现

(1)在src同级目录下创建jdbc.properties文件
内容为:url=jdbc:mysql:///db(数据库)
user=root
password=root
driver=com.mysql.jdbc.Driver

(2)在utils中创建JdbcUtils工具类
package cn.itcast.util;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
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();
      //获取src路径下的文件方式—》ClassLoader 类加载器
      ClassLoader classLoader = JdbcUtils.class.getClassLoader();
      URL res = classLoader.getResource(“jdbc.properties”);
      String path = res.getPath();
      //2.加载文件
      pro.load(new FileReader(path));
      //3.获取数据,赋值
      url = pro.getProperty(“url”);
      user = pro.getProperty(“user”);
      password = pro.getProperty(“password”);
      driver = pro.getProperty(“driver”);
      //4.注册驱动
      Class.forName(driver);
      } catch (IOException e) {
      e.printStackTrace();
      }catch (ClassNotFoundException e) {
      e.printStackTrace();
      }
      }

    /**

    • 获取连接
    • @return 连接对象
      */
      public static Connection getConnection() throws SQLException {
      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();
      }
      }
      }

    /**

    • 释放资源(重载)

    • @param stmt

    • @param conn

    • @param rs
      */
      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();
      }
      }
      }

}

(3)在所在项目的目录下创建JdbcDemo来使用JdbcUtils工具类
package cn.itcast.jdbc;

import cn.itcast.util.JdbcUtils;
import java.sql.*;
import java.util.Scanner;

public class JdbcDemo {
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 JdbcDemo9().login2(username, password);
//3.判断结果,输出不同语句
if (flag){
System.out.println(“登陆成功!”);
}else {
System.out.println(“用户名或者密码错误!”);
}
}

/* //*
* 登陆方法使用Statement实现(但是容易发生SQL注入)
不建议使用。
/
/

public boolean login(String username, String password){
if (username == null || password == null){
return false;
}
//连接数据库判断是否登录成功
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//1.获取连接
try {
conn = JdbcUtils.getConnection();
//2.定义sql
String sql = “SELECT * FROM user WHERE username = '”+username+"’ AND password = ‘"+password+"’";
//3.获取执行sql的对象
stmt = conn.createStatement();
//4.执行sql
rs = stmt.executeQuery(sql);
//5.判断
return rs.next();//如果有下一行,返回true
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.close(rs,stmt,conn);
}
return false;
}
/

/**
 * 登陆方法使用PreparedStatement实现
 *推荐使用
 */
public boolean login2(String username, String password){
    if (username == null || password == null){
        return false;
    }
    //连接数据库判断是否登录成功
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    //1.获取连接
    try {
        conn = JdbcUtils.getConnection();
        //2.定义sql
        String sql = "SELECT * FROM USER WHERE username = ? AND password =?";
        //3.获取执行sql的对象
        pstmt = conn.prepareStatement(sql);
        //给?赋值
        pstmt.setString(1,username);
        pstmt.setString(2,password);
        //4.执行sql
        rs = pstmt.executeQuery();
        //5.判断
        return rs.next();//如果有下一行,返回true
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        JdbcUtils.close(rs,pstmt,conn);
    }
    return false;
}

}

注意:运行过程共若出现 db.properties (系统找不到指定的路径。)
解决方法:查看子的IEDA所在的项目目录下是【否包含空格】的文件夹,并修改一下就可以了。
备注:此代码及部分参考黑马程序员培训教程。

发布了18 篇原创文章 · 获赞 1 · 访问量 565

猜你喜欢

转载自blog.csdn.net/m0_37694106/article/details/89424038