抽取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所在的项目目录下是【否包含空格】的文件夹,并修改一下就可以了。
备注:此代码及部分参考黑马程序员培训教程。

发布了39 篇原创文章 · 获赞 3 · 访问量 1561
展开阅读全文

不知道为啥会报:线程“main”java.lang中的异常。无法初始化类JdbcUtil.JDBCUtils的错误?

04-22

``` package Jdbc; import JdbcUtil.JDBCUtils; import domain.user; import java.sql.*; import java.util.ArrayList; import java.util.List; public class JdbcUtilDemo1 { public static void main(String[] args) { List<user> list = new JdbcUtilDemo1().findAll2(); System.out.println(list); System.out.println(list.size()); } /* 演示JDBC工具类 */ public List<user> findAll2() { Connection connection = null; Statement statement = null; ResultSet resultSet = null; List<user> list = null; try {/*//1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/eesy_mybatis?useSSL=false&serverTimezone=CTT","root","1799510625hgj");*/ connection = JDBCUtils.getConnection(); //3.定义sql String sql = "select * from user"; //4.获取执行sql的对象 statement = connection.createStatement(); //5.执行sql resultSet = statement.executeQuery(sql); //6.遍历结果集,封装对象,装载集合 user user = null; list = new ArrayList<user>(); while (resultSet.next()) { int id = resultSet.getInt("id"); String username = resultSet.getString("username"); Date birthday = resultSet.getDate("birthday"); String sex = resultSet.getString("sex"); String address = resultSet.getString("address"); //创建user对象,并赋值 user = new user(); user.setId(id); user.setUsername(username); user.setBirthday(birthday); user.setSex(sex); user.setAddress(address); //装载集合 list.add(user); } }catch (SQLException e){ e.printStackTrace(); }finally { //释放资源 /* if(resultSet != null){ resultSet.close(); } if(statement != null){ statement.close(); } if(connection != null){ connection.close(); }*/ JDBCUtils.close(resultSet, statement, connection); } return list; } } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览