手写工具包简化JDBC部分步骤

tech2022-07-15  179

先来演示一下正常的JDBC所需要的代码:

import cn.itcast.domain.Emp; import cn.itcast.utils.JDBCUtils; import java.sql.*; import java.util.ArrayList; import java.util.List; /** * * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。 */ public class JDBCDemo8 { public static void main(String[] args) { List<Emp> list = new JDBCDemo8().findAll1(); System.out.println(list); System.out.println(list.size()); } /** * 查询所有emp对象 * @return */ public List<Emp> findAll(){ Connection conn = null; Statement stmt = null; ResultSet rs = null; List<Emp> list = null; try { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root"); //3.定义sql String sql = "select * from emp"; //4.获取执行sql的对象 stmt = conn.createStatement(); //5.执行sql rs = stmt.executeQuery(sql); //6.遍历结果集,封装对象,装载集合 Emp emp = null; list = new ArrayList<Emp>(); 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.setId(id); emp.setEname(ename); emp.setJob_id(job_id); emp.setMgr(mgr); emp.setJoindate(joindate); emp.setSalary(salary); emp.setBonus(bonus); emp.setDept_id(dept_id); //装载集合 list.add(emp); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.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(); } } } return list; } /*---------------------------------------------------------------*/ //Emp类 import java.util.Date; /** * 封装Emp表数据的JavaBean */ public class Emp { //工号 private int id; //员工姓名 private String ename; //员工的工作流水线号 private int job_id; //员工的上机领导 private int mgr; //员工的加入时间 private Date joindate; //员工的工资 private double salary; //员工的额外奖金 private double bonus; //员工的部门号 private int dept_id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public int getJob_id() { return job_id; } public void setJob_id(int job_id) { this.job_id = job_id; } public int getMgr() { return mgr; } public void setMgr(int mgr) { this.mgr = mgr; } public Date getJoindate() { return joindate; } public void setJoindate(Date joindate) { this.joindate = joindate; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public int getDept_id() { return dept_id; } public void setDept_id(int dept_id) { this.dept_id = dept_id; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } @Override public String toString() { return "Emp{" + "id=" + id + ", ename='" + ename + '\'' + ", job_id=" + job_id + ", mgr=" + mgr + ", joindate=" + joindate + ", salary=" + salary + ", bonus=" + bonus + ", dept_id=" + dept_id + '}'; } }

经过上面的代码我们可以发现,有一些代码总是出现,写多了就出现了代码冗余;同时,有些代码是固定的,每次都得写,我们想着尝试把这些代码进行封装达到重复利用,同时为了避免以后数据库或表发生改变再去改动密码,我们可以通过配置文件来达到代码的动态性,说起来有些抽象,我们就来演示一下: 首先,先创建一个配置文件jdbc.properties(具体配置见往期文章:点一下跳转) 然后打开该文件写入数据如下: url=jdbc:mysql:///db3 user=root password=root driver=com.mysql.jdbc.Driver 这样做的目的是:每个人的数据库名称、表不同,登录名称和密码不同,不同的人只需打开该文件进行配置就行了,就不要再去更改代码,提高了代码的动态性。 接着就来创建工具类了:

import java.io.FileReader; import java.io.IOException; 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; /** * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块。 * 直接实现了注册驱动的作用。 */ static{ //读取资源配置文件,获取值。 try { //1. 创建Properties集合类。 Properties pro = new Properties(); /* 获取src路径下的文件的方式--->ClassLoader 类加载器, 因为每个人的磁盘不一样,存储文件的路径不一样, 有可能我把这些类存在E盘,而其他人存在c盘, 具体该文件的路径不能写死,写死的话就会有些人运行不成功。 而运用getClassLoader就能直接读取到这个文件存放在本电脑的哪个位置, 直接返回所在路径,非常方便。 */ 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){ close(null,stmt,conn); } /** * 释放资源 * @param stmt * @param conn */ 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(); } } } } /*---------------------------------------------------------------*/ import cn.itcast.domain.Emp; import cn.itcast.utils.JDBCUtils; import java.sql.*; import java.util.ArrayList; import java.util.List; /** * * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。 */ public class JDBCDemo8 { public static void main(String[] args) { List<Emp> list = new JDBCDemo8().findAll2(); System.out.println(list); System.out.println(list.size()); } /** * 演示JDBC工具类 * @return */ public List<Emp> findAll2(){ Connection conn = null; Statement stmt = null; ResultSet rs = null; List<Emp> list = null; try { /* 原本需要两行的代码此时只需要一行,里面已经封装好了 注册驱动和获取连接对象的代码 */ conn = JDBCUtils.getConnection(); //3.定义sql String sql = "select * from emp"; //4.获取执行sql的对象 stmt = conn.createStatement(); //5.执行sql rs = stmt.executeQuery(sql); //6.遍历结果集,封装对象,装载集合 Emp emp = null; list = new ArrayList<Emp>(); 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.setId(id); emp.setEname(ename); emp.setJob_id(job_id); emp.setMgr(mgr); emp.setJoindate(joindate); emp.setSalary(salary); emp.setBonus(bonus); emp.setDept_id(dept_id); //装载集合 list.add(emp); } } catch (SQLException e) { e.printStackTrace(); }finally { //此时的资源关闭非常方便,只需要把想要关闭的资源写在括号里就可以了 JDBCUtils.close(rs,stmt,conn); } return list; } }
最新回复(0)