zoukankan      html  css  js  c++  java
  • QueryRunner的使用

    1为什么使用DbUtils

      DbUtils工具类,避免JDBC繁琐,简化开发。DbUtils类主要负责装载驱动、关闭连接的常规工作。

    2QueryRunner

      QreryRunnerDbUtils的核心类,简化SQL查询,使代码量减少。

    2.1常用方法

     1.query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。

     2.query(String sql, Object[] params, ResultSetHandler rsh):方法本身不提供数据库连接,执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。 

     3.query(Connection conn, String sql, ResultSetHandler rsh):执行无需参数的选择查询。

     4.update(Connection conn, String sql, Object[] params):被用来执行插入、更新或删除(DML)操作。

    2.2ResultSetHandler接口

    (org.apache.commons.dbutils.ResultSethandler)执行处理一个结果集对象将数据转变并处理为任何一种形式,供其他应用使用

    常见的实现类

    ArrayHandler:把结果集中的第一行数据转成对象数组。

    ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。

    BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。

    BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

    MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

    MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

    ColumnListHandler:将结果集中某一列的数据存放到List中。

    KeyedHandler(name):将结果集中的每一行数据都封装到一个Map(List<Map>),再把这些map再存到一个map里,其key为指定的列。

    ScalarHandler:将结果集第一行的某一列放到某个对象中。

    使用步骤:

    1.导jar包(链接:https://pan.baidu.com/s/1BMhXYRNcusUDkzsymJn4OQ +提取码:p68w

     2.添加C3P0配置文件--src目录下

    内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
        <default-config>
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql:///newsdb?useUnicode=true&amp;charsetEncoding=UTF-8</property>
            <!-- 数据库的账号和密码 -->
            <property name="user">root</property>
            <property name="password">root</property>
        </default-config>
    </c3p0-config>

    3.创建C3P0数据源连接池工具类DBUtils

    package com.it.util;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import javax.sql.DataSource;
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import com.mysql.jdbc.Statement;
    
    /**
     * C3P0数据源连接池工具类
     * @author ***
     * @date 0000年0月0日
     * @Description
     */
    public class DBUtils {
        // 创建一个ThreadLoacl对象,用当前线程作为key
        private static ThreadLocal<Connection> tl = new ThreadLocal<>();
        // 读取的是C3P0-config默认配置创建数据库连接池对象
        private static DataSource ds = new ComboPooledDataSource();
        
        // 获取数据库连接池对象
        public static DataSource getDs() {
            return ds;
        }
        
        // 从连接池中获取连接
        public static Connection getConnection() {
            Connection conn = tl.get();
            if(conn == null) {
                try {
                    conn = ds.getConnection();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                tl.set(conn);
            }
            return conn;
        }
        
    //    关闭数据库连接
        public static void closeConnection(Connection conn,Statement st,ResultSet rs) {
            try {
                if(conn != null) {
                    conn.close();
                }
                if(st != null) {
                    st.close();
                }
                if(rs != null) {
                    rs.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        // 开启事务
        public static void startTranscation() {
            Connection conn = getConnection();
            try {
                /*
                 * setAutoCommit总的来说就是保持数据的完整性,一个系统的更新操作可能要涉及多张表,需多个SQL语句进行操作
                 * 循环里连续的进行插入操作,如果你在开始时设置了:conn.setAutoCommit(false);
                 * 最后才进行conn.commit(),这样你即使插入的时候报错,修改的内容也不会提交到数据库,
                 */
                conn.setAutoCommit(false);
            } catch (SQLException e) {// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        public static void commit() {
            try {
                Connection conn = tl.get();
                if(conn != null) {
                    conn.commit();
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        
        public static void rollback() {
            try {
                Connection conn = tl.get();
                if(conn != null) {
                    conn.rollback();
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }

    4.dao层应用

     QueryRunner qr = new QueryRunner(DBUtils.getDs());
    //更新的示范,删除修改大致

    public boolean addNews(News news) throws SQLException {
      conn = DBUtils.getConnection();
      String sql = "insert into news(ntid,ntitle,nauthor,ncreateDate,ncontent,nsummary,npicPath) values(?,?,?,NOW(),?,?,?)";
      Object[] params = {news.getNtid(),news.getNtitle(),news.getNauthor(),news.getNcontent(),news.getNsummary(),news.getNpicPath()};
      int result = qr.update(conn, sql, params);
      if(result == -1) {
      return false;
      }else {
      return true;
      }

    }

    //查询的示范--无条件查询全部

    public List<News> queryAllNews() throws SQLException{
      conn = DBUtils.getConnection();
      String sql = "select * from news";
      List<News> newss = new ArrayList<>();
      newss = qr.query(conn, sql, new BeanListHandler<News>(News.class));
      return newss;

    }

    //查询的示范--通过条件查询某一记录

    public News queryNewsByNid(int nid) throws SQLException {
      conn = DBUtils.getConnection();
      String sql = "select * from news where nid=?";
      News news = null;
      news = qr.query(conn, sql, nid, new BeanHandler<>(News.class));
      return news;
    }

    //分页查询数量时注意

    public int getCount() {

      String sql="select count(1) from news";

      Long c=new Long(-1);

      try {

      c =(Long)qr.query(sql, new ScalarHandler());

      } catch (SQLException e) {

      e.printStackTrace();

      }

      return c.intValue();

    }

    大致用法就是这样了,保险起见,在service层处理时加上事务的处理!

     

  • 相关阅读:
    AutoLayout动画
    实现毛玻璃效果
    合并静态库
    GCDAsyncSocket~
    iOS下URL编码
    OC多线程之GCD ----- 2
    堆和栈的区别
    Effective Objective-C 2.0重读笔记---2
    Android手机端抓包方法
    Android APK反编译
  • 原文地址:https://www.cnblogs.com/-217/p/12764935.html
Copyright © 2011-2022 走看看