QueryRunner的使用

Posted -217

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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层处理时加上事务的处理!

 

 

以上是关于QueryRunner的使用的主要内容,如果未能解决你的问题,请参考以下文章

QueryRunner使用之可变条件的处理

QueryRunner的使用

模拟DBUtils中的queryRunner.query()的反射机制的模拟

DBUtils QueryRunner 实例化

QueryRunner类

使用 QueryRunner 插入 ArrayList<Object[]>