您的位置:首页 > 编程语言 > Java开发

Java--JavaWeb使用commons-dbutils简化数据库操作

2016-09-06 10:38 274 查看
具体实现步骤:

1,使用C3P0连接池--这里使用在src根目录下创建名为c3p0-config.xml的文件。

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 这是默认配置信息 -->
<default-config>
<!-- 连接四大参数配置 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<!-- 池参数配置 -->
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>

<!-- 专门为oracle提供的配置信息 -->
<named-config name="oracle-config">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</named-config>

</c3p0-config>
2.新建一个JDBCUtils类,为其他类提供数据库连接对象或者数据库连接池(在QueryRunner中会用到数据库连接池)
package com.c3p0.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 注意必须使用c3p0-config.xml的配置方式。将c3p0-config.xml文件放在src根目录下。
* 默认配置。
*
* */
public class JDBCUtils {

private static ComboPooledDataSource ds=new ComboPooledDataSource();
/**
* 使用连接池返回一个连接对象
* */
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}

/**
* 返回一个连接池对象。
*
* */
public static DataSource getDataSource(){
return ds;
}
}
3.编写操作数据库的类
package com.c3p0.demo1;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.junit.Test;

import com.c3p0.jdbc.JDBCUtils;

public class Demo2 {

/**
* 查询记录
* @throws SQLException
*
* */
@Test
public void fun1() throws SQLException{
//创建QueryRunner,需要提供数据库连接池;
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());

//给出sql模板
String sql="select * from tb_stu where number=?";

//给出参数
Object[] params={"stu_001"};

//执行Query,需要给出结果集处理器,即ResultHandler的实现类对象
//我们给的是BeanHandler,他实现了ResultSetHandler
//它需要一个类型,然后他会把rs中的数据封装到指定类型的javabean对象中,然后返回javabean.
Stu stu=qr.query(sql, new BeanHandler<Stu>(Stu.class),params);
System.out.println(stu);

}

/**
* 插入新的一条记录
* @throws SQLException
*
* */

@Test
public void fun2() throws SQLException{
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());

String sql="insert into tb_stu values(?,?,?,?,?)";

Object[] params={"stu_003","wangwu",20,"female","dancing"};

int count=qr.update(sql, params);
System.out.println("count:"+count);
}
}


另外,还用到了JavaBean对象Stu
package com.c3p0.demo1;

public class Stu {

private String number;
private String name;
private int age;
private String gender;
private String hobby;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public Stu(String number, String name, int age, String gender, String hobby) {
this.number = number;
this.name = name;
this.age = age;
this.gender = gender;
this.hobby = hobby;
}
public Stu() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Stu [number=" + number + ", name=" + name + ", age=" + age
+ ", gender=" + gender + ", hobby=" + hobby + "]";
}

}


使用这种方式:
(1)将增删改操作简化了,即同时使用一个模板即可,只需修改sql语句和参数即可;

(2)查询结果直接可以通过ResultSetHandler的实现类封装成JavaBean对象。

解析common-dbutils.jar:

QueryRunner对象

方法:

update方法:

--》int update(String sql,Object... params):可执行增删改语句

Query方法(泛型):

--》T Query(String sql,ResultSetHandler rsh,Object...params):可执行查询

他会先得到ResultSet,然后调用rsh的handle()把rs转换成需要的类型!

ResultSetHandler接口的实现类:

(1)BeanHandler(单行)--》构造器需要一个Class类型的参数,用来把一行结果转换成指定类型的JavaBean对象;

(2)BeanListHandler(多行)--》构造器也是需要一个Class类型的参数,用来把一行结果集转换成一个javaBean,那么多行就是多个JavaBean对象,组合成一个List对象。

(3)MapHandler(单行)把一行结果及转换成Map对象

例如:一行记录为

sid  sname  age  gender

001   zhangsan  20  male

那么转换成Map就是:

{sid:001,sname:zhangan,age:20,gender:male}

(4)MapListHandler(多行)--》把一行记录用一个Map装起来,那么多航记录就是多个Map,即List<Map>

(5)ScalarHandler(单行单列)--》通常用于select count(*)from tb_stu语句。结果集是单行单列的,返回一个object。

package com.c3p0.demo1;

import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import com.c3p0.jdbc.JDBCUtils;

public class Demo2 {

/**
* 查询记录
* @throws SQLException
* 单行结果集处理器:
* (1)BeanHandler单行结果集处理器。
* (2)MapHandler单行结果集处理器
* */
@Test
public void fun1() throws SQLException{
//创建QueryRunner,需要提供数据库连接池;
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());

//给出sql模板
String sql="select * from tb_stu where number=?";

//给出参数
Object[] params={"stu_001"};

//执行Query,需要给出结果集处理器,即ResultHandler的实现类对象
//我们给的是BeanHandler,他实现了ResultSetHandler
//它需要一个类型,然后他会把rs中的数据封装到指定类型的javabean对象中,然后返回javabean.

Stu stu=qr.query(sql, new BeanHandler<Stu>(Stu.class),params);//(1)使用BeanHandler单行结果集处理器。

Map map=qr.query(sql, new MapHandler(),params);//(2)使用MapHandler单行结果集处理器
System.out.println(map);

}

/**
* 查询记录
* 结果集多行处理器:
* BeanListHandler多行结果集处理器
* MapListHandler多行结果集处理器
* 没有参数就不用定义Object[] params={}。
* */

@Test
public void fun1_1() throws SQLException{
//创建QueryRunner,需要提供数据库连接池;
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());

//给出sql模板
String sql="select * from tb_stu";

//给出参数
//Object[] params={};

/*使用BeanListHandler*/
List<Stu> list1=qr.query(sql, new BeanListHandler<Stu>(Stu.class));
Iterator<Stu> it=list1.iterator();
while(it.hasNext()){
Stu s=it.next();
System.out.println(s.toString());
}

System.out.println("-----------------------------------");
/*使用MapListHandler*/
List<Map<String, Object>> list2=qr.query(sql, new MapListHandler());
Iterator<Map<String, Object>> it1=list2.iterator();
while(it1.hasNext()){
Map<String,Object> map=it1.next();
System.out.println(map);

}
}

/**
* 查询记录
* 单行单列结果
* ScalarHandle
* @throws SQLException
* */
@Test
public void fun3() throws SQLException{
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());

String sql="select count(*) from tb_stu";

Object obj=qr.query(sql, new ScalarHandler());

System.out.println(obj.toString());

}

/**
* 插入新的一条记录
* @throws SQLException
*
* */

@Test
public void fun2() throws SQLException{
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());

String sql="insert into tb_stu values(?,?,?,?,?)";

Object[] params={"stu_003","wangwu",20,"female","dancing"};

int count=qr.update(sql, params);
System.out.println("count:"+count);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息