博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDBC使用的经典示例
阅读量:4090 次
发布时间:2019-05-25

本文共 5371 字,大约阅读时间需要 17 分钟。

发表在

使用JDBC重构博客应用

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

使用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
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()

最后,将装换后的用户列表展示在首页当中。由于现在还没有任何用户,我们访问 后可以看到用户列表目前是空的,接下来我们尝试往数据库中插入数据。

使用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语句。

现在,我们可以尝试一下注册操作了,访问 ,输入相关数据,点击注册。完成后,我们登录数据库,查询所有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/

你可能感兴趣的文章
DirectX11 聚光灯
查看>>
DirectX11 HLSL打包(packing)格式和“pad”变量的必要性
查看>>
DirectX11 光照演示示例Demo
查看>>
漫谈一下前端的可视化技术
查看>>
VUe+webpack构建单页router应用(一)
查看>>
Vue+webpack构建单页router应用(二)
查看>>
从头开始讲Node.js——异步与事件驱动
查看>>
Node.js-模块和包
查看>>
Node.js核心模块
查看>>
express的应用
查看>>
NodeJS开发指南——mongoDB、Session
查看>>
Express: Can’t set headers after they are sent.
查看>>
2017年,这一次我们不聊技术
查看>>
实现接口创建线程
查看>>
Java对象序列化与反序列化(1)
查看>>
HTML5的表单验证实例
查看>>
JavaScript入门笔记:全选功能的实现
查看>>
程序设计方法概述:从面相对象到面向功能到面向对象
查看>>
数据库事务
查看>>
JavaScript基础1:JavaScript 错误 - Throw、Try 和 Catch
查看>>