目录
前言
一、JDBCUtils是什么?
二、JDBCUtils由哪些部分组成?
1、常用变量
2、完成初始化操作
3、获取连接
4、非查询方法(增删改等功能)
5、查询方法
6、释放资源
三、总结
前言
程序员的天职是什么?在我看来,最基础的能力就是消灭重复化的劳动,把一切繁杂琐碎的事整合为程序化的任务。
基于此目的,我们把一些常用的变量和方法封装入JDBCUtils类中,即可达到一劳永逸的美好编程体验。
[注] 本文以阿里提供的Druid为例,阅读本文前应对其有基本了解。如果没有就把代码当成例子来看,想要实现必须有Druid.jar和Druid.properties文件,本文不会赘述。
一、JDBCUtils是什么?
直观上来看,JDBC指的是Java Database Connectivity 即Java数据库连接,Utils意为通用工具类,由此可知,这个类将承担为主服务类提供工具的任务。
正如前言中所说的,在访问数据库数据的过程中,有很多代码重复度很高,因此我们把这些重复的代码封装入工具类中,以此来提高程序的观赏性和可读性,还能显著提高我们的编程效率。
二、JDBCUtils由哪些部分组成?
众所周知,JDBC操作数据的流程分为五个步骤。
1.加载驱动
2.获取连接
3.获得执行sql语句的对象
4.处理得到的数据集
5.释放资源
以上五个步骤都有必要编入工具类中,但除此之外,我们还需要把一些常用到的变量设为静态变量放入工具类的首部。
1、常用变量
代码如下:
private static String DriverClass;//加载驱动时的路径
private static String Url;//数据库的路径
private static String Username;//数据库的登录名
private static String Password;//数据据库的登录密码
private static DataSource ds;//数据集
2、完成初始化操作
[注]:可能会有人看不懂下面代码里注释中写的配置文件是什么,这时候你就得再仔细看看前言啦!但没关系,两个选择,了解一下阿里的Druid,或者忽略2,其实不影响你看后文的。
代码如下:
static {
// 加载配置文件中的数据
//想知道有哪些数据可以去看看官方文档哦
InputStream ist = JDBCUtils.class.getClassLoader().getResourceAsStream("/druid.properties");
Properties prop = new Properties();
try {
prop.load(ist);
// 创建连接池,使用配置文件中的参数
ds = DruidDataSourceFactory.createDataSource(prop);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3、获取连接
// 获取数据库连接对象
public static synchronized Connection getConnection() {
if (dataSource == null || dataSource.isClosed())
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
4、非查询方法(增删改等功能)
public static int exeUpdate(String sql, Object… params) { //params意为参数
//注意,Object… params,这是java的新特性,叫做变长数组,不知道的小伙伴可以学习一下
Connection coon = null;
PreparedStatement ps = null;
try {
coon = getConnnection();
ps = coon.prepareStatement(sql); //prepareStatement可有效防止sql注入攻击
} catch (SQLException e) {
e.printStackTrace();
}
if (Objects.nonNull(params)) {
try {
ps.setObject(object, params);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
int i = 0; //这里的i表示的是完成操作的数量,或者说是受影响的数据库数据的数量。
try {
i = ps.executeUpdate();
close(coon,ps);
} catch (SQLException e) {
e.printStackTrace();
}
return i; //注意这里和查询方法的区别
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
5、查询方法
public static T queryOne(Class t, String sql, Object… params) {
//再次强调 Object… params 变长数组
List<Map<String, Object>> list = getDataPair(sql,params);
if(!list.isEmpty()){
Map<String, Object> map = list.get(0);
T obj = parseMapToBean(map,t);
return obj;
}
return null;
}
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
6、释放资源
public static void close(PrepareStatement ps,Connection conn) {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet rs,PrepareStatement ps,Connection conn) {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
JDBCUtils.close(pstmt,conn);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
三、总结
以上就是我对JDBCUtils的理解,本文仅仅简单介绍了这个JDBCUtils的组成与使用,有兴趣可以看看阿里Druid的官方文档。
本文的JDBCUtils类是借助Druid实现的,但其实Druid是主要应用于数据库连接池方面,且表现极为出色,还请读者千万误解。
也许有时间我还会再写一篇关于它的博客。