代码中的MyJdbcUtils_02是另外直线的一个工具类,封装了获取链接和close方法。
一、元数据
1.简介
(1)SUN提供的一些规范,接口。
(2)元数据:可以获取数据库的基本的信息,表,字段的信息,参数的信息。
2.元数据的分类
(1)数据库元数据
(2)参数元数据
(3)结果集元数据
二、元数据分别介绍
1.数据库元数据
(1)DataBaseMetaData -- 数据库元数据
(2)由Connection对象创建数据库元数据
(3)数据库元数据获取的内容?
* 获取url
* 获取username
* 获取驱动的名称
* 获取主键
2.参数元数据
(1)ParameterMetaData --参数元数据
(2)作用:获取SQL语句中?的个数和类型(类型获取的不准确)
(3)PreparedStatement可以获取参数元数据
(4)方法 getParameterCount() -- 获取参数的个数(获取?的个数)
3.结果集元数据
(1)ResultSetMetaData --结果集元数据
(2)作用:获取结果集中的列的信息
(3)由ResultSet创建
(4)方法
* getColumnCount() 返回resultset对象的列数
* getColumnName(int column) 获得指定列的名称
* getColumnTypeName(int column)获得指定列的类型
详情:https://www.jianshu.com/p/36d5d76342f1
三、利用元数据实现一个简单的封装类
1.增删改。
因为基本的结构是很相似的,变化的只有sql语句和一些参数。这部分直接传进来就可以。
public static void update(String sql,Object... obj){
Connection conn = null;
PreparedStatement stmt = null;
conn = MyJdbcUtils_02.getConnection();
try {
stmt = conn.prepareStatement(sql);
//获取sql语句中 ? 的个数
ParameterMetaData metaData = stmt.getParameterMetaData();
//设置值
for(int i=1;i<= metaData.getParameterCount();i++)
{
stmt.setObject(i,obj[i-1]);
}
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
MyJdbcUtils_02.release(stmt,conn);
}
}
(2)调用方法(以插入为例):
String sql = "insert into orders(order_no,p_id) values(?,?);";
MyDBUtils.update(sql,"12580",3);
2.查询
注意:查询的时候,需要将结果集封装后返回。但是这个是变化的,不好实现。可以利用一个接口让用户自己去封装。在查询过程中,只需要调用一个封装的结果即可。
(1)查询方法
/*
用户自己实现 ResultSetHander接口
*/
public static <T>T query(String sql,ResultSetHander<T> rsh,Object... objs){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = MyJdbcUtils_02.getConnection();
stmt = conn.prepareStatement(sql);
//设置参数
ParameterMetaData metaData = stmt.getParameterMetaData();
for(int i=1;i<=metaData.getParameterCount();i++)
{
stmt.setObject(i,objs[i-1]);
}
rs = stmt.executeQuery();
//调用封装的结果
T t = rsh.handler(rs);
return t;
} catch (SQLException e) {
e.printStackTrace();
} finally {
MyJdbcUtils_02.release(rs,stmt,conn);
}
return null;
}
(2)接口
public interface ResultSetHander<T> {
// 用户重写方法,提供封装的方式
public T handler(ResultSet rs) throws SQLException;
}
(3)接口的实现类
class BeanOrders implements ResultSetHander<Orders>{
@Override
public Orders handler(ResultSet rs) throws SQLException {
Orders orders = new Orders();
if(rs.next())
{
orders.setO_id(rs.getInt("o_id"));
orders.setOrder_no(rs.getString("order_no"));
orders.setP_id(rs.getInt("p_id"));
}
return orders;
}
}
class BeanList implements ResultSetHander<List<Orders>>{
@Override
public List<Orders> handler(ResultSet rs) throws SQLException {
List<Orders> list = new ArrayList<Orders>();
if(rs.next())
{
Orders orders = new Orders();
orders.setO_id(rs.getInt("o_id"));
orders.setOrder_no(rs.getString("order_no"));
orders.setP_id(rs.getInt("p_id"));
list.add(orders);
}
return list;
}
}
(4)调用
String sql = "select * from orders where o_id=?;";
Orders orders = MyDBUtils.query(sql,new BeanOrders(),5);
System.out.println(orders.getO_id()+"-"+orders.getOrder_no());
String sql2 = "select * from orders;";
List<Orders> list = MyDBUtils.query(sql2,new BeanList());
System.out.println(list.get(0).getOrder_no());