使用jdbc编写查询框架


一、使用jdbc编写查询框架

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

在DBManager类中-------------------此类是一个数据库连接池和框架类

public class DBManager {

 

    private static DataSource ds=null;

    //加载配置文件

    static{

       InputStream in=DBManager.class.getClassLoader().getResourceAsStream("config/dbcp.properties");

       //映射类型的集合,用来存放读取出来的键值对

       Properties p=new Properties();

       try {

           p.load(in);

           //通过配置文件构建数据库连接池

           ds=BasicDataSourceFactory.createDataSource(p);

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

    }

    public static Connection getconnConnection() throws SQLException{

      

       return ds.getConnection();

    }

    //归还到数据库连接池中

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

       if (rs != null)

           try {

              rs.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

       if (st != null)

           try {

              st.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

       if (con != null)

           try {

              con.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

    }

    //进行代码优化

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

 

       Connection con=null;

       PreparedStatement st=null;

       ResultSet rs=null;

      

       try {

           con=DBManager.getconnConnection();

           st=con.prepareStatement(sql);

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

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

           }

           st.executeUpdate();

       } catch (SQLException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }finally{

           DBManager.release(con, st, rs);

       }

      

    }

   

    public static Object find(String sql,Object []params,ResultSetHandlerrsh) throws SQLException{

      

       Connection con=null;

       PreparedStatement st=null;

       ResultSet rs=null;

       

       try {

           con=DBManager.getconnConnection();

           st=con.prepareStatement(sql);

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

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

           }

           rs=st.executeQuery();

           return rsh.handler(rs);

       }finally{

           DBManager.release(con, st, rs);

       }

      

    }

}

由于不知道程序员是怎么处理结果集的,所以将结果集的操作封装到一个接口中

如下:

 

public interface ResultSetHandler {

 

        public Object  handler(ResultSet rs);

}

实现接口的类处理结果集

public class BeanListHandler implements ResultSetHandler {

 

    private Class clazz;

    public BeanListHandler(Class clazz){

       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 name=meta.getColumnName(i);

                  Object value=rs.getObject(name);

                  Field f=clazz.getDeclaredField(name);

                  f.setAccessible(true);

                  f.set(bean, value);

              }

              //把bean对象加入到list集合中

              list.add(bean);

           }

          

       return list;

 

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           throw new RuntimeException(e);

       }

    }

 

}

 

在userDaoImpl中调用此方法:

public void insert(){

QueryRunner runner=new QueryRunner(DBManagaer_c3p0.datasource());

String sql="insert into users(name,password) values('pp','1111')";

    try {

           runner.update(sql);

    } catch (SQLException e) {

       // TODO Auto-generatedcatch block

       e.printStackTrace();

    }

   

}

下载前必看:https://pan.quark.cn/s/a4b39357ea24 在本资料中,将阐述如何运用JavaScript达成单击下拉列表框选定选项后即时转向对应页面的功能。 此种技术适用于网页布局中用户需迅速选取并转向不同页面的情形,诸如网站导航栏或内容目录等场景。 达成此功能,能够显著改善用户交互体验,精简用户的操作流程。 我们须熟悉HTML里的`<select>`组件,该组件用于构建一个选择列表。 用户可从中选定一项,并可引发一个事件来响应用户的这一选择动作。 在本次实例中,我们借助`onchange`事件监听器来实现当用户在下拉列表框中选定某个选项时,页面能自动转向该选项关联的链接地址。 JavaScript里的`window.location`属性旨在获取或设定浏览器当前载入页面的网址,通过变更该属性的值,能够实现页面的转向。 在本次实例的实现方案里,运用了`eval()`函数来动态执行字符串表达式,这在现代的JavaScript开发实践中通常不被推荐使用,因为它可能诱发安全问题及难以排错的错误。 然而,为了本例的简化展示,我们暂时搁置这一问题,因为在更复杂的实际应用中,可选用其他方法,例如ES6中的模板字符串或其他函数来安全地构建和执行字符串。 具体到本例的代码实现,`MM_jumpMenu`函数负责处理转向逻辑。 它接收三个参数:`targ`、`selObj`和`restore`。 其中`targ`代表要转向的页面,`selObj`是触发事件的下拉列表框对象,`restore`是标志位,用以指示是否需在转向后将下拉列表框的选项恢复至默认的提示项。 函数的实现通过获取`selObj`中当前选定的`selectedIndex`对应的`value`属性值,并将其赋予`...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值