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

## 抽取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

\

 测试类
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<Emp> list = new
JdbcDemo09().findAll02(); System.out.println(list); } /* 查询所有Emp对象 */ public
List<Emp> findAll02() { //这里是定义了一个方法 //1.jdbc的查询步骤 //1.注册驱动 Connection conn =
null; //抽取出来下面直接引用 ResultSet rs = null; Statement stmt = null; List<Emp>
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 ; } }

技术
©2019-2020 Toolsou All rights reserved,
大一上c语言学生管理系统(下)年底了,不要跳槽。字节跳动测试工程师凉经分享教你用Python画一棵圣诞树用C实现圣诞树python 使用turtle 画樱花(python3验证ok)win10系统的计算机C盘在哪,c盘users在哪(win10c盘找不到users)计算机发展史上最著名的两位鼻祖HDFS主要组件(数据块、NameNode、DataNode、secondaryNameNode)python 指定时间运行代码