详解JDBC查询操作

6 篇文章 1 订阅
4 篇文章 0 订阅

回顾

上一篇文章总结了JDBC连接数据库,操作数据库(增删改查),关闭连接的过程。这里把查询数据库的操作更详细说明。

JavaBean介绍

JavaBean是一种Java语言编写的可重用组件,其实就是一种特殊的Java类。遵循下面编程规则的都可以被称作JavaBean:

  • 所有属性为private
  • 有一个public的无参构造器
  • 提供public的getter和setter,并且方法命名遵循命名规范
  • 类可序列化,比如实现Serializable接口

ORM思想

ORM(Object Relational Mapping),作用即使在关系型数据库和对象之间做一个映射。
具体表现为:

  • 一张数据表对应一个Java类
  • 表中的一条记录对应Java类中的一个对象
  • 表中的一个字段对应Java类中的一个属性

JDBC的查询操作

创建一个stuinfo类。

//Stuinfo.java
public class Stuinfo {
    private String name;
    private String password;

    public Stuinfo() {

    }

    public Stuinfo(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Stuinfo{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

写一个针对stuinfo表通用的查询操作,并测试。

//RetrieveTest.java

import org.junit.Test;

import java.lang.reflect.Field;
import java.sql.*;

public class RetrieveTest {
    public Stuinfo retrieveStuinfo(String sql, Object... args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            //填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            rs = ps.executeQuery();
            //这里只返回一条数据
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnCount = rsmd.getColumnCount();
            if (rs.next()) {
                Stuinfo stu = new Stuinfo();
                for (int i = 0; i < columnCount; i++) {
                    Object value = rs.getObject(i + 1);
                    //获取列名
                    String columbLabel = rsmd.getColumnLabel(i + 1);
                    //通过反射给stu对象指定的属性赋值
                    Field field = Stuinfo.class.getDeclaredField(columbLabel);
                    field.setAccessible(true);
                    field.set(stu, value);
                }
                return stu;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(conn, ps, rs);
        }
        return null;
    }

    @Test
    public void test() {
        String sql = "select name, password from stuinfo where name=?";
        Stuinfo stu = retrieveStuinfo(sql, "liu");
        System.out.println(stu);
    }
}

测试结果

Stuinfo{name='liu', password='456'}

后记

  • 这里只是演示了查询一条记录,如果是多条记录,可以用List。
  • 可以用泛型写更加普适的方法,不仅对stuinfo表有用,其他表也可以。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值