连接池,元数据与jdbc框架

连接池,元数据与jdbc框架

一、JNDI技术

1JNDI(Java Naming and DirectoryInterface)Java命名和目录接口,它对应于J2SE中的javax.naming包,

2、这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。

3、其核心APIContext,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。

4、代码:

context.xml

<Context>

<Resourcename="jdbc/testDB"(可以是任意的名字)

auth="Container"

type="javax.sql.DataSource"

username="root"

password="root"

driverClassName="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3306/test"

maxActive="8"

maxIdle="4"/>

</Context>

Servlet

try {

           //初始化jndi容器

           InitialContext initCxt = newInitialContext();

           //检索出web服务器中的jndi容器

           Context envCxt=(Context)initCxt.lookup("java:comp/env");

           DataSource ds=(DataSource)envCxt.lookup("jdbc/testDB");//jndi容器查找资源

            Connection conn=ds.getConnection();

            System.out.println(conn);

        } catch(Exception e) {

           e.printStackTrace();

        }

    }

二、元数据(数据库、表、列的定义信息)

1、 数据库元数据:DataBaseMetaData

1)通过Connection.getDatabaseMetaData()得到DataBaseMetaData对象,然后在调用其方法。

2)对象的方法:

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

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

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

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

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

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

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

2、参数元数据:ParameterMetaData

(1)通过PreparedStatement .getParameterMetaData()获得代表PreparedStatement元数据的ParameterMetaData对象。编写sql语句,调用相应方法。

(2)ParameterMetaData对象方法:

getParameterCount():获得指定参数的个数

getParameterType(int param):获得指定参数的sql类型

3、结果集元数据:ResultSetMetaData

(1)通过ResultSet. getMetaData()获得代表ResultSet对象元数据的ResultSetMetaData对象,调用相应的方法。

(2)ResultSetMetaData对象的方法:

getColumnCount():返回resultset对象的列数

getColumnName(int column):获得指定列的名称

getColumnTypeName(int column):获得指定列的类型

三、使用元数据简化JDBC代码

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

代码说明:

//优化CUD模板

  publicstaticvoidupdate(String sql,Object[] params){

      Connection conn=null;

      PreparedStatement st=null;

      try {

          conn=DBManager_c3p0.getConnection();

          st=conn.prepareStatement(sql);

         

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

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

          }

          st.executeUpdate();

      } catch(SQLException e) {

          // TODOAuto-generated catch block

          e.printStackTrace();

      }finally{

          DBManager_c3p0.closeDB(conn,st, null);

        }

插入代码: 

publicvoidinsert(){

        String sql="insert intoadmin(id,name,pass)value(?,?,?)";

        Object[]params={17,"abc","abcd"};

        DBManager_c3p0.update(sql,params);}

更新语句:

        Public void update(){

        String sql="update adminset name=?,pass=? where id=?";

        Object[]params={"aaa","aaa",17};

        DBManager_c3p0.update(sql,params);}

删除语句:

        publicvoiddelete(){

        String sql="delete fromadmin where id=?";

        Object[]params={17};

        DBManager_c3p0.update(sql,params);}

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

代码说明:

//优化R模板

        publicstaticObject query(String sql,Object[] params,ResultSetHandler h){

           Connectionconn=null;

           PreparedStatementst=null;

           ResultSetrs=null;

           try {

               conn=DBManager_c3p0.getConnection();

               st=conn.prepareStatement(sql);

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

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

               }

               rs=st.executeQuery();

               //调用接口,将结果集传给handler方法自己处理

               returnh.handler(rs);

           }catch (SQLException e) {

               thrownewRuntimeException(e);

           }finally{

               DBManager_c3p0.closeDB(conn,st, rs);

           }

  }

处理器中的代码:

publicclassBeanHandlerimplements ResultSetHandler {

    private Class clazz;

    public BeanHandler(Classclazz){

        this.clazz=clazz;

    }

    public Objecthandler(ResultSet rs) {

        //要把结果集封装到bean

        try{

           if(!rs.next()){

               returnnull;

           }

           //实例化一个对象

           Object bean=clazz.newInstance();

           //将结果集rs赋到bean对象中

ResultSetMetaDatameta=rs.getMetaData();//获取结果集里的信息(元数据)

           //获取列数

           intcount=meta.getColumnCount();

           for(inti=0;i<count;i++){

               //用循环将字段名取出

               StringcolumnName=meta.getColumnName(i+1);

               //从结果集里取值

               Objectvalue=rs.getObject(columnName);

               //将值赋给bean中对应的属性

               Fieldf=bean.getClass().getDeclaredField(columnName);//反射bean上与列名相对应得属性

               f.setAccessible(true);

               f.set(bean,value);

           }

           returnbean;

        }catch(Exceptione){

           thrownewRuntimeException(e);

        }

    }

接口代码:

publicinterfaceResultSetHandler {

  public Objecthandler(ResultSet rs);}

查询语句代码:

publicvoidfind(){

        String sql="selectid,name,pass from admin where id=?";

        Object []params={1};

        Admin admin=(Admin) DBManager_c3p0.query(sql,params,new BeanHandler(Admin.class));

System.out.println(admin.getId()+".."+admin.getName()+".."+admin.getPass());}

注意:此外还要编写bean文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值