JDBC的封装

JDBC–最终封装

JDBC的封装

通过我们前一段时间的学习我们可以看出,在前面的所有代码中,在数据库操作方法中关于驱动加载和数据库连接对象的代码是重复的,这会造成修改数据源特别麻烦。

解决方法1:将jdbc参数在功能类中提取为全局变量。

但这样又会带来一些问题,如果使用解决方式1解决后,修改了数据源则必须重启程序,而开发过程中尽量要求,再不启动程序的情况下完成对代码参数的修改。

解决方法2:将jdbc参数存储到properties属性配置文件中(一般就放在src下),封装工具类进行获取。

知识点补充properties文件是专门用来存储属性配置的文件,格式要求必须是键值对,以=号隔开,一行一组键值对,且不能够使用分号结尾,可以使用Properties对象来进行读取该文件的内容。

db.properties文件内容如下:

1
2
3
4
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:XE
username=hhh
password=123456

JDBC工具类的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 大家可以复制到IDE当中辅助编程
* 使用:
* 创建Java工具类
* 创建jdbc参数静态变量
* 创建静态代码块
* 创建Properties对象
* 获取Properties文件流对象
* 加载属性配置文件
* 获取jdbc参数并赋值给静态变量
* 加载驱动
* 创建获取Connection对象的静态方法
* 创建获取PreparedStatement对象的静态方法
* 创建获取Statement对象的静态方法
* 创建关闭资源的静态方法
* 创建增删改查的封装方法--executeDML
*/

案例展示

使用OracleXE数据库,操作的表如下所示:

然后使用eclipse进行开发,结构如下:

下面介绍一下这几个包的定义:

(一)Dao包中主要存放实现数据库操作功能的接口。

(二)DaoImpl包中主要存放Dao包中接口的实现类。

(三)pojo包中主要存放实体,对应数据库各个表的一条记录。

(四)util包中存放JDBC工具类,上面也着重强调了工具类的写法。

就像上面说的那样,我们将不同的类放到对应的包中:

LogonDao.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.baidu.Dao;

import com.baidu.pojo.Logon;

public interface LogonDao {
//登录认证
public Logon getLogon(String name,String pass);
//向表中增加一条
public int insertLogon(String name,String pass);
//当数据相同时删除该条数据
public int deleteLogon(String name,String pass);
//当数据相同时修改密码
public int updateLogon(String name,String pass,String newPass);
}

LogonDaoImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.baidu.DaoImpl;

import com.baidu.Dao.LogonDao;
import com.baidu.pojo.Logon;
import com.baidu.util.JdbcUtil;

public class LogonDaoImpl implements LogonDao {
//查询登录信息
public Logon getLogon(String name, String pass) {
return JdbcUtil.executeQueryDML("select * from logon where sname = ? and spassword = ?",name,pass);
}
//向表中增加一条数据
public int insertLogon(String name, String pass) {
return JdbcUtil.executeDML("insert into logon values(?,?)", name, pass);
}
//当数据相同时删除该条数据
public int deleteLogon(String name, String pass) {
return JdbcUtil.executeDML("delete from logon where sname = ? and spassword = ?", name,pass);
}
//当数据相同时修改密码
public int updateLogon(String name, String pass,String newPass) {
return JdbcUtil.executeDML("update logon set spassword = ? where sname=? and spassword = ?",newPass,name,pass );
}
}

Logon.java

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
package com.baidu.pojo;

public class Logon {
private String name;
private String password;
public Logon() {
super();
}
public Logon(String name, String password) {
super();
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Logon [name=" + name + ", password=" + password + "]";
}
}

JdbcUtil.java

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
package com.baidu.util;

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

import com.baidu.pojo.Logon;

/**
* 使用:
* 创建Java工具类
* 创建jdbc参数静态变量
* 创建静态代码块
* 创建Properties对象
* 获取Properties文件流对象
* 加载属性配置文件
* 获取jdbc参数并赋值给静态变量
* 加载驱动
* 创建获取Connection对象的静态方法
* 创建获取PreparedStatement对象的静态方法
* 创建获取Statement对象的静态方法
* 创建关闭资源的静态方法
* 创建增删改查的封装方法--executeDML
* 这里也封装了一个查询用户名密码的静态方法
* @author x1aolin
*
*/
public class JdbcUtil {
private static String driver;
private static String url;
private static String username;
private static String password;

static{
//创建properties对象获取属性文件的内容
Properties p = new Properties();
//获取属性文件的读取流对象 可动态获取位置,避免因为项目移动位置而造成代码不可用
InputStream is = JdbcUtil.class.getResourceAsStream("/db.properties");
try {
//加载属性配置文件
p.load(is);
//获取jdbc参数
driver = p.getProperty("driver");
url = p.getProperty("url");
username = p.getProperty("username");
password = p.getProperty("password");
//加载驱动 需要在获取Connection对象之前
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//工具类,私有化构造器
private JdbcUtil() {
super();
}
//封装获取Connection对象
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//封装获取PreparedStatement对象
public static PreparedStatement getPreparedStatement(Connection conn,String sql){
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return ps;
}
//封装获取Statement对象
public static Statement getStatement(Connection conn){
Statement stmt = null;
try {
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stmt;
}
//查询关闭资源
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//增删改关闭资源
public static void closeAll(Statement stmt,Connection conn){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

//封装DML 增加删除修改
public static int executeDML(String sql,Object...objs){
//获取数据库连接对象
Connection conn = getConnection();
//获取sql命令对象
PreparedStatement ps = getPreparedStatement(conn,sql);
//填写占位符
try {
//设置事务手动提交
conn.setAutoCommit(false);
//占位符填充
for(int i=0;i<objs.length;i++){
ps.setObject(i+1, objs[i]);
}
//执行sql语句
int i = ps.executeUpdate();
conn.commit();
return i;
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
//关闭资源
closeAll(ps,conn);
}
return -1;
}
//封装DML 查询
public static Logon executeQueryDML(String sql,Object...objs){
ResultSet rs = null;
Connection conn = getConnection();
PreparedStatement ps = getPreparedStatement(conn,sql);
//填写占位符
try {
for(int i=0;i<objs.length;i++){
ps.setObject(i+1, objs[i]);
}
rs = ps.executeQuery();
//创建logon对象
Logon log = null;
while(rs.next()){
log = new Logon(rs.getString("sname"), rs.getString("spassword"));
}
return log;
} catch (Exception e) {
//异常处理
} finally {
closeAll(rs,ps,conn);
}
return null;
}
}

Test.java

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
package com.baidu.test;

import java.util.Scanner;
import com.baidu.Dao.LogonDao;
import com.baidu.DaoImpl.LogonDaoImpl;
import com.baidu.pojo.Logon;

public class Test {
public static void print(){
System.out.println("------------------");
System.out.println("a.登录");
System.out.println("b.注册");
System.out.println("c.修改密码");
System.out.println("d.注销账号");
System.out.println("q.退出");
System.out.println("------------------");
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char str;
while(true){
print();
str = sc.nextLine().charAt(0);
if(str=='q') break;
String name = null;
String pass = null;
LogonDao l = null;
if(str=='a'||str=='b'||str=='c'||str=='d'){
System.out.print("用户名:");
name = sc.nextLine();
System.out.print("密码:");
pass = sc.nextLine();
l = new LogonDaoImpl();
}
switch(str){
case 'a':
Logon lo = l.getLogon(name, pass);
if(lo!=null)
System.out.println("登录成功");
else
System.out.println("登陆失败");
break;
case 'b':
if(l.insertLogon(name, pass)>0)
System.out.println("注册成功");
else
System.out.println("注册失败");
break;
case 'c':
System.out.println("请输入新密码:");
String newPass = sc.nextLine();
if(l.updateLogon(name, pass, newPass)>0)
System.out.println("修改成功");
else
System.out.println("修改失败");
break;
case 'd':
if(l.deleteLogon(name, pass)>0)
System.out.println("注销账号成功");
else
System.out.println("注销账号失败");
break;
default:
System.out.println("输入有误,重新输入!");
}
}
sc.close();
System.out.println("退出成功!");
}
}
您的每一份支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------