Java学习笔记48(DBUtils工具类一)

上一篇的例子可以明显看出,在增删改查的时候,很多的代码都是重复的,

那么,是否可以将增删改查封装成一个类,方便使用者

package demo;

/*
 *  实现JDBC的工具类
 *  定义方法,直接返回数据库的连接对象
 *
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
    private JDBCUtils() {
    }

    private static Connection con;

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mybase";
            String username = "root";
            String password = "xuyiqing";
            con = DriverManager.getConnection(url, username, password);
        } catch (Exception ex) {
            throw new RuntimeException(ex + "数据库连接失败");
        }
    }

    /*
     * 定义静态方法,返回数据库的连接对象
     */
    public static Connection getConnection() {
        return con;
    }

    // 关闭方法
    public static void close(Connection con, Statement stat) {

        if (stat != null) {
            try {
                stat.close();
            } catch (SQLException ex) {
            }
        }

        if (con != null) {
            try {
                con.close();
            } catch (SQLException ex) {
            }
        }

    }

    // 重载
    public static void close(Connection con, Statement stat, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
            }
        }

        if (stat != null) {
            try {
                stat.close();
            } catch (SQLException ex) {
            }
        }

        if (con != null) {
            try {
                con.close();
            } catch (SQLException ex) {
            }
        }

    }
}

测试类:

package demo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class TestJDBCUtils {
    public static void main(String[] args) throws Exception {
        Connection con = JDBCUtils.getConnection();
        PreparedStatement pst = con.prepareStatement("SELECT sname FROM sort");
        ResultSet rs = pst.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString("sname"));
        }
        JDBCUtils.close(con, pst, rs);
    }
}

可以将表中的数据储存到对象中:

package demo;

public class Sort {
    private int sid;
    private String sname;
    private double sprice;
    private String sdesc;

    public Sort(int sid, String sname, double sprice, String sdesc) {
        this.sid = sid;
        this.sname = sname;
        this.sprice = sprice;
        this.sdesc = sdesc;
    }

    public Sort() {
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public double getSprice() {
        return sprice;
    }

    public void setSprice(double sprice) {
        this.sprice = sprice;
    }

    public String getSdesc() {
        return sdesc;
    }

    public void setSdesc(String sdesc) {
        this.sdesc = sdesc;
    }

    @Override
    public String toString() {
        return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";
    }

}
package demo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/*
 *  JDBC读取数据表sort,每行数据封装到Sort类的对象中
 *  很多个Sort类对象,存储到List集合中
 */
public class JDBCDemo {
    public static void main(String[] args) throws Exception{
        //使用JDBC工具类,直接获取数据库连接对象
        Connection con = JDBCUtils.getConnection();
        //连接获取数据库SQL语句执行者对象
        PreparedStatement pst = con.prepareStatement("SELECT * FROM sort");
        //调用查询方法,获取结果集
        ResultSet rs = pst.executeQuery();
        //创建集合对象
        List<Sort> list = new ArrayList<Sort>();
        while(rs.next()){
            //获取到每个列数据,封装到Sort对象中
            Sort s = new Sort(rs.getInt("sid"),rs.getString("sname"),rs.getDouble("sprice"),rs.getString("sdesc"));
            //封装的Sort对象,存储到集合中
            list.add(s);
        }
        JDBCUtils.close(con, pst, rs);
        //遍历List集合
        for(Sort s : list){
            System.out.println(s);
        }
    }
}

这里有一个问题,我们自定义的工具类中的数据是不能修改的,那么如果要改变驱动、用户名、或是连接地址,很不方便

所以,可以把参数放在配置文件中,修改的时候只要改变配置文件即可,不需要修改源码,有利于后期维护

配置文件通常放在scr文件下

这里注意,在src目录下创建文件的时候在bin目录下也会自动复制这个文件

创建文件database.properties,写入键值对

diverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybase
username=root
password=xuyiqing

使用IO流加载配置文件:

package demo;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesDemo {
    public static void main(String[] args) throws Exception {
        //以前的方法
        //FileInputStream fis1 = new FileInputStream("database.properties");
        //这里介绍新方法:类的加载器,从bin目录下加载
        InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");
        Properties pro = new Properties();
        pro.load(in);
        System.out.println(pro);
    }
}

输出:{password=xuyiqing, url=jdbc:mysql://localhost:3306/mybase, diverClass=com.mysql.jdbc.Driver, username=root}

成功加载

于是想到是否可以通过配置文件连接数据库?

package demo;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
    private JDBCUtils() {
    }

    private static Connection con;

    static {
        try {
            InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties");
            Properties pro = new Properties();
            pro.load(in);
            String diverClass = pro.getProperty("driverClass");
            String url = pro.getProperty("url");
            String username = pro.getProperty("username");
            String password = pro.getProperty("password");
            Class.forName(diverClass);
            con = DriverManager.getConnection(url, username, password);
        } catch (Exception ex) {
            throw new RuntimeException(ex + "数据库连接失败");
        }
    }

    public static Connection getConnection() {
        return con;
    }

    public static void close(Connection con, Statement stat) {

        if (stat != null) {
            try {
                stat.close();
            } catch (SQLException ex) {
            }
        }

        if (con != null) {
            try {
                con.close();
            } catch (SQLException ex) {
            }
        }

    }

    public static void close(Connection con, Statement stat, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
            }
        }

        if (stat != null) {
            try {
                stat.close();
            } catch (SQLException ex) {
            }
        }

        if (con != null) {
            try {
                con.close();
            } catch (SQLException ex) {
            }
        }

    }
}

原文地址:https://www.cnblogs.com/xuyiqing/p/8323990.html

时间: 2024-08-01 08:45:53

Java学习笔记48(DBUtils工具类一)的相关文章

java学习笔记之DBUtils工具类

DBUtils工具类 一.介绍 DBUtils是Apache组织开源的数据库工具类. 二.使用步骤 ①.创建QueryRunner对象 ②.调用update()方法或者query()方法执行sql语句 三.构造方法及静态方法 QueryRunner类 1.构造方法 ①.无参构造 QueryRunner qr =new  QueryRunner(); 使用无参构造的时候,调用update方法和query方法时就需要使用带Connection 类型参数的重载形式 ②.有参构造 QueryRunner

Java学习笔记七——数组工具类Arrays

数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组.若将里面的方法用熟的话,那开发效率会大大提高.下面介绍其中的方法. List<T> asList(T... a) 作用:将指定数组或数组元素,转换成固定大小的List. 用法: String[] strArr = { "aaa", "bbb", "vvv" }; //用法1:参数是数组引用 List<String> li

java学习笔记07--日期操作类

java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. [java] view plaincopy public class T { public static void main(String[] args) { Date date  = new Date(); System.out.println("当前日期:"+date); //当前日期:Thu May 16 23:00:57 CST 

Java学习笔记_23_List接口实现类

23.List接口实现类: List接口继承了Collection接口,它是一个允许存在重复项的有序集合. 1>实现类ArrayList: ArrayList类支持可随需要而增长的动态数组.数组列表以一个原大小被创建,当超过了它的大小, 类集自动增大,当对象被删除后,数组就可以缩小. 优点:ArrayList类对于使用索引取出元素用较高的效率,他可以用索引快速定位对象. 缺点:ArrayList类对于元素的删除或插入速度较慢. 构造方法: · ArrayList(): 构造一个初始容量为10的空

java学习-加载.properties工具类

javaWeb项目,要加载xxx.properties或其它如.txt, .md后缀的文本文件 文本内容有两种格式 key:value或者key=value 诸如Spring框架,Jfinal框架,都是使用java.util.Properties类来加载文本配置文件 Poperties类是按行读取key和value,所以我们写配置文件时,只能一行一个key/value键值对 这些配置文件一般会在编译时打包到WEB-INF/classes/文件夹下 我们要加载时就要通过使用下面方法获取InputS

疯狂java学习笔记之面向对象-定义类、方法、构造器

Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. java程序中,类是最小的程序单位 - 所有的java程序都必须从定义类开始 定义类的语法格式: [修饰符]  class  类名{ //0 ~ N 个 Field 定义 //0 ~ N 个 方法定义 //0 ~ N个 构造器定义 } 一个类中最多只能出现五种成分:Field.方法.构造器 一个类最常见

Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)

1.获取指定字符串中大小写和数字的个数: package demo; public class StringTest { public static void main(String[] args) { getCount("IamHandsome666"); } public static void getCount(String str) { int upper = 0; int lower = 0; int digit = 0; for (int i = 0; i < str

java学习笔记——大数据操作类

java.math包中提供了两个大数字操作类:BigInteger(大整数操作类) BigDecimal(大小数操作类). 大整数操作类:BigInteger BigInteger类构造方法:public BigInteger(String val) 常用方法:public BigInteger add(BigInteger val) public BigInteger subtract(BigInteger val) public BigInteger multiply(BigInteger

Java学习笔记五:复用类

当我们在使用第三方或者其他人已经写好的类时,通常有两种方法: (1).组合:在新的类中产生现有类的引用. (2).继承:按照现有类的类型创建新类.   1.组合 简单理解就是新类中,创建一个变量,变量的引用为现有类. 我们在很多场景下都是用到组合,如: public class Lesson_04_Extend { private Extend1 extend1; // 组合方式,创建成员变量(UML 组合关系) public void print(Extend1 extend2) // (UM