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)了解更多。