JDBC基础之(三)封装JDBC通用工具类
一、为何要封装JDBC通用工具类
任何一个Java应用程序使用JDBC访问数据库时,都会按步骤来操作数据库:
1、加载JDBC驱动程序
2、建立Java程序与数据库之间的连接
3、创建执行SQL命令的语句对象,并将SQL命令发送到数据库执行
4、接收数据库执行SQL命令后返回的结果,并处理执行结果
5、关闭Java程序与数据库之间的连接
其间,每次执行SQL语句,都会反复“加载驱动、创建连接、创建语句对象、关闭连接、释放资源”,并写一些重复的代码,增加了代码的冗余程度,降低了代码的可读性和易维护性。若能将通用的代码封装在一个工具类中,将访问数据库的流程抽象出来,仅仅在工具类中提供几个实用的静态方法来操作数据库,对外部应用程序屏蔽了连接数据库、创建语句对象、关闭连接等操作,这样,Java程序每次需要访问数据库时,只需要调用工具类中的方法即可,而无需反复写一些繁琐的代码,可以提高代码的可复用性,降低冗余度,方便应用程序的调用,提高程序的开发效率。
二、封装JDBC工具类的前期准备
1、从官网下载MySQL的JDBC驱动程序
目前常用的MySQL数据库的JDBC驱动程序有5.*版本和8.*两个版本,二者在使用时,配置上略有不同,可以选择其中任意一个版本使用,不能两个版本同时使用。
版本5下载地址:
版本8下载地址:
下载zip驱动程序包,下载后解压缩,并找到:
mysql-connector-java-*.jar文件包,即:
mysql-connector-java-5.1.48.jar
mysql-connector-java-8.0.19.jar
2、将JDBC驱动程序导入Java Project中
使用JDBC访问数据库之前,需要将JDBC驱动程序导入Java工程中,将驱动程序jar包放在Project的lib文件夹下,并加载到Project中。
3、为JDBC准备数据库和数据表
在MySQL数据库中创建一个数据库20200320javatest,并在其中新建一张数据表goods,数据表结构如下:
4、为JDBC准备存储过程
在数据库20200320javatest中创建存储过程addGoods和queryGoods。
addGoods向数据表goods中插入一条商品数据:
DELIMITER //
CREATE PROCEDURE addGoods
(IN igoodsID VARCHAR(8), IN igname VARCHAR(128), IN ibrand VARCHAR(4),
IN icategory VARCHAR(4), IN iprice DOUBLE, OUT iCount INT)
BEGIN
INSERT INTO goods(goodsID, gname, brand, category, price)
VALUES(igoodsID, igname, ibrand, icategory, iprice);
SELECT COUNT(1) INTO iCount FROM goods g WHERE g.goodsID = igoodsID;
END//
DELIMITER ;
queryGoods根据商品名称模糊查询商品数据:
DELIMITER //
CREATE PROCEDURE queryGoods(IN igname VARCHAR(128))
BEGIN
SELECT g.* FROM goods g WHERE g.gname LIKE igname;
END//
DELIMITER ;
5、为JDBC创建数据库连接参数属性文件
创建包含数据库连接参数的属性文件jdbc.properties,其内容如下:
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/20200320javatest?serverTimezone=UTC
user = root
password = root
6、为数据表创建对应的实体Bean
实体Bean是一个可重用的类,常常用于表示永久性数据,是可以存储在持久存储介质上的持久对象,实体Bean的状态保存在数据库中。
一般情况下,一个实体Bean对应着数据库中的一张表,实体Bean中的属性对应数据表中的字段,并定义为private访问权限;每一个属性通过一对getter()和setter()方法对外提供访问;实体Bean中需要提供无参构造器,也可以提供带参构造器;一个实体Bean的实例对应着数据表中的一条记录。例如:实体Bean Goods对应数据库中的数据表Goods,一个Goods对象对应着Goods表中的一条记录。
在Java Project中,新建一个Goods类,代码如下:
publicclassGoods {
privateStringgoodsID;
privateStringgname;
privateStringbrand;
privateStringcategory;
privatedoubleprice;
privateStringpicture;
privateStringfeature;
privateStringnewIdt;
privateTimestampshelftDate;
publicGoods() {
super();
}
publicGoods(StringgoodsID, Stringgname, Stringbrand, Stringcategory,doubleprice, Stringpicture,Stringfeature, StringnewIdt, TimestampshelftDate) {
super();
this.goodsID=goodsID;
this.gname=gname;
this.brand=brand;
this.category=category;
this.price=price;
this.picture=picture;
this.feature=feature;
this.newIdt=newIdt;
this.shelftDate=shelftDate;
}
publicString getGoodsID() {
returngoodsID;
}
publicvoidsetGoodsID(StringgoodsID) {
this.goodsID=goodsID;
}
publicString getGname() {
returngname;
}
publicvoidsetGname(Stringgname) {
this.gname=gname;
}
publicString getBrand() {
returnbrand;
}
publicvoidsetBrand(Stringbrand) {
this.brand=brand;
}
publicString getCategory() {
returncategory;
}
publicvoidsetCategory(Stringcategory) {
this.category=category;
}
publicdoublegetPrice() {
returnprice;
}
publicvoidsetPrice(doubleprice) {
this.price=price;
}
publicString getPicture() {
returnpicture;
}
publicvoidsetPicture(Stringpicture) {
this.picture=picture;
}
publicString getFeature() {
returnfeature;
}
publicvoidsetFeature(Stringfeature) {
this.feature=feature;
}
publicString getNewIdt() {
returnnewIdt;
}
publicvoidsetNewIdt(StringnewIdt) {
this.newIdt=newIdt;
}
publicTimestamp getShelftDate() {
returnshelftDate;
}
publicvoidsetShelftDate(TimestampshelftDate) {
this.shelftDate=shelftDate;
}
}
三、封装JDBC工具类
public class JDBCUtils {
static private String driver;
static private String url;
static private String user;
static private String password;
static {
try {
getDBParams();
} catch (ClassNotFoundException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 获取数据库连接初始参数,加载数据库驱动程序
static private void getDBParams() throws IOException, ClassNotFoundException {
Properties prop = new Properties();
prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("config/jdbc.properties"));
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
Driver = prop.getProperty("driver");
Class.forName(driver);
}
// 获取连接
static public Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}