9.29JavaWeb之PreparedStatement针对测试表的操作
针对order表的常规操作流程
@Test
public void testQueryNo1() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取连接
conn = JDBCUtils.getConnection();
//执行语句
String sql = "select `order_id`,`order_name`,`order_date` from `order` where `order_id` = ?;";
ps = conn.prepareStatement(sql);
//填充占位符
ps.setObject(1, 3);
//执行查询
rs = ps.executeQuery();
//读取内容
if (rs.next()) {
/*获取每一列上的具体的值*/
//因为获取三次所以不需要获取元数据
int id = (int) rs.getObject(1);
String name = (String) rs.getObject(2);
Date date = (Date) rs.getObject(3);
/*new一个对象,封装获取到的信息然后返回*/
Order order = new Order(id, name, date);
System.out.println(order);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtils.closeResource(conn, ps, rs);
}
}
针对order表的通用操作流程
需求:
-
传入
sql
-
根据
字段
动态生成需要查询的字段
@Test
public Order orderForQuery(String sql, Object ...args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取连接
conn = JDBCUtils.getConnection();
//预编译sql
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()) {
Order order = new Order();
//元数据获取每一个列的列值--->次数取决于列个数
for (int j=0; j<columnCount; j++) {
//通过结果集获取列值--->结果集:ResultSet
Object columnValue = rs.getObject(j+1);
//获取每个列的列名--->通过结果集的元数据获取列值--->结果集的元数据:ResultSetMetaData
// String columnName = rsmd.getColumnName(j+1); --->不推荐使用
//获取列的别名--->如果没有起别名直接获取到列名--->该方法针对于表的字段名和类的属性名不一致的情况,写sql的时候必须使用类的属性名来命名字段的别名
String columnLabel = rsmd.getColumnLabel(j+1);
//通过反射将对象指定成员名的赋予指定的值--->columnName赋值columnValue
//反射加载类--->注意属性名和数据库的字段名不一致--->使用结果集将数据库的字段名转换成属性相同的名
/*
1、通过sql查询的时候直接将字段名转成与属性相同的别名
2、不要使用getColumnName方法,该方法是直接获取到列名而非别名
3、使用获取别名的方法来获取别名
*/
Field field = Order.class.getDeclaredField(columnLabel);
//私有的属性也能够访问
field.setAccessible(true);
//给order对象当前该名称的属性赋值为columnVlaue
field.set(order, columnValue);
}
return order;
}
}catch (Exception e){
e.printStackTrace();
}finally {
//资源关闭
JDBCUtils.closeResource(conn, ps, rs);
}
//没进if当中
return null;
}