JDBC使用的经典示例

David发表在天码营

使用JDBC重构博客应用

目前,我们的博客系统依然使用内存中的变量来保存数据。现在,就让我们使用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)

使用JDBC查询数据

首先,我们尝试一下向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操作数据

现在,我们使用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 | lrc@tianmaying.com | luoruici    |
+----+----------+----------+----------------------------+----------+--------------------+-------------+
1 row in set (0.00 sec)

修改数据和删除数据的方法和插入数据的方法一样,只需要把stmt.executeUpdate的参数换成相应的SQL语句即可。

现在,请大家自行完成登录页面、博客创建页面、博客管理页面、博客详情页面等其他页面的重构。重构完成后,我们就使用JDBC完成了博客网站的基本重构。

重构完成后,重新检查一遍代码,我们发现,在我们的XXXController中有着大量的重复代码,接下来我们将使用经典的三层架构对我们的代码进行重构。


更多文章请访问天码营网站






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值