实现 Jdbc 优雅的链式调用

写在前面

  • 今天用到了 Jdbc 进行数据库的一些操作,要写很多重复连接关闭的代码,刚好最近在学设计模式,就突发奇想浅浅的用一下设计模式,给它封装一下吧
  • 写的很简单,也可能有很多不足的地方,欢迎评论指出哦。
  • 只是设计模式的一个练习,不一定实用,大家且看看吧。

实现说明

核心

  • 链式调用
  • 建造者模式
  • 接口回调

相关说明

链式调用
  • 链式调用: chained invocation(链式调用)或者Method chaining,这种风格的AP设计叫做fluent API或者Fluent interface
  • 常用于Builder Pattern(建造者模式)。
建造者模式
  • 建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
接口回调
  • 接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。
  • 实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。

源码部分

  • 如何使用话已经总结在代码开头的注释了,连同方法作用也一并整理了。
  • 好了直接看源码如下:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
package com.huang.util;

import java.sql.*;

/**
* 描述:Jdbc 工具类 实现Jdbc的快速使用,链式调用
*
* 方法:Builder() -- 构建 jdbc 基本属性
* setUrl() -- 设置 jdbc url
* setName() -- 设置 jdbc 用户名
* setPwd() -- 设置 jdbc 密码
* -------------------------
* connect() -- 连接 初始化 Connection 对象
* -------------------------
* setSql() -- 设置 sql 语句, 初始化 PreparedStatement 对象
* -------------------------(待更新)
* setParamString() -- 设置 sql 语句中对应参数 字符串类型
* setParamInt() -- 设置 SQL 语句中对应参数 整型
* -------------------------(待更新)
* execute() -- 插入,删除语句执行
* executeQuery() -- 查询语句执行
* executeUpdate() -- 更新语句执行
* -------------------------
* setCallBack() -- 设置回调函数
*
* 使用:new JdbcUtil.Builder()
* .connect()
* .setSql("select * from user where email = ? and password = ?;")
* .setParamString(1, email)
* .setParamString(2, password)
* .setCallBack(new CallBack() {
* @Override
* public void executeResult(ResultSet resultSet) {
* super.executeResult(resultSet);
*
* }
* })
* 作者:HWH
* 日期:2022-4-12 14:29
* 邮箱:huangwenhuan2019@outlook.com
*/

public class JdbcUtil {


/**
* 接口回调
*/
private interface ICallBack{
void executeResult(ResultSet resultSet);
void executeResult(int result);
void executeResult(boolean result);
}

public static abstract class CallBack implements ICallBack{
@Override
public void executeResult(int result) {

}

@Override
public void executeResult(boolean result) {

}

@Override
public void executeResult(ResultSet resultSet) {

}
}

public static class Builder{
private String url;
private String name;
private String pwd;
private Connection connection;
private PreparedStatement preparedStatement;
private CallBack callBack;



/**
* 构建 jdbc 基本属性
*/
public Builder(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取连接
url = "jdbc:mysql://localhost:3306/webservice?serverTimezone=GMT";
name = "root";
pwd = "15715293569";
}

/**
* 设置 jdbc url
* @param url jdbc 的 url
* @return Builder 对象
*/
public Builder setUrl(String url) {
this.url = url;
return this;
}

/**
* 设置 jdbc 用户名
* @param name jdbc 的 用户名
* @return Builder 对象
*/
public Builder setName(String name) {
this.name = name;
return this;
}

/**
* 设置 jdbc 密码
* @param pwd jdbc 的 密码
* @return Builder 对象
*/
public Builder setPwd(String pwd) {
this.pwd = pwd;
return this;
}

/**
* 连接 初始化 Connection 对象
* @return Builder 对象
*/
public Builder connect(){
try {
connection = DriverManager.getConnection(url, name, pwd);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return this;
}

/**
* 设置 sql 语句, 初始化 PreparedStatement 对象
* @param sql sql 语句 字符串
* @return Builder 对象
*/
public Builder setSql(String sql){
try {
if(connection==null) throw new Exception("connection is null, please invoke connect() to create it.");
preparedStatement = connection.prepareStatement(sql);
} catch (Exception throwables) {
throwables.printStackTrace();
}
return this;
}

/**
* 设置 sql 语句中对应参数 字符串类型
* @param index 参数索引
* @param value 参数值
* @return Builder 对象
*/
public Builder setParamString(int index,String value){
try {
if(preparedStatement!=null){
preparedStatement.setString(index,value);
}else{
throw new Exception("preparedStatement is null, please invoke the setSql() to create it.");
}
}catch (Exception e){
e.getStackTrace();
}
return this;
}

/**
* setParamInt() -- 设置 SQL 语句中对应参数 整型
* @param index 参数索引
* @param value 参数值
* @return Builder 对象
*/
public Builder setParamInt(int index,int value){
try {
if(preparedStatement!=null){
preparedStatement.setInt(index,value);
}else{
throw new Exception("preparedStatement is null, please invoke the setSql() to create it.");
}
}catch (Exception e){
e.getStackTrace();
}
return this;
}

/**
* 插入,删除语句执行
*/
public void execute(){
boolean result = false;
try {
result = preparedStatement.execute();
callBack.executeResult(result);
preparedStatement.close();
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}

/**
* 查询语句执行
*/
public void executeQuery(){
ResultSet resultSet = null;
try {
resultSet = preparedStatement.executeQuery();
callBack.executeResult(resultSet);
resultSet.close();
preparedStatement.close();
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}

/**
* 更新语句执行
*/
public void executeUpdate(){
int result = 0;
try {
result = preparedStatement.executeUpdate();
callBack.executeResult(result);
preparedStatement.close();
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}

/**
* 设置回调函数
* @param callBack 回调函数
* @return Builder 对象
*/
public Builder setCallBack(CallBack callBack){
this.callBack = callBack;
return this;
}

}
}

写在最后

  • 感觉对于一般的数据库操作已经覆盖了,当然还有很多其他的方法没有实现,可以在必要的时候添加。

实现 Jdbc 优雅的链式调用
https://hwh-2019.github.io/2022/12/10/实现-Jdbc-优雅的链式调用/
作者
HWH
发布于
2022年12月10日
许可协议