回顾
上一篇文章总结了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表有用,其他表也可以。