N

Norlcayn的博客

A text-focused Halo theme

  • 首页
  • 文章
  • 默认分类
  • 关于
主页 JDBC
文章

JDBC

发表于 2026-01-15 更新于 昨天
作者 Administrator
11~14 分钟 阅读
  • JDBC(Java DateBase Connectivty),就是使用Java语言操作关系型数据库的一套API
  • 本质:
  • Sun公司官方定义的一套操作所有关系型数据库的规范,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

入门程序

  • 需求:基于JDBC,执行UPDATE语句(UPDATE user SET age = 25 WHERE id = 1)
  • 步骤:
  • 准备工作:创建Maven项目,引入依赖;准备数据库表user
  • 代码实现:编写JDBC程序,操作数据库
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>

示例:

// 1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");

// 2. 获取连接
String url = "jdbc:mysql://localhost:3306/web01";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url,username,password);

// 3. 获取SQL语句执行对象
Statement statement = connection.createStatement();

// 4. 执行SQL
int i = statement.executeUpdate("update user set age = 25 where id = 1");

// 5. 释放资源
statement.close();
connection.close();

基本的流程:注册驱动 => 建立连接 => 获取SQL执行对象 => 执行SQL语句 => 释放资源

查询数据

  • 需求:基于JDBC执行如下select语句,将查询结果封装到User对象中
  • SQL:SELECT * FROM user WHERE username = ‘daqiao’ AND password = ‘123456’

示例:

@Test
public void testSelect() throws ClassNotFoundException, SQLException {
    // 1. 注册驱动
    Class.forName("com.mysql.cj.jdbc.Driver");

    // 2. 获取连接
    String url = "jdbc:mysql://localhost:3306/web01";
    String username = "root";
    String password = "1234";
    Connection connection = DriverManager.getConnection(url,username,password);

    // 3. 获取SQL语句执行对象
    String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
    PreparedStatement statement = connection.prepareStatement(sql);
    statement.setString(1,"daqiao");
    statement.setString(2,"123456");

    // 4. 执行SQL
    ResultSet resultSet = statement.executeQuery();
    while (resultSet.next()) {
        int id = resultSet.getInt("id");
        String uname = resultSet.getString("username");
        String passwd = resultSet.getString("password");
        String name = resultSet.getString("name");
        int age = resultSet.getInt("age");
        User user = new User(id,uname,passwd,name,age);
        System.out.println(user);
        // 输出结果:User{id=1, username='daqiao', password='123456', name='大乔', age=25}
    }

    // 5. 释放资源
    statement.close();
    connection.close();
}

sql语句中的?表示占位符,可以动态的变更查询条件。此时statement变为prepareStatement,通过setString(第n个占位符,替换内容)替换占位符

ResultSet可以把它看作是一个迭代器,通过迭代器中的方法获取查询返回的数据

预编译SQL

静态SQL:

Statement statement = connection.createStatement();
int i = statement.executeUpdate("UPDATE user SET age = 25 WHERE id = 1");

预编译SQL:

PreparedStatement statement = connection.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?")
statement.setString(1,"daqiao");
statement.setString(2,"123456");
ResultSet resultSet = statement.executeQuery();
  • 优势一:可以防止SQL注入,更安全
  • SQL注入:通过控制输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法
  • 优势二:性能更高

预编译SQL

后端 预编译SQL
许可协议:  CC BY 4.0
分享

相关文章

下一篇

Nginx

上一篇

分层解耦

最近更新

  • Hello Halo
  • 状态机
  • 数据表设计规范
  • 缓存优化
  • 事务失效

热门标签

Halo 异常处理 Redisson 并行 Vue 并发 递归 请求限流 SpringAMQP 类加载器

目录

©2026 Norlcayn的博客. 保留部分权利。

使用 Halo 主题 Chirpy