从上一文中:写一段“查询结果返回java集合对象”查询的代码很长,有没有能简化查询的方法呢?
就是创建一个工具类,把一些固定的代码转化为方法,如注册驱动,连接数据库,关闭资源等
这样就简化很多重复代码。
一、创建数据库信息的配置文件。
为了方便阅读,提前创建该配置文件。文件放在src目录下,下面的信息分别对应你的数据库名,用户名,密码,驱动(其他的名称可能不一样)。
url:=jdbc:mysql:///test
user=root
password=newpassword
driver=com.mysql.cj.jdbc.Driver
二、创建工具类
package cn.JdbcUtil; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /* *JDBC工具类 */ public class JDBCUtils { /* * 获取连接 * @return 连接对象 */ // 创建公共类对象,用于传参 public static String url; public static String user; public static String password; public static String driver; static { try { //处理pro.load(new FileReader()的异常 // 读取文件,获取值 //1.创建Properties集合类 Properties pro = new Properties(); //2.加载文件 //pro.load(new FileReader("src/jdbc.properties")); /* 加载文件的方法了,推荐换成下面方法,上面先理解,可以先跳过阅读,最后运行不出来在换,运行出来也换 这个路径可能会报错,可以使用 ClassLoadder 类加载器获取对象,绝对路径也行,但是比较麻烦不推荐 // 获取ClassLoader的对象 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); //输入文件名返回一个文件对象 URL报红则ALT + 回车处理一下,选择第一个就行 URL res = classLoader.getResource("src/jdbc.properties"); // 获取字符串路径 String path = res.getPath(); System.out.println(path); pro.load(new FileReader(path)); */ //3.赋值 url = pro.getProperty("url"); user = pro.getProperty("user"); password = pro.getProperty("password"); driver = pro.getProperty("driver"); //4.注册驱动 try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } public static Connection getConnection() { return null ; } /* * 释放资源 */ public static void Close(Statement stat, Connection conn) { if (stat != null) { try { stat.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } public static void Close(ResultSet rs,Statement stat, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (stat != null) { try { stat.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
三、调用工具类,以上一个代码为例。
package cn.JdbcUtil; import cn.Emp; import cn.JdbcEmp; import java.sql.*; import java.util.ArrayList; import java.util.List; public class jdbcDemo4_2 { public static void main(String[] args) { // 创建对象,调用 fineAll方法。并返回 list 集合 List<Emp> list = new JdbcEmp().fineAll() ; System.out.println(list); System.out.println(list.size()); } // 查询所有 Emp对象 // 创建集合,结果返回 Emp 类 public List<Emp> fineAll2() { Connection con = null ; Statement stat = null ; ResultSet rs = null ; List<Emp> list = null ; try { // // 1.注册驱动 // Class.forName("com.mysql.cj.jdbc.Driver"); // 2.定义sql脚本 String sql = "select * from emp " ; con = JDBCUtils.getConnection(); // // 3.获取Connection连接 Connection 在try外面定义后进行赋值,定义连接 // con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","newpassword") ; // 4.获取执行sql对象 Statement Statement stat 在try外面进行定义后赋值 //stat = con.createStatement() ; // 5.执行sql语句 rs = stat.executeQuery(sql) ; // 6.结果处理 // 封装,创建对象 Emp emp = null ; list = new ArrayList<Emp>() ; while(rs.next()) { int id = rs.getInt("id") ; String name = rs.getString("name") ; double salary = rs.getDouble("salary") ; //创建emp 对象,并赋值 emp = new Emp() ; emp.setId(id); emp.setName(name); emp.setSalary(salary); // 装载集合 list.add(emp) ; } } catch (Exception e ) { e.printStackTrace(); } finally { // if(rs != null ) { // try { // rs.close(); // } catch (Exception e) { // e.printStackTrace(); // } // } // if(stat != null ) { // try { // stat.close(); // } catch (Exception e) { // e.printStackTrace(); // } // } // if(con != null ) { // try { // con.close(); // } catch (Exception e) { // e.printStackTrace(); // } // } JDBCUtils.Close(rs,stat,con); } return list ; } }
可以看出可以省了很多代码的书写,大概率会报pro.load文件的错,可以返回看这一段的注释,修改。,