在本节中,我们将通过一个示例说明如何利用JDBC对数据库进行增删查改等各种操作,以及怎样对结果集中的数据进行处理。
我们假设现在数据库中有一张表tbl_user用来存放用户信息。为了简便起见,我们只设了3个字段:用户名vcUsername、密码vcPassword和注册日期dtRegDate。
新用户注册时要将客户的相关信息存入数据库;用户登录时要进行密码验证;用户注销时要将其信息删除;用户修改自己的信息时要对数据库中的数据进行修改。
在这个示例中我们将调用示例13-1获取数据库连接。另外,我们还编写了一个User类用来操作用户信息,如示例13-2所示。
【程序源代码】
1 // ==================== Program Description ==========================
2 // 程序名称:示例13-2: User.java
3 // 程序目的:创建一个用来操作用户信息的类
4 // ==============================================================
5 public class User
6 {
7 private String username;
8 private String password;
9 private String regDate;
10
11 // 获取用户名
12 public String getUsername() {
13 return username;
14 }
15
16 // 设置用户名
17 public void setUsername(String username) {
18 this.username = username;
19 }
20
21 // 获取用户密码
22 public String getPassword() {
23 return password;
24 }
25
26 // 设置用户密码
27 public void setPassword(String password) {
28 this.password = password;
29 }
30
31 // 获取用户注册时间
32 public String getRegDate() {
33 return regDate;
34 }
35
36 // 设置用户注册时间
37 public void setRegDate(String regDate) {
38 this.regDate = regDate;
39 }
40 }
|
示例13-3的UserMgr类中封装了对数据库中的用户信息进行增删查改等操作的方法。
【程序源代码】
1 // ==================== Program Description ==========================
2 // 程序名称:示例13-3: UserMgr.java
3 // 程序目的:利用JDBC对数据库进行增删查改操作
4 // ==============================================================
5 import java.sql.*;
6 import test.DBConnection;
7
8 public class UserMgr
9 {
10 // 向数据库中添加用户信息
11 public boolean addUser(User user)
12 {
13 // 构造SQL语句
14 String sql = "insert into tbl_user (vcUsername, vcPassword,dtRegDate) values('" +
15 user.getUsername() + "','" + user.getPassword() +"',getDate())";
16 Statement stmt;
17 Connection conn;
18 try {
19 // 获取数据库连接
20 conn = DBConnection.getConnection();
21
22 // 创建Statement对象
23 stmt = conn.createStatement();
24
25 // 执行SQL语句
26 stmt.executeUpdate(sql);
27 stmt.close();
28 conn.close();
29
30 return true;
31 }
32 catch (SQLException e) {
33 System.out.println(e.getMessage());
34 }
35
36 return false;
37 }
38
39 // 删除数据库中某个用户的信息
40 public boolean deleteUser(User user)
41 {
42 String sql="delete from tbl_user where
vcUsername="+"'"+user.getUsername()+"'";
43 Connection conn;
44 Statement stmt;
45
46 try {
47 conn=DBConnection.getConnection();
48 stmt=conn.createStatement();
49 stmt.executeUpdate(sql);
50 stmt.close();
51 conn.close();
52
53 return true;
54 }
55 catch (SQLException e)
56 {
57 System.out.println(e.getMessage());
58 }
59
60 return false;
61 }
62
63 // 根据用户名查询数据库获取一个用户对象
64 public User getUser( String username )
65 {
66 User user;
67 String sql="select * from tbl_user where vcUsername='"+username+"'";
68 Statement stmt;
69 Connection conn;
70
71 try {
72 conn= DBConnection.getConnection();
73 stmt=conn.createStatement();
74
75 // 执行SQL语句并将查询结果放入结果集中
76 ResultSet rs=stmt.executeQuery(sql);
77
78 // 将结果集中的数据取出放入User类的对象中
79 if (rs.next())
80 {
81 user=new User();
82 user.setUsername(rs.getString("vcUsername"));
83 user.setPassword(rs.getString("vcPassword"));
84 user.setRegDate(rs.getDate("dtRegDate").toString());
85 stmt.close();
86 conn.close();
87 return user;
88 }
89 }
90 catch (SQLException e)
91 {
92 System.out.println(e.getMessage());
93 }
94
95 return null;
96 }
97
98 // 通过验证密码鉴定用户的身份
99 public int checkUser(User user)
100 {
101 User dbUser= getUser(user.getUsername());
102 if (dbUser==null)
103 return 0;
104 else if (dbUser.getPassword().equals(user.getPassword()) )
105 return 1;
106 else return -1;
107 }
108
109 // 修改数据库中某个用户的信息
110 public boolean modifyUser(User user)
111 {
112 Connection conn;
113 Statement stmt;
114 String sql="update tbl_user set vcPassword=
'"+user.getPassword()+"' where
115 vcUsername='"+user.getUsername()+"'";
116
117 try {
118 conn=DBConnection.getConnection();
119 stmt=conn.createStatement();
120 stmt.executeUpdate(sql);
121 stmt.close();
122 conn.close();
123
124 return true;
125 }
126 catch (SQLException e)
127 {
128 System.out.println(e.getMessage());
129 }
130
131 return false;
132 }
133 }
|
【程序注解】
要对数据库进行操作,首先必须建立一个数据库连接。关于这个问题,我们已经在13.3节中进行了详细讨论。因此,本例中直接调用示例13-1中的getConnection()方法(第20行)。当然,在此之前,必须将DBConnection类import进来(第6行)。然后我们就可以利用已经获取的数据库连接创建一个Statement对象stmt,并调用Statement类提供的方法执行SQL语句,如executeUpdate(String sql)、executeQuery(String sql)等。
如果是添加、删除或修改用户信息,那么执行了executeUpdate(String sql)方法之后即完成了相应操作。但如果是查询用户信息,则还需对结果集进行处理。例如,在getUser(String username)方法(第64行)中,我们根据用户名查询到了相应用户的信息并存入了一个结果集中。然后从第78行到第87行对结果集中的数据进行处理,并关闭Statement和Connection对象。
首先判断rs.next()是否为真,即是否从数据库中取到了数据。如果为真,则创建一个User类的实例,并调用其set方法将结果集中的数据置入user对象中。值得注意的是,我们在添加用户的时候,注册时间是用getDate()方法自动获取的,这个时间会精确到毫秒级,而我们在获取用户注册时间时往往只要知道用户是在哪一天注册的就可以了,因此我们使用了结果集的getDate()方法获取注册时间(第84行)。这个方法将返回一个Date型值,但User类的setRegDate()方法要求传递一个字符串参数,所以我们要调用Date类的toString()方法将此时间转化为一个字符串。如果你的确想要获得用户的精确注册时间,也可以直接调用结果集的getString()方法。总之,在完成了对user对象的属性设置之后,我们便可以将这个对象作为getUser()方法的返回值,以供该方法的调用者使用。
还有一点需要说明的是,我们这里假设数据库里的用户名是惟一的。如果数据库中存在重名的用户,我们可以定义一个Vector对象,在从结果集中获取了每一个用户的信息之后即将该user对象加入vector中,然后将vector作为getUser()方法的返回值。(T111)
本文选自飞思图书《精通Java核心技术》