QueryRunner的使用
Posted -217
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QueryRunner的使用相关的知识,希望对你有一定的参考价值。
1为什么使用DbUtils?
DbUtils工具类,避免JDBC繁琐,简化开发。DbUtils类主要负责装载驱动、关闭连接的常规工作。
2QueryRunner类
QreryRunner类DbUtils的核心类,简化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&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的使用的主要内容,如果未能解决你的问题,请参考以下文章