对数据进行查询操作
前面我们学习了关于JDBC增删改操作,接下来我们学习查询操作,通过前面学习,我们需要考虑查询与其他操作不一样的地方是什么?
查询结果需返回结果集,用类对象充当。
先针对数据库中customers表进行一条查询来理解
public class CustomerForQuery {
public void testQuery1()
{
//连接
Connection coon=null;
PreparedStatement ps=null;
ResultSet resultSet=null;
try {
coon = JDBCUtils.getConnection();
//通过customers表中id号进行查询信息
String sql="select id,name from customers where id=?";
ps = coon.prepareStatement(sql);
//填充占位符,id为1的信息
ps.setObject(1, 1);
//执行,并返回结果集
resultSet = ps.executeQuery();
//处理结果集
if(resultSet.next())//判断结果集下一条是否有数据,如果有数据指针下移
{
//获取当前这条数据的各个字段值
int id=resultSet.getInt(1);
String name=resultSet.getString(2);
//方式:将数据封装成一个对象
Customer customer=new Customer(id,name);
System.out.println(customer);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
//关闭资源
JDBCUtils.closeResource(coon, ps,resultSet);
}
//下面代码为关闭资源重写,我们需对ResuleSet进行关闭
}
public static void closeResource(Connection coon,PreparedStatement ps,ResultSet rs)
{
try {
if(ps!=null)
ps.close();
}catch(SQLException e)
{
e.printStackTrace();
}
try {
if(coon!=null)
coon.close();
}catch(SQLException e)
{
e.printStackTrace();
}
try {
if(rs!=null)
rs.close();
}catch(SQLException e)
{
e.printStackTrace();
}
}
//创建CustomerJava.bean将数据进行封装
public class Customer {
private int id;
private String name;
public Customer()
{
super();
}
public Customer(int id,String name)
{
super();
this.id=id;
this.name=name;
}
public void setId(int id)
{
this.id=id;
}
public int getId()
{
return id;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public String toString()
{
return "Customer[id="+id+",name="+name+"";
}
}
这是我们对customers表中id为1的数据进行展示,通过学习我们也会了解此方法并不通用,接下来我们继续优化。
通用查找代码块
通用就是下次查询时,我们需要查的字段可能不一样,这里就需改进。
public Customer queryForCustomers(String sql,Object...args) {
Connection coon=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
coon = JDBCUtils.getConnection();
ps = coon.prepareStatement(sql);
for(int i=0;i<args.length;i++)
{
ps.setObject(i+1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData
ResultSetMetaData rsmd=(ResultSetMetaData) rs.getMetaData();
//获取结果集中列数
int columnCount=rsmd.getColumnCount();
if(rs.next())//表示对接到数据库中表的每一行
{
Customer cust=new Customer();
for(int i=0;i<columnCount;i++)
{
//列的值
Object columValue=rs.getObject(i+1);
//获取每个列的列名
String columnName=rsmd.getColumnName(i+1);
//给cust对象指定的columnNane属性赋值给columnvalue,通过反射
java.lang.reflect.Field field=Customer.class.getDeclaredField(columnName);
((java.lang.reflect.Field) field).setAccessible(true);
field.set(cust,columValue);
}
return cust;
}
} catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
JDBCUtils.closeResource(coon,ps,rs);
}
return null;
}
//测试public void test()
{
//查找id为1 的信息
String sql="select id,name from customers where id=?";
Customer customer=queryForCustomers(sql,1);
System.out.println(customer);
//查找名字为周杰伦的信息
sql="select id,name from customers where name=?";
Customer customer1=queryForCustomers(sql,"周杰伦");
System.out.println(customer1);
}