当前位置: 首页 > news >正文

JDBC入门:Java连接数据库全指南

JDBC简介

JDBC(Java Database Connectivity)是 Java 语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。它允许开发者使用纯 Java 代码与各种关系型数据库进行交互。

JDBC连接数据库的基本流程

  1. 加载数据库驱动:
    DriverManager.registerDriver(new Driver());
    // 或者
    Class.forName("com.mysql.jdbc.Driver");
  2. 建立数据库连接:
    conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "root");
  3. 创建Statement对象:
    stmt = conn.createStatement();
  4. 执行SQL语句:
    String sql = "select * from t_user";
    rs = stmt.executeQuery(sql);
  5. 处理结果集:
    while(rs.next()){int id = rs.getInt("id");String username = rs.getString("username");String password = rs.getString("password");String email = rs.getString("email");System.out.println(id+"-"+username+"-"+password+"-"+email);
    }
  6. 释放资源(按创建顺序的逆序关闭):
    rs.close();
    stmt.close();
    conn.close();


JDBC工具类封装

基础工具类封装

这是最简单的工具类封装,包含了加载驱动、获取连接、创建 Statement 和关闭资源的基本方法。

public class JdbcUtils3 {public static void loadDrive(){try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConntion(){loadDrive();Connection connection = null;try {connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");} catch (SQLException e) {e.printStackTrace();}return connection;}public static Statement creatstmt() throws SQLException {Connection conntion = getConntion();Statement statement = conntion.createStatement();return statement;}public static void close(ResultSet rs, Statement stmt, Connection conn){try {rs.close();stmt.close();conn.close();}catch (Exception e){e.printStackTrace();}}
}

使用属性文件配置的工具类

public class JdbcUtils {private static final String driverclass;private static final String url;private static final String username;private static final String password;static{Properties pro = new Properties();InputStream inputStream = JdbcUtils.class.getResourceAsStream("/db.properties");try {pro.load(inputStream);} catch (IOException e) {e.printStackTrace();}driverclass = pro.getProperty("driverclass");url = pro.getProperty("url");username = pro.getProperty("username");password = pro.getProperty("password");}// 其他方法...
}

对应的db.properties文件内容:

driverclass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=root

使用连接池的工具类

在实际应用中,使用连接池可以显著提高性能。这里使用了 Druid 连接池:

public class JdbcUtils2 {private static DataSource DATA_SOURCE;static{Properties pro = new Properties();InputStream inputStream = JdbcUtils2.class.getResourceAsStream("/druid.properties");try {pro.load(inputStream);DATA_SOURCE = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection(){Connection conn = null;try {conn = DATA_SOURCE.getConnection();} catch (SQLException e) {e.printStackTrace();}return conn;}// 其他方法...
}

对应的druid.properties文件需要配置连接池相关参数。

SQL注入问题与规范

SQL注入问题演示

注意:此时是正确的用户名和密码是aaa,“123”

public String login(String username,String password){// ...String sql = "select * from t_user where username = '"+username+"' and password = '"+password+"'";stmt = conn.createStatement();rs = stmt.executeQuery(sql);// ...
}

当传入username = “aaa ‘or’ 1=1”和任意密码时,SQL语句会变成:

select * from t_user where username = 'aaa' or '1=1' and password = '12309809'

由于‘1=1’恒为真,且在sql语句中“and”的优先级比“or”更高,所以攻击者可以绕过密码验证直接登录成功。

使用preparedStatement防范SQL注入

public String login2(String username,String password){// ...String sql = "select * from t_user where username = ? and password = ?";stmt = conn.prepareStatement(sql);stmt.setString(1,username);stmt.setString(2,password);rs = stmt.executeQuery();// ...
}

PreparedStatement 通过预编译 SQL 语句和使用参数化查询,有效防止了 SQL 注入:

  1. SQL语句先被编译,语法结构固定
  2. 参数值通过set方法设置,会被当做普通值处理,不会解释为SQL语法
  3. 即使传入恶意参数,数据库也会将其视为普通字符串

最佳实践建议

  1. 始终使用PreparedStatement而不是Statement,防止SQL注入
  2. 使用连接池管理数据库连接,提高性能
  3. 将配置信息外置到属性文件中,便于维护
  4. 规范资源释放,确保数据库连接等资源被正确关闭
  5. 处理异常,提供有意义的错误信息
  6. 考虑使用ORM框架(如Mybatis、Hibernate)简化JDBC操作

总结

JDBC 是 Java 操作数据库的基础,掌握其核心流程、工具类封装和 SQL 注入防范是每个 Java 开发者的必备技能。通过合理封装工具类和使用连接池,可以显著提高代码质量和应用性能。而 PreparedStatement 的使用则是防范 SQL 注入的关键措施。

在实际项目中,虽然我们通常会使用更高级的持久层框架,但理解 JDBC 底层原理对于排查问题和优化性能仍然非常重要。

http://www.lryc.cn/news/575809.html

相关文章:

  • AI辅助编写前端VUE应用流程
  • 树状dp(dfs)(一道挺基础的)
  • Spring Boot 项目问题:while constructing a mapping found duplicate key api
  • 微信小程序封装loading 修改
  • 常见网络安全威胁和防御措施
  • 智能实验室革命:Deepoc大模型驱动全自动化科研新生态
  • HTML简介,初步了解HTML
  • SQl中多使用EXISTS导致多查出了一条不符合条件的数据
  • 教程 | 一键批量下载 Dify「Markdown 转 Docx」生成的 Word 文件(附源码)
  • 【Linux】基础开发工具(2)
  • 操作系统面试知识点(1):操作系统基础
  • CyberGlove触觉反馈手套遥操作机器人灵巧手解决方案
  • Kotlin环境搭建与基础语法入门
  • 大厂测开实习和小厂开发实习怎么选
  • 华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)
  • linux网络编程socket套接字
  • mysql无法启动的数据库迁移
  • WebSocket 与 HTTP 的区别及 Spring Boot 实战应用
  • [AI]从0到1通过神经网络训练模型
  • 128K 长文本处理实战:腾讯混元 + 云函数 SCF 构建 PDF 摘要生成器
  • C++智能指针概念及std::unique_ptr使用介绍
  • 【办公类-105-01】20250626 托小班报名表-条件格式-判断双胞胎EXCLE
  • CNN不是一个模型?
  • 跨越十年的C++演进:C++14新特性全解析
  • C++(模板与容器)
  • Java--程序控制结构(下)
  • springcloud 尚硅谷 看到9开头
  • NebulaGraph 图数据库介绍
  • 一分钟了解Transformer
  • 缓存与加速技术实践-MongoDB数据库应用