连接池,元数据与jdbc框架

来源:互联网 发布:淘宝文胸打造爆款经验 编辑:程序博客网 时间:2024/05/19 18:42

连接池,元数据与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 Classclazz;

    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文件。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 昆明爱心卡遗失怎么办 换异地户口驾照怎么办 驾照罚款5年没交怎么办 日本签证被拒怎么办 在杭州怎么办日本签证 去日本访友签证怎么办 重庆去日本签证怎么办 申根签证澳洲怎么办 甲方不退保证金怎么办 押金不给退怎么办 在夏门办加急居住证怎么办 学车证明丢失怎么办? 哈尔滨空挂户口怎么办 厦大学生怎么办厦门居住证 厦门网上办理居住证怎么办 宝宝风热咳嗽怎么办 小孩感冒后鼻炎怎么办 小孩感冒引起鼻炎怎么办 婴幼儿喉咙有痰怎么办 驾校的居住证明怎么办 去韩国留学护照怎么办 去韩国签证怎么办d4 出国留学拒签怎么办 高中毕业考不上大学怎么办 深圳怎么办客运营运证 深圳龙岗怎么办居住证 想去日本怎么办签证 孩子没有出生证怎么办通行证 去日本旅游怎么办签证 去美国旅游签证怎么办 我想去泰国怎么办签证 怎么办去泰国的签证 去韩国工作怎么办签证 去越南打工怎么办签证 越南到中国签证怎么办 去越南工作签证怎么办 马来西亚留学签证过期后怎么办 日本留学存款不够怎么办 没有工作单位怎么办签证 深户日本签证怎么办 土耳其跟团签证怎么办