本文共 5371 字,大约阅读时间需要 17 分钟。
由发表在
目前,我们的博客系统依然使用内存中的变量来保存数据。现在,就让我们使用JDBC的相关知识来重构我们的博客系统,使得我们的用户数据以及博客数据能够持久化在我们的MySQL数据库中。在接下来的学习过程中,大家可以同时打开MySQL Workbench或者命令行,当我们对数据进行操作后,直接在数据库中查看数据的变化,验证我们的操作是否正确。
另外,我们在SQL简介的课程中往数据库插入了一些测试数据,为了保证数据的一致,我们先来清空我们的数据库:
mysql> use tianmayingblog;Database changedmysql> 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`"); Listusers = 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() |
最后,将装换后的用户列表展示在首页当中。由于现在还没有任何用户,我们访问 后可以看到用户列表目前是空的,接下来我们尝试往数据库中插入数据。
现在,我们使用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
语句。
现在,我们可以尝试一下注册操作了,访问 ,输入相关数据,点击注册。完成后,我们登录数据库,查询所有User
表中的数据,可以得到类似如下结果,其中的数据应该是我们在注册表单中所输入的:
mysql> select * from user;+----+----------+----------+----------------------------+----------+--------------------+-------------+| id | username | password | avatar | title | email | description |+----+----------+----------+----------------------------+----------+--------------------+-------------+| 3 | luoruici | 123456 | images/default-avatar.jpeg | luoruici | lrc@tianmaying.com | luoruici |+----+----------+----------+----------------------------+----------+--------------------+-------------+1 row in set (0.00 sec)
修改数据和删除数据的方法和插入数据的方法一样,只需要把stmt.executeUpdate
的参数换成相应的SQL语句即可。
现在,请大家自行完成登录页面、博客创建页面、博客管理页面、博客详情页面等其他页面的重构。重构完成后,我们就使用JDBC完成了博客网站的基本重构。
重构完成后,重新检查一遍代码,我们发现,在我们的XXXController
中有着大量的重复代码,接下来我们将使用经典的三层架构对我们的代码进行重构。
更多文章请访问
转载地址:http://mjjii.baihongyu.com/