由David发表在天码营
目前,我们的博客系统依然使用内存中的变量来保存数据。现在,就让我们使用JDBC的相关知识来重构我们的博客系统,使得我们的用户数据以及博客数据能够持久化在我们的MySQL数据库中。在接下来的学习过程中,大家可以同时打开MySQL Workbench或者命令行,当我们对数据进行操作后,直接在数据库中查看数据的变化,验证我们的操作是否正确。
另外,我们在SQL简介的课程中往数据库插入了一些测试数据,为了保证数据的一致,我们先来清空我们的数据库:
mysql> use tianmayingblog;
Database changed
mysql> delete from post;
Query OK, 1 row affected (0.05 sec)
mysql> delete from user;
Query OK, 3 rows affected (0.01 sec)
首先,我们尝试一下向MySQL Server发送Select
语句,并处理返回结果。
我们先来用JDBC重构我们的首页。之前展示首页时,我们从内存中取得了所有的用户,现在,我们从数据库中取得用户列表:
Connection con = null; // 定义一个MYSQL链接对象
Statement stmt = null; // 创建声明
try {
Class.forName("com.mysql.jdbc.Driver").newInstance(); // MYSQL驱动
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tianmayingblog", "root", ""); // 链接本地MYSQL
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from `user`");
List<User> users = new ArrayList<>();
while (rs.next()) {
User user = new User();
user.setAvatar(rs.getString("avatar"));
user.setDescription(rs.getString("description"));
user.setEmail(rs.getString("email"));
user.setId(rs.getLong("id"));
user.setPassword(rs.getString("password"));
user.setTitle(rs.getString("title"));
user.setUsername(rs.getString("username"));
users.add(user);
}
req.setAttribute("users", users);
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/templates/index.jsp");
dispatcher.forward(req, resp);
} catch (Exception e) {
System.out.print("MYSQL ERROR:" + e.getMessage());
} finally {
try {
if (stmt != null) stmt.close();
if (con != null) con.close();
} catch (SQLException ignored) {
}
}
建立完连接后,我们通过con.createStatement();
方法创建了一个Statement
对象,我们可以通过该对象向MySQL Server发送SQL语句,并得到其返回结果。
这里,我们通过stmt.executeQuery("select * from user");
获得了User
表中的所有数据,并返回了类型为ResultSet
。
然后,我们通过ResultSet
将获得的所有数据转为User
对象。ResultSet
是一个迭代器,通过移动其指针,我们可以得到查询到的每一条记录。通过ResultSet.getXXX
方法将得到的数据转换为Java的各种类型。下表展示了MySQL数据类型相对应的Java数据类型:
MySQL数据类型 | Java数据类型 | ResultSet方法 |
---|---|---|
CHAR | String | String getString() |
VARCHAR | String | String getString() |
LONGVARCHAR | String | InputStream getAsciiStream() |
NUMERIC | java.math.BigDecimal | java.math.BigDecimal getBigDecimal() |
DECIMAL | java.math.BigDecimal | java.math.BigDecimal getBigDecimal() |
BIT | Boolean | boolean getBoolean() |
TINYINT | Integer | byte getByte() |
SMALLINT | Integer | short getShort() |
INTEGER | Integer | int getInt() |
BIGINT | Long | long getLong() |
REAL | Float | float getFloat() |
FLOAT | Double | double getDouble() |
DOUBLE | Double | double getDouble() |
BINARY | byte[] | byte[] getBytes() |
VARBINARY | byte[] | byte[] getBytes() |
LONGVARBINARY | byte[] | getBinaryStream() |
DATE | java.sql.Date | java.sql.Date getDate() |
TIME | Java.sql.Time | java.sql.Time getTime() |
TIMESTAMP | Java.sql.Timestamp | java.sql.Timestamp getTimestamp() |
最后,将装换后的用户列表展示在首页当中。由于现在还没有任何用户,我们访问http://localhost:8080/ServletBlogDemo/ 后可以看到用户列表目前是空的,接下来我们尝试往数据库中插入数据。
现在,我们使用JDBC重构注册页面,注册完成后,所有数据应该保留在数据当中。
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
String title = req.getParameter("title");
String description = req.getParameter("description");
Connection con = null; // 定义一个MYSQL链接对象
Statement stmt = null; // 创建声明
try {
Class.forName("com.mysql.jdbc.Driver").newInstance(); // MYSQL驱动
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tianmayingblog", "root", ""); // 链接本地MYSQL
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(String.format("select * from `user` where username = '%s'", username));
if (rs.next()) {
req.setAttribute("usernameExist", true);
RequestDispatcher dispatcher = req.getRequestDispatcher("/jsp/register.jsp");
dispatcher.forward(req, resp);
}
stmt.executeUpdate(String.format(
"insert into user(username, password, email, title, description, avatar) values('%s', '%s', '%s', '%s', '%s', 'images/default-avatar.jpeg')",
username, password, email, title, description));
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/templates/registerResult.jsp"); dispatcher.forward(req, resp);
} catch (Exception e) {
System.out.print("MYSQL ERROR:" + e.getMessage());
}finally {
try {
if (stmt != null) stmt.close();
if (con != null) con.close();
} catch (SQLException ignored) {
}
}
我们注册页面的逻辑如下:
req.getParameter
方法得到注册表单的所有数据Statement
这里大部分代码我们都已经学习过了,唯一需要注意的地方是查询的SQL语句与插入的SQL语句所调用的方法是不一样的。我们可以通过stmt.executeUpdate
方法执行insert
语句。
现在,我们可以尝试一下注册操作了,访问http://localhost:8080/ServletBlogDemo/jsp/register.jsp ,输入相关数据,点击注册。完成后,我们登录数据库,查询所有User
表中的数据,可以得到类似如下结果,其中的数据应该是我们在注册表单中所输入的:
mysql> select * from user;
+----+----------+----------+----------------------------+----------+--------------------+-------------+
| id | username | password | avatar | title | email | description |
+----+----------+----------+----------------------------+----------+--------------------+-------------+
| 3 | luoruici | 123456 | images/default-avatar.jpeg | luoruici | [email protected] | luoruici |
+----+----------+----------+----------------------------+----------+--------------------+-------------+
1 row in set (0.00 sec)
修改数据和删除数据的方法和插入数据的方法一样,只需要把stmt.executeUpdate
的参数换成相应的SQL语句即可。
现在,请大家自行完成登录页面、博客创建页面、博客管理页面、博客详情页面等其他页面的重构。重构完成后,我们就使用JDBC完成了博客网站的基本重构。
重构完成后,重新检查一遍代码,我们发现,在我们的XXXController
中有着大量的重复代码,接下来我们将使用经典的三层架构对我们的代码进行重构。
更多文章请访问天码营网站