博客系统数据库设计与实现

第1关:博客系统数据库设计与实现之查询


任务描述

本关任务:通过 JDBC 的方式查询 MySQL 表 t_user 中的数据。

相关知识

为了完成本关任务,你需要掌握:

  1. JDBC 如何连接数据库;
  2. JDBC 如何查询表中数据。

JDBC

JDBC(Java DataBase Connectivity)是一种用于执行 SQL 语句的 Java API,它由一组用 Java 语言编写的类和接口组成。换句话说:就是可以直接通过 Java 语言,去操作数据库。

JDBC 常用 API

JDBC API 提供以下接口和类:

  • DriverManager:此类管理数据库驱动程序列表。可在 JDBC 下识别某个子协议的第一个驱动程序,用于建立数据库连接;

    方法名称功能描述
    getConnection(String url,String user,String password)指定 3 个入口参数(依次为连接数据库的 url、用户名和密码)来获取与数据库的连接
    setLoginTimeout()获取驱动程序试图登陆到某一数据库时可以等待的最长时间,以秒为单位
  • Connection:此接口具有用于联系数据库的所有方法。 Connection 对象表示通信上下文,即与数据库的所有通信仅通过连接对象;

    方法名称功能描述
    getMetaData()该方法用于返回数据库的元数据的 DatabaseMetaData 对象
    createStatement用于创建一个 Statement 对象来将 SQL 语句发送到数据库
    preparedStatement(String sql)用于创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库
    commit()使所有上一次提交/回滚后进行的更改成为持久更改
    close()立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被释放
  • Statement:用于执行静态 SQL 语句并返回它所生成结果的对象;

    方法名称功能描述
    boolean execute(String sql)用于执行各种 SQL 语句,该方法返回一个 boolean 类型的值。如果为 true,表示所执行的 SQL 语句具备查询结果,可通过 Statement 的 getResultSet() 方法查询结果
    int executeUpdate(String sql)用于执行 SQL 中的 insert、update 和 delete 语句,该方法返回一个 int 类型的值,表示影响数据库中的行数
    ResultSet executeQuery(String sql)用于执行 SQL 中的 select 语句(查询,遍历),该方法返回一个表示查询结果的 ResultSet 对象
  • PrepareStatement:动态地执行 SQL,其将被预编译并保存到 PrepareStatement 实例中,从而可以反复地执行该 SQL 语句;

    方法名称功能描述
    executeUpdate()在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 DML 语句,或者无返回内容的 SQL 语句,比如 DDL 语句
    executeQuery()在此 PreparedStatement 对象中执行 SQL 语句,该方法返回的是 ResultSet 对象
    setInt(int parameterIndex, int x)将指定的参数设置为 int 值
    setFloat(int parameterIndex, float x)将指定的参数设置为 Float 值
    setString(int parameterIndex, String x)将指定参数设置的给定的 Date 值
    setDate(int parameterIndex, Date x)将指定参数设置给定的 Date 值
    addBatch()将一组参数添加到此 PreparedStatement 对象的批处理命令中
  • ResultSet:提供检索不同类型字段的方法。(操作对象为 Statement 执行 SQL 查询后的结果);

    getString(int columnIndex)用于获取 指定字段的 String 类型的值,参数 columnIndex 代表字段的索引
    getString(String columnName) 用于获取指定字段的 String 类型的值,参数 columnIndex 代表字段名称
    getInt(int columnIndex) 用于获取指定字段的 int 类型的值,参数 columnIndex 代表字段的索引
    getInt(String columnName) 用于获取指定字段的 int 类型的值,参数 columnIndex 代表字段名称
    getDate(int columnIndex) 用于获取指定字段的 Date类型的值,参数 columnIndex 代表字段索引
    getDate(String columnName) 用于获取指定字段的 Date类型的值,参数 columnIndex 代表字段名称
    next() 将游标从当前位置移到下一位置
  • SQLException:此类处理数据库应用程序中发生的任何错误。

使用 JDBC 的步骤如下:

加载数据库驱动 → 建立数据库连接(Connection) → 创建执行 SQL 语句的 Statement 对象 → 处理执行结果(ResultSet) → 释放资源。

加载数据库驱动

驱动加载是为了打开与数据库的通信通道。

在注册驱动前我们需要装载特定厂商的数据库驱动程序,导入 mysq-connector-java 的 jar 包,方法是在项目中建立 lib 目录,在其下放入 jar 包(平台已准备好 jar 包,无需自己放入)。

将 jar 包导入项目之后我们就开始注册驱动:

Java 加载数据库驱动通常是使用 Class 类的静态方法 forName(),语法格式如下:

 
  1. Class.forName(String driverManager)

示例:

 
  1. // 需要抛出异常
  2. try {
  3. // 获取连接驱动
  4. Class.forName("com.mysql.jdbc.Driver" );
  5. } catch (ClassNotFoundException e) {
  6. e.printStackTrace();
  7. }

如果加载成功,会将加载的驱动类注册给 DriverManager;加载失败,会抛出 ClassNotFoundException 异常。

建立连接

成功加载完数据库驱动后,就可以建立数据库的连接了,使用 DriverManager 的静态方法 getConnection() 来实现。如下:

 
  1. // 连接数据库,参数:连接的 url、用户名、密码
  2. Connection conn = DriverManager.getConnection(url, user, password);

注意:需要抛出 SQLException 的异常。

URL 用于标识数据库的位置,通过 URL 地址告诉 JDBC 程序连接信息。

若不存在数据库,只建立连接,URL 的写法为:

若存在数据库 test,URL 的写法为:

其中 localhost 可以换成 IP 地址 127.0.0.1 ,3306 为 MySQL 数据库的默认端口号,user 和 password 对应数据库的用户名和密码。

执行编写的 SQL 语句

连接建立完毕后,创建(获取)数据库操作对象,用于执行编写的 SQL 语句。

 
  1. Statement createStatement() :主要用来执行 SQL 语句,但是有 SQL 注入的漏洞
  2. PreparedStatement preparedStatement(String sql) :主要用来预编译 SQL 语句,并且执行。解决了 SQL 注入的漏洞
  3. CallableStatement prepareCall(String sql) :主要用来执行 SQL 中的存储过程

例子:

 
  1. // 编写 SQL 语句
  2. String sql = "SELECT * FROM myuser";
  3. // 动态执行该 SQL 语句
  4. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  5. // 获取查询结果
  6. ResultSet resultSet = preparedStatement.executeQuery();
  7. // 遍历输出该结果
  8. while (resultSet.next()){
  9. System.out.println(resultSet.getString("name")); // 注意:这里的 name 必须与数据库的字段名称一致
  10. }

释放资源

JDBC 程序运行完后,切记要释放程序在运行过程中创建的那些与数据库进行交互的对象,这些对象通常是 ResultSet,Statement 和 Connection 对象。

特别是 Connection 对象,它是非常稀有的资源,用完后必须马上释放,如果 Connection 不能及时、正确的关闭,极易导致系统宕机。

Connection 的使用原则是尽量晚创建,尽量早的释放。

为确保资源释放代码能运行,资源释放代码一定要放在 finally 语句中。

 
  1. finally {
  2. try {
  3. if(resultSet != null){
  4. resultSet.close();
  5. }
  6. if(preparedStatement != null){
  7. preparedStatement.close();
  8. }
  9. if(connection != null){
  10. connection.close();
  11. }
  12. } catch (SQLException e) {
  13. e.printStackTrace();
  14. }
  15. }

相关数据说明

MySQL 的 mydb 数据库;

用户表 t_user;

列名类型非空注释
userIdint用户 ID 主键
userNamevarchar用户名
passWordvarchar用户密码

MySQL 连接配置:

  • Driver:com.mysql.jdbc.Driver;

  • URL:jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8;

  • user:root;

  • password:123123。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中通过 JDBC 的方式查询 MySQL 表 t_user 中的数据,输出查询结果时,用 \t 将查询字段结果分隔,格式:“userId userName passWord”,其中这些都分别对应着查询结果的值。

代码实现:

import java.sql.*;
public class JDBCInsert {
    public static void main(String[] args) {
        // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
        /********** Begin **********/
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            String driverClass = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8";
            String user = "root";
            String password= "123123";
            // 获取数据库连接驱动
            Class.forName(driverClass);
            // 连接数据库
            connection = DriverManager.getConnection(url, user, password);
            // 编写查询 SQL
            String sql = "SELECT * FROM t_user";
            // 动态执行 SQL 语句
            preparedStatement = connection.prepareStatement(sql);
            // 获取查询结果集
            resultSet = preparedStatement.executeQuery();
            // 按照指定格式输出查询结果集
            while (resultSet.next()){
                System.out.println(resultSet.getString("userId")+"\t"+resultSet.getString("userName")+"\t"+resultSet.getString("passWord"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        // 关闭资源
        }finally {
            try {
                if(resultSet != null){
                    resultSet.close();
                }
                if(preparedStatement != null){
                    preparedStatement.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        /********** End **********/
    }
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
个人博客系统主要用于发表个人博客,记录个人生活日常,学习心得,技术分享等,供他人浏览,查阅,评论等。本系统结构如下: (1)博主端: 登录模块:登入后台管理系统:首先进入登录页面,需要输入账号和密码。它会使用Shiro进行安全管理,对前台输入的密 码进行加密运算,然后与数据库的进行比较。成功后才能登入后台系统博客管理模块: 博客管理功能分为写博客博客信息管理。写博客是博主用来发表编写博客的,需要博客标题,然后选择博 客类型,最后将博客内容填入百度的富文本编辑器,点击发布博客按钮即可发布博客博客类别管理模块:博主类别管理系统可以添加,修改和删除博客类型名称和排序序号。将会显示到首页的按日志类别区域。 游客可以从这里查找相关的感兴趣的博客内容 评论信息管理模块:评论管理功能分为评论审核和评论信息管理两部分。评论审核是当有游客或自己发表了评论之后,博主需 要在后台管理系统审核评论。若想将此评论显示在页面上则点击审核通过,否则点击审核不通过。 个人信息管理模块:修改博主的个人信息,可以修改昵称,个性签名,可以添加个人头像,修改个人简介; 系统管理功能模块:友情链接管理,修改密码,刷新系统缓存和安全退出,友情链接管理可以添加,修改,删除友情链接网址 (2)游客端: 查询博客: 查询具体哪一篇博客 查看博客内容: 查看博客内容 查看博主个人信息:查看博主个人简介 发表评论: 可以评论具体某篇博客 友情链接: 查看友情链接

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值