4天贯通JDBC技术
三、Statement与ResultSet
- 通过调用 Connection 对象的 createStatement 方法创建该对象
- Statement st = conn.createStatement();
- 该对象用于执行静态的 SQL 语句,并且返回执行结果
- Statement 接口中定义了下列方法用于执行 SQL 语句:
- ResultSet excuteQuery(String sql)
- int excuteUpdate(String sql)
//通用的INSSERT UPDATE DELETE方法(version 1.0)
public void update(String sql){
//1.获取数据库的连接
Connection conn = null;
Statement st = null;
try{
conn = JDBCUtils.getConnection();
//2.提供一个Statement对象,将sql传递给数据库中执行
st = conn.createStatement();
st.execute(sql);
}catch(Exception e){
e.printStackTrace();
}finally{
//3.关闭Statement对象及连接
JDBCUtils.close(null, st, conn);
}
}
// 通用的查询方法,返回一个对象(version 1.0)
public <T> T get(String sql, Class<T> clazz) {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
T t = null;
try {
t = clazz.newInstance();
conn = JDBCUtils.getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
/*
* 通过ResultSet调用getMetaData()返回一个结果集的元数据:ResultSetMetaData
*
* 1.getColumnCount():返回结果集的列数
* 2.getColumnLabel():返回列的别名
*/
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
for (int i = 0; i < columnCount; i++) {
Object columnVal = rs.getObject(i + 1);// 相应列的值
//String columnName = rsmd.getColumnName(i + 1);
String columnName = rsmd.getColumnLabel(i + 1);
//使用PropertyUtils将指定对象t的指定属性columnName设置为指定的值columnVal
PropertyUtils.setProperty(t, columnName, columnVal);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, st, conn);
}
return t;
}
//通用的返回多个对象的查询操作(version 1.0)
public <T> List<T> getInstances(String sql,Class<T> clazz){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
try {
conn = JDBCUtils.getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
/*
* 通过ResultSet调用getMetaData()返回一个结果集的元数据:ResultSetMetaData
*
* 1.getColumnCount():返回结果集的列数
* 2.getColumnLabel():返回列的别名
*/
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
T t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
Object columnVal = rs.getObject(i + 1);// 相应列的值
//String columnName = rsmd.getColumnName(i + 1);
String columnName = rsmd.getColumnLabel(i + 1);
//使用PropertyUtils将指定对象t的指定属性columnName设置为指定的值columnVal
PropertyUtils.setProperty(t, columnName, columnVal);
}
list.add(t);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, st, conn);
}
return list;
}
流程
//总结:
两种思想:
- 面向接口编程的思想;
- ORM思想:
* ORM:Object Relational Mapping
* 数据库中的表与java中的一个类对应(如:customers表与Customer类对应)
* 数据库中表的一个列与java类的一个属性对应(如:表中的id列与Customer类的id属性对应)
* 数据库中表的一行(一条数据)与java类的一个对象对应
两个技术:
- 结果集的元数据:ResultSetMetaData;
- PropertyUtils
1.结果集的元数据:ResultSetMetaData
//获取:ResultSet.getMetaData();
//两个方法:1)getColumnCount():获取结果集中有多少列
2)getColumnLabel():获取结果集的相应列的列名,相当于是对应的表的列的别名。
--getColumnName():不用。
public void testResultSetMetaData(){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
String sql = "select order_id id,order_name name,order_date date from `order`";
try{
conn = JDBCUtils.getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
System.out.println(columnCount);
while(rs.next()){
for(int i = 0;i < columnCount;i++){
System.out.print(rsmd.getColumnName(i + 1) + " ");
System.out.print(rsmd.getColumnLabel(i + 1) + " ");
System.out.println(rs.getObject(i + 1));
}
System.out.println();
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.close(rs, st, conn);
}
}
2.PropertyUtils工具类,使用它的setProperty(Object obj,String FieldName,Object FieldValue)
public void testPropertyUtils() throws Exception{
Order order = new Order();
System.out.println(order);
PropertyUtils.setProperty(order, "id", 1001);
PropertyUtils.setProperty(order, "name", "AA");
PropertyUtils.setProperty(order, "date", new Date(new java.util.Date().getTime()));
System.out.println(order);
}
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。