当前位置:首页 > 问答 > 正文

怎么快速搞懂Java代码里数据库到底咋查的,简单点教你看数据库连接和操作

想搞懂Java代码里数据库到底咋查的,你不用慌,这事儿说白了就是“派个人(Java程序)去图书馆(数据库)按你的要求找本书(数据)”,你只要学会看这个人是怎么出发、怎么问问题、怎么把书拿回来的就行,下面我用最白的话给你拆开讲。

第一步:先找到“派谁去的”和“图书馆地址”(数据库连接)

代码里不会直接写“喂,你去图书馆”,它得先指定一个人,并且告诉他图书馆在哪儿,这就是数据库连接,你一般在代码里会看到类似这样的东西:

String url = "jdbc:mysql://localhost:3306/my_database"; String username = "root"; String password = "123456";

  • url(网址): 这就是“图书馆地址”。jdbc:mysql:// 是说“我们用的是JDBC这个标准,去访问MySQL这种类型的数据库”。localhost:3306 是图书馆的具体位置,localhost就是你自己的电脑,3306是MySQL图书馆通常开的门牌号。/my_database 是图书馆里某个特定阅览室(数据库名)的名字。
  • usernamepassword(用户名和密码): 这是进入图书馆需要的借书证和密码,没这个,门卫不让进。

有时候你会看到这些信息不是直接写死的,而是放在一个叫properties的配置文件里,代码再去读,道理一样,就是怕把密码写在代码里不安全,换地方的时候方便。

代码会用这些信息去“找人”,也就是获取一个Connection对象,你会看到这样一行:

Connection conn = DriverManager.getConnection(url, username, password);

这行代码干的事就是:司机管理器(DriverManager)根据你给的地址和账号密码,成功派出了一个叫conn的信使(连接对象),这个信使已经站在图书馆门口,准备帮你办事了。

第二步:看“信使怎么问问题”(创建和执行SQL语句)

信使到了图书馆,不能瞎找,你得告诉他具体找什么,这就是写SQL语句,SQL就是一种向数据库提问的标准语言。

你会看到代码里先创建一个“提问单”(StatementPreparedStatement对象),简单查询可能直接用Statement

Statement stmt = conn.createStatement(); String sql = "SELECT id, name, age FROM users WHERE age > 18"; ResultSet rs = stmt.executeQuery(sql);

我来一句句说:

  • conn.createStatement():信使conn从口袋里掏出一张空白的提问单stmt
  • String sql = "SELECT ...":你在提问单上写下具体问题:“从users这个书架上,找出所有age(年龄)大于18的书(记录),并且只把书的idnameage这三栏信息给我看。” SELECT查找”的意思。FROM指定从哪个书架找。WHERE是筛选条件。
  • stmt.executeQuery(sql):信使stmt拿着你写好的提问单sql,进去执行查询,注意这里是executeQuery,因为你是去“查询”数据。

更常见、更安全的是用PreparedStatement(预编译的提问单),长这样:

String sql = "SELECT * FROM users WHERE name = ? AND password = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "张三"); pstmt.setString(2, "mypassword"); ResultSet rs = pstmt.executeQuery();

这里的关键是那个问号。

  • 你先写好一个带问号的模板问题:“找用户,条件是名字等于?并且密码等于?”
  • 然后信使pstmt会先把这个模板交给图书馆管理员“预习”一下(预编译)。
  • 接着你用pstmt.setString(1, "张三")把第一个问号替换成“张三”,用setString(2, "mypassword")把第二个问号替换成密码。
  • 最后执行pstmt.executeQuery()

为什么这样更好?第一,防SQL注入攻击(比如有人恶意输入密码为' OR '1'='1,如果用普通Statement拼接字符串就会出安全问题,但PreparedStatement的问号机制能堵住这个漏洞),第二,如果同一个问题要问很多次(只是参数不同),效率更高。

如果是增(INSERT)、删(DELETE)、改(UPDATE)操作,用的就不是executeQuery()了,而是executeUpdate(),它会返回一个数字,表示影响了多少行数据。

第三步:看“信使怎么把结果带回来”(处理结果集)

信使问完问题,不会空手回来,他会抱回来一摞符合要求的文件,在代码里,这个“一摞文件”就是ResultSet对象,通常叫rs

结果集rs像一张表格,有行有列,最开始它指在表格第一行之前,你需要用rs.next()方法让它“翻到下一行”(也就是第一行真实数据)。rs.next()就像你用手指一行行往下划拉,如果还有数据,它就返回true,如果已经划拉到最后了,就返回false,所以通常你会看到一个循环:

while (rs.next()) { ... }

意思是:当还能翻到下一行时,就进去处理这一行的数据。

在循环里面,你怎么把每一行的数据取出来呢?根据列名或者列的位置序号来拿。

  • 按列名拿(最常用,一看就懂): int id = rs.getInt("id"); // 取出当前这行,列名为"id"的值,转换成整数 String name = rs.getString("name"); // 取出列名为"name"的值,转换成字符串 int age = rs.getInt("age");

  • 按位置拿(从1开始数): int id = rs.getInt(1); // 取出第一列的值 String name = rs.getString(2); // 取出第二列的值 int age = rs.getInt(3);

取出来的数据,代码后面爱干嘛干嘛,比如打印出来、组装成一个User对象、或者显示在网页上。

第四步:最重要的事——“叫人回来记得关门!”(关闭连接)

信使办完事,不能让他一直在图书馆站着,你得叫他回来,并且把占用的资源(比如网络连接)释放掉,这就是关闭连接,代码里你会看到 finally 块或者 try-with-resources 语法,里面写着:

rs.close(); stmt.close(); conn.close();

这三行就是:先把结果集rs还了,再把提问单stmt撕了,最后让信使conn回家,关闭连接。这个步骤极其重要,不关的话,连接会一直开着,多了以后数据库就“累趴了”,别人也连不上了,现代代码常用 try-with-resources,它能自动帮你关,更省心。

你的侦查路线图:

  1. 找连接信息:在代码里搜jdbc:ConnectiongetConnection,找到数据库地址和账号密码。
  2. 找SQL语句:搜SELECTUPDATEINSERTDELETE,看具体要干啥,特别注意是用Statement还是更安全的PreparedStatement
  3. 看怎么处理结果:搜ResultSetnext()getIntgetString,看取回的数据怎么用。
  4. 确认关了门:搜close(),看看有没有妥善关闭连接。

你就按这个顺序,在Java代码里像侦探一样找这些关键词,然后把它们串起来,整个数据库查询的流程就一清二楚了,别怕,多看几个例子,你就熟了。

怎么快速搞懂Java代码里数据库到底咋查的,简单点教你看数据库连接和操作