使用 元数据简化JDBC代码

使用 元数据简化JDBC代码

首先了解三种元数据

一.元数据- DataBaseMetaData

元数据:数据库、表、列的定义信息。

Connection.getDatabaseMetaData()

DataBaseMetaData对象

a)        getURL():返回一个String类对象,代表数据库的URL。

b)        getUserName():返回连接当前数据库管理系统的用户名。

c)        getDatabaseProductName():返回数据库的产品名称。

d)        getDatabaseProductVersion():返回数据库的版本号。

e)        getDriverName():返回驱动驱动程序的名称。

f)         getDriverVersion():返回驱动程序的版本号。

g)        isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

 

元数据-ParameterMetaData

l  PreparedStatement . getParameterMetaData()

•    获得代表PreparedStatement元数据的ParameterMetaData对象。

•    Select * from user where name=? And password=?

l  ParameterMetaData对象

•    getParameterCount()

•    获得指定参数的个数

•    getParameterType(int param)

获得指定参数的sql类型

元数据-ResultSetMetaData

l  ResultSet. getMetaData()

•    获得代表ResultSet对象元数据的ResultSetMetaData对象。

l  ResultSetMetaData对象

•    getColumnCount()

•    返回resultset对象的列数

•    getColumnName(int column)

•    获得指定列的名称

•     getColumnTypeName(int column)

•    获得指定列的类型

使用元数据简化JDBC代码

l  业务背景:系统中所有实体对象都涉及到基本的CRUD操作:

•    所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。

•    实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。

实例分析:实现增删改查的简化代码

DBManager.Java代码

package com.hbsi.utils;

 

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

 

import javax.sql.DataSource;

 

importorg.apache.commons.dbcp.BasicDataSourceFactory;

 

public class DBManager {

         privatestatic DataSource ds=null;

         static{

                   //返回读取指定资源的输入流

                   InputStreamis=DBManager.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");

                   //创建一个无默认值的空属性列表

                   Propertiesp=new Properties();

                   try{

                            //从输入流中读取属性列表(键和元素对)

                            p.load(is);

                            //工厂模式

                            ds=BasicDataSourceFactory.createDataSource(p);

                   }catch(Exception e) {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                   }

                  

         }

         publicstatic Connection getConnection() throws SQLException{

                   returnds.getConnection();

         }

         publicstatic void release(Connection con,Statement st,ResultSet rs){

                   if(rs!=null){

                            try{

                                     rs.close();

                            }catch(Exception e) {e.printStackTrace();}

                             rs = null;

                   }

                   if(st!=null){

                            try{

                                     st.close();

                            }catch(Exception e) {e.printStackTrace();}

                            st= null;

                   }

                   if(con!=null){

                            try{

                                     con.close();

                            }catch(Exception e) {e.printStackTrace();}

                            con= null;

                   }

         }

        

         publicstatic void update(String sql,Object[] params){

                   //

                   Connectioncon=null;

                   PreparedStatementst=null;

                   ResultSetrs=null;

                  

                   try{

                            con=DBManager.getConnection();

                            st=con.prepareStatement(sql);

                            for(inti=0;i<params.length;i++){

                                     st.setObject(i+1,params[i]);

                            }

                            st.executeUpdate();

                   }catch (SQLException e) {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                   }finally{

                            DBManager.release(con,st, rs);

                   }

         }

        

         publicstatic Object find(String sql,Object[] params,ResultSetHandler rsh) throwsSQLException{

                   //

                   Connectioncon=null;

                   PreparedStatementst=null;

                   ResultSetrs=null;

                  

                   try{

                            con=DBManager.getConnection();

                            st=con.prepareStatement(sql);

                            for(inti=0;i<params.length;i++){

                                     st.setObject(i+1,params[i]);

                            }

                            rs=st.executeQuery();

                            //对结果集的处理.框架的开发者不知道如何处理,框架开发者制定一个规范

                            //只需要调用程序员传过来对结果集进行处理方法

                            returnrsh.handler(rs);

                   }finally{

                            DBManager.release(con,st, rs);

                   }

                  

         }

        

        

        

}

BeanListHAndle.java

package com.hbsi.utils;

 

import java.lang.reflect.Field;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

 

public class BeanListHandle implements ResultSetHandler {

 

    //某种类型

    private Class clazz;

    //传递javaBean类对象Class对象

     public BeanListHandle(Classclazz){

       this.clazz=clazz;

    }

    @Override

    public Object handler(ResultSet rs) {

       List list=new ArrayList();

       try {

           while(rs.next()){

              //读取一行

              //封装到bean对象

              Object bean=clazz.newInstance();

              ResultSetMetaData meta=rs.getMetaData();

              int count=meta.getColumnCount();

              for(int i=1;i<=count;i++){

                  String columnName=meta.getColumnName(i);

                  Object value=rs.getObject(columnName);

                 

                  Field f=clazz.getDeclaredField(columnName);

                  f.setAccessible(true);

                  f.set(bean, value);

              }

              //该bean对象加入list集合

              list.add(bean);

           }

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           throw new RuntimeException(e);

       }

       return list;

    }

 

}

UserDaoImpl.java

package com.hbsi.dao;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Date;

import java.util.List;

 

import com.hbsi.domain.User;

import com.hbsi.utils.BeanHandler;

import com.hbsi.utils.BeanListHandle;

import com.hbsi.utils.DBManager;

 

public class UserDaoImpl {

        

         publicvoid insert() throws SQLException{

//               Connectioncon=null;

//               PreparedStatementst=null;

//               ResultSetrs=null;

//              

//               con=DBManager.getConnection();

//               Stringsql = "insert into users(id,name,password,email,birthday)values(?,?,?,?,?)";

//               st=con.prepareStatement(sql);

//               st.setInt(1,6);

//               st.setString(2,"xxxx");

//               st.setString(3,"1111");

//               st.setString(4,"aa@sina.com");

//               st.setDate(5,newjava.sql.Date(new Date().getTime()));

//               st.executeUpdate(sql);            

                   Stringsql = "insert into users(id,name,password,email,birthday)values(?,?,?,?,?)";

                   Object[]params={9,"xxx","1111","xxx@126.com",new Date()};

                   DBManager.update(sql,params);

         }

        

         publicvoid delete() throws SQLException{

//          Connection con=null;

//               PreparedStatementst=null;

//               ResultSetrs=null;

//               con=DBManager.getConnection();

//               Stringsql = "delete from users where id=?";

//               st=con.prepareStatement(sql);

//               st.setInt(1,1);

//               st.executeUpdate();        

                   Stringsql = "delete from users where id=?";

                   Object[]params={4};

                   DBManager.update(sql,params);

                  

         }

         publicvoid update() throws SQLException{

//               Connectioncon=null;

//               PreparedStatementst=null;

//               ResultSetrs=null;

//               con=DBManager.getConnection();

//               Stringsql="update users set name=? password=? where id=?";

//               st.setString(1,"MAKE");

//               st.setString(2,"111");

//               st.setInt(3,5);

//               st.executeUpdate();

                   Stringsql="update users set name=?,password=? where id=?";

                   Object[]params={"qqq","1111",5};

                   DBManager.update(sql,params);

         }

         //DBManager写一个方法update(Stringsql,Object[] param)

         publicvoid find() throws SQLException{

//               Connectioncon=null;

//               PreparedStatementst=null;

//               ResultSetrs=null;

//               con=DBManager.getConnection();

//               Stringsql="update users set name=? password=? where id=?";

//               st.setString(1,"MAKE");

//               st.setString(2,"111");

//               st.setInt(3,5);

//               st.executeUpdate();

                   Stringsql="select * from user where id=?";

                   Object[]params={1};

                   //MyResultsetHAndlerrsh=new MyResultsetHAndler();

                   BeanHandlerrsh=new BeanHandler(User.class);

                   Useruser=(User) DBManager.find(sql, params,rsh);

                   System.out.println(user.getId()+""+user.getName());

         }

         publicList findAll(){

                   Listlist=null;

                   Stringsql="select * from user";

                   Object[] params={};

                   BeanListHandlersh=new BeanListHandle(User.class);

                    try {

                            list= (List)DBManager.find(sql, params, rsh);

                   }catch (SQLException e) {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                   }

                   returnlist;

         }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值