今天使用DBUtils的时候遇到了一些问题,造成问题的原因是没弄清QueryRunner两种构造方法的区别。
QueryRunner的构造方法中常用的两种有:
1.默认的构造方法:QueryRunner qr = new QueryRunner();
2.带数据源的构造方法:QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
如果使用默认的构造方法,那么当我们调用QueryRunner类实例对象的方法时要添加connection对象参数,如果使用带数据源的构造方法,那么我们可以不添加connection对象参数。同时在执行sql语句时可以不带参数以及带参数,具体的demo如下:
package com.hh.test;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import com.hh.mvcapp.db.C3P0Util;
import com.hh.mvcapp.domain.Customer;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
/**
* BeanListHandler:将查询结果的每一行封装到customer对象,然后,再存入list集合
* 注意:QueryRunner有一种是默认的构造方法,该方法不传入任何参数,另一种是传入datasource的构造方法。在下面test中我们会讲解两种构造方法的区别。
* @author HH
*
*/
public class TestBeanListHandle {
/**
* 第一种情况是在构造QueryRunner对象时传入datasource对象,这样我们在调用query方法的时候可以不用传入connection参数。
*/
@Test
public void test1() {
// 第一步:创建queryRunner对象并且传入datasource,用来操作sql语句
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
// 第二步:创建sql语句
String sql = "select * from customers";
// 第三步:执行sql语句
try {
List<Customer> list = qr.query(sql, new BeanListHandler<Customer>(Customer.class));
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 第二种情况是在构造QueryRunner对象时不传入datasource对象,这样我们在调用query方法的时候要传入connection参数。
*/
@Test
public void test2() {
// 第一步:创建queryRunner对象,用来操作sql语句
QueryRunner qr = new QueryRunner();
// 第二步:创建sql语句
String sql = "select * from customers";
Connection connection=null;
// 第三步:执行sql语句
try {
connection=C3P0Util.getConnection();
List<Customer> list = qr.query(connection,sql, new BeanListHandler<Customer>(Customer.class));
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 带一个参数的sql语句执行方法
*/
@Test
public void test3() {
// 第一步:创建queryRunner对象,用来操作sql语句
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
// 第二步:创建sql语句
String sql = "select * from customers where phone=?";
Object phone="123456";//这儿写成数组也是可以得,相当于数组里面只有一个值
// 第三步:执行sql语句
try {
List<Customer> list = qr.query(sql, new BeanListHandler<Customer>(Customer.class),phone);
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 带多个参数的sql语句执行方法
*/
@Test
public void test4() {
// 第一步:创建queryRunner对象,用来操作sql语句
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
// 第二步:创建sql语句
String sql = "select * from customers where phone=? and address=?";
Object object[]={"123456","shanghai"};
// 第三步:执行sql语句
try {
List<Customer> list = qr.query(sql, new BeanListHandler<Customer>(Customer.class),object);
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Customer.java
package com.hh.mvcapp.domain;
public class Customer {
private int id;
private String name;
private String address;
private String phone;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", phone=" + phone + "]";
}
}
C3P0Uril.java
package com.hh.mvcapp.db;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Util {
static DataSource cpds=null;
static{
cpds = new ComboPooledDataSource("mysql");//这是mysql数据库 ,名字要和配置文件里一样
System.out.println(cpds);
}
/**
* 获得数据库连接
*/
public static Connection getConnection(){
try {
return cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
/**
* 获取DataSource数据源
* @return
*/
public static DataSource getDataSource(){
return cpds;
}
/**
* 数据库关闭操作
*/
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
注意:记得导入c3p0和dbutils的jar包。