32-jdbc工具类

我们这里发现代码重复度较高 

## 抽取JDBC工具类 : JDBCUtils
    * 目的:简化书写
    * 分析:
        1. 注册驱动也抽取
        2. 抽取一个方法获取连接对象

// return DriverManager.getConnection("jdbc:mysql:///db3","root","root");或者定义方法来传参数  如果这样写的话通用性不好且代码比较复杂 

            * 需求:不想传递参数(麻烦),还得保证工具类的通用性。
            * 解决:配置文件
                jdbc.properties
                    url=
                    user=
                    password=
        3. 抽取一个方法释放资源

jdbcutils: jdbc工具类

package cn.itcast.utils;

import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
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;

    //这里为什么是静态的成员变量呢 因为只有静态的成员变量和成员方法才能被静态代码段所访问
    /*
    文件的读取,只需要读取一次即可拿到这些值"jdbc:mysql:///db3","root","root" 使用静态代码块
     */
    static {//静态代码块
        try {
            //读取资源文件 获取值  获取的值给getConnection()方法用
            //1.创建Properties集合类
            Properties pro = new Properties();
            //2.加载文件
            //pro.load(new FileReader("src/jdbc.properties"));
            //这里之前报错 解决方法一上面地址写绝对地址
            // 方法二是采用获取src路径下的文件的方式--》ClassLoader类加载器
            ClassLoader classLoader = JdbcUtils.class.getClassLoader(); //classloader类加载器
            URL res = classLoader.getResource("jdbc.properties"); //返回的Url是一个统一资源定位符 可以定位一个文件的绝对路径
            String path = res.getPath(); //使用getPath();方法获取到绝对路径  可以sout看一下路径 得到的就是绝对路径
            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();
        }
    }

    //获取连接的方法
    public static Connection getConnection() throws SQLException {
        //成员方法 返回值是一个Connection类型的数据
        //获取连接的方法  返回的是连接对象
        // 工具类有一个特点所有的方法都是静态的方法方便来调用 所以这里做一个静态方法加static

        return DriverManager.getConnection("url,user,password");

    }


    //释放资源的方法

    /**
     * 定义释放资源的方法
     * 使用增删改要释放 connection和statement 对象
     * 使用查询时候还要释放一个 ResultSet对象
     * 所以这里写两个动作 使用重载的机制
     */
    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();
            }
        }
    }

    /**
     * 重载close方法
     */
    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

\32-jdbc工具类_第1张图片

 测试类

package cn.itcast.jdbc;

import cn.itcast.domain.Emp;
import cn.itcast.utils.JdbcUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/*
需求:演示jdbcutils工具类
 */
public class JdbcDemo09 {
    public static void main(String[] args) {
        List list = new JdbcDemo09().findAll02();
        System.out.println(list);
    }
    /*
    查询所有Emp对象
     */
    public List findAll02() { //这里是定义了一个方法
        //1.jdbc的查询步骤
        //1.注册驱动
        Connection conn = null;  //抽取出来下面直接引用
        ResultSet rs = null;
        Statement stmt = null;
        List list=null;
        try {
            /*
            Class.forName("com.mysql.jdbc.Driver");

            //3.获取连接
            conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");*/
           conn= JdbcUtils.getConnection();  //jdbc工具类一句话 而且改内容的话直接在配置文件里面改
            //sql语句
            String sql = "select*from emp";
            stmt = conn.createStatement();
            //执行sql 用查询的方法.executeQuery(sql);
            rs = stmt.executeQuery(sql);

            //遍历结果集,封装对象,装载集合
            Emp emp = null; //这里是创建emp引用 后面可以直接复用
             list = new ArrayList<>();

            while (rs.next()) {
                //获取数据
                int id = rs.getInt("id");
                String ename = rs.getString("ename");
                int job_id = rs.getInt("job_id");
                int mgr = rs.getInt("mgr");
                Date joindate = rs.getDate("joindate");
                double salary = rs.getDouble("salary");
                double bonus = rs.getDouble("bonus");
                int dept_id = rs.getInt("dept_id");
                //创建emp对象
                emp = new Emp(); //注意这里不是Emp emp = new Emp(); 这里是一种复用

                emp.setId(id);  //这里是Emp类中 geter seter 方法在起作用
                emp.setEname(ename);
                emp.setJob_id(job_id);
                emp.setMgr(mgr);
                emp.setJoindate(joindate);
                emp.setSalary(salary);
                emp.setBouns(bonus);
                emp.setDept_id(dept_id); //这都是类中的set方法加数据

                //装载集合
                list.add(emp);  //集合中装了一个emp类
            }

        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    /*finally{
            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();
                }
            }
        }*/
        JdbcUtils.close(rs,stmt,conn);  //使用jdbc工具类中的方法

        return list ;
    }
}

你可能感兴趣的:(JavaWeb,java,mysql,数据库)