JavaWeb基础篇(八)--JDBC自定义工具类

代码中的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());

 

猜你喜欢

转载自blog.csdn.net/weixin_43815050/article/details/87630389
今日推荐