Java里头数据库那些事儿全展开讲,几乎涵盖所有常用的库和操作细节
- 问答
- 2026-01-03 18:54:56
- 23
说到Java里头操作数据库,那几乎就离不开JDBC这个东西,你可以把JDBC想象成Java官方提供的一座“桥梁”(来源:Oracle官方JDBC文档),这座桥的一头连着你的Java程序,另一头连着各种各样的数据库,比如MySQL、PostgreSQL、Oracle数据库等等,如果没有这座桥,你的Java代码就没法和数据库说上话。
那怎么用这座桥呢?第一步,你得告诉程序桥在哪里,也就是“加载数据库驱动”,比如你用MySQL,你就得先弄一个叫mysql-connector-java的JAR包放到你的项目里,然后在代码里写一句Class.forName("com.mysql.cj.jdbc.Driver"),这句话的意思就是让Java虚拟机去找到并加载MySQL这座“桥”的驱动程序(来源:MySQL Connector/J文档),现在新版本的JDBC有时候能自动帮你加载,但知道这个原理没坏处。
桥接好了,下一步就是要过桥去连接数据库了,这时候你需要一个叫Connection的对象,怎么得到它呢?你得用一个叫DriverManager的工具类,并告诉它数据库的“地址”、“用户名”和“密码”,这个地址有个固定的写法,叫做JDBC URL,比如连本地MySQL的一个叫test_db的数据库,地址就长这样:jdbc:mysql://localhost:3306/test_db?serverTimezone=UTC。localhost是本地机器,3306是MySQL默认的端口号,后面的serverTimezone参数是为了避免时区报错加的(来源:常见的数据库连接问题排查指南),这样,你就能拿到一个活的Connection对象,它代表了一条和数据库的“网络连接”,这是个很宝贵的资源,用完了记得一定要关闭。
连接建立后,你就可以和数据库对话了,对话需要个“话筒”,这个话筒就是Statement对象,你通过connection.createStatement()创造一个话筒,然后就可以对着话筒“说”SQL语句了,比如SELECT * FROM users,说完后,数据库会给你回应,如果你的SQL是查询语句,回应就是一表格的数据,你需要用一个叫ResultSet的对象来接住它,它就像是个能一行一行读取数据的游标(来源:Java™ Tutorials by Oracle),你可以用next()方法移动到下一行,然后用getString("name")、getInt("id")这样的方法取出每一列的值。

但直接用Statement有个大问题,SQL注入”攻击,比如你拼接SQL字符串时,如果用户输入了一些恶意的字符,就可能篡改你的SQL语义,非常危险,现在大家基本都用它的升级版——PreparedStatement(预编译语句),它就像是先把你要说的话写成一个带问号的模板,比如SELECT * FROM users WHERE username = ? AND password = ?,然后再把具体的参数设置进去,这样做有两个天大的好处:第一,数据库会先编译这个模板,之后无论参数怎么变,效率都很高;第二,它能自动处理参数里的特殊字符,从根本上杜绝了SQL注入的风险(来源:《Effective Java》和各类安全编程规范),记住,只要SQL里有参数,就无脑用PreparedStatement。
当你执行INSERT、UPDATE、DELETE这种不返回结果集的语句时,用的是executeUpdate()方法,它会返回一个整数,告诉你这条操作影响了多少行数据。
非常重要的一点是“事务”,默认情况下,JDBC是“自动提交”的,意思是每执行一条SQL,就立刻永久地更新到数据库,这在实际业务中很危险,比如你要转账,扣了A的钱,还没加给B,程序崩溃了,钱就没了,所以我们需要手动管理事务,首先用connection.setAutoCommit(false)关闭自动提交,然后把你的一系列操作(比如先扣钱,再加钱)都执行完,如果全部成功,就调用connection.commit()提交事务,让所有更改生效;如果中间任何一步出错,就调用connection.rollback()回滚事务,让数据库恢复到这批操作之前的状态,就像什么都没发生过一样(来源:数据库事务ACID原理讲解)。

光用JDBC很麻烦,要写很多重复的代码(打开连接、创建语句、处理异常、关闭资源),所以后来出现了很多工具来简化它,最著名的就是ORM框架,比如Hibernate和MyBatis(来源:各类开源框架官方文档)。
Hibernate的理念是让你几乎不用写SQL,它把数据库的表直接映射成Java对象(Entity),你只需要操作Java对象,比如user.setName("张三"),然后调用session.save(user),Hibernate就会在背后自动生成SQL语句并把数据存进数据库,这叫做“对象关系映射”,让你用面向对象的方式玩数据库,开发效率很高。
MyBatis走了另一条路,它不回避SQL,反而认为SQL很强大,应该由开发者灵活控制,它让你把SQL语句写在XML配置文件里或者用注解标注,然后MyBatis帮你把Java对象和SQL语句的参数、结果集自动映射起来,你既享受了避免JDBC重复代码的便利,又保留了SQL的全部灵活性,所以在复杂查询和性能优化要求高的场景下非常受欢迎。
就是Java操作数据库从底层的JDBC到上层常用框架的一个核心概览,这些东西是Java后端开发每天都要打交道的,理解了它们,就等于拿到了操作数据库的钥匙。
本文由召安青于2026-01-03发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/73866.html
