0
点赞
收藏
分享

微信扫一扫

Java DButils框架

Java DButils框架

一、DButils介绍

DButils是Apache软件基金会提供的一个开源数据库工具类库,目的就是为了开发项目简单化。

优点:

简化JDBC应用程序开发,小巧又实用,可以视为一个开发DAO层的简单框架

在使用DButils之前,Dao层使用的技术是JDBC,

JDBC的缺点:

1.数据库链接对象,sql语句操作对象,封装结果集对象,这三大对象会重复定义

2.封装数据的代码重复,而且操作复杂,代码量大

3.释放资源的代码重复

总结:程序员在开发的时候,有大量的重复工作,而且开发周期长,效率低

DButils框架就是用来解决以上弊端。除此之外DButils可以将结果映射到JavaBean中,也可以将结果转换为Java集合。

二、DButils核心类的功能

1.QueryRunner

SQL语句的操作对象,可以设置查询结果集的封装策略,线程安全

构造方法:

(1).QueryRunner() 无参数

创建一个与数据库无关的QueryRunner对象,后期再操作数据库,需要手动给一 个Connection对象,它可以手动控制事务。

Connection.setAutoCommit(false); 设置手动管理事务

Connection.commit(); 提交事务

(2).QueryRunner(DataSource ds) 参数:DataSource:数据库连接池对象。

创建一个与数据库关联的queryRunner对象,后期再操作数据库的时候,不需要 Connection对象,自动管理事务。


构造函数与增删改查方法的组合:

QueryRunner  qr =  QueryRunner() //无参构造方法,后面需要指定Connection对象

qr.update(Connection conn, String sql, Object... params)

qr.query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)

QueryRunner qr = QueryRunner(ds) //有参构造方法,后面不需要指定Connection对象

qr.update(String sql, Object... params)

qr.query(String sql, ResultSetHandler<T> rsh, Object... params)

2.静态方法:int update(Connection conn,String sql,Param);

int update(Connection conn,String sql,Param);
//参数一:连接对象(这个在无参构造函数的时候使用,有参构造时不用填写)
//参数二:SQL语句 用来完成对表的查询操作
//参数三:可变参数也就是sql中?对应的值
//返回值:返回受影响的函数

3.静态方法 query(Connction con, String sql,ResultSetHandler rsh, Param);

query(Connction  con, String  sql,ResultSetHandler<T> rsh, Param);
//参数一:连接对象(这个在无参构造函数的时候使用,有参构造时不用填写)
//参数二:SQL语句 用来完成对表的查询操作
//参数三:对应不同的结果集封装策略
//参数四:可变参数也就是sql中?对应的值
//返回值:返回受影响的函数

ResultSetHandle:封装数据的策略对象

将封装结果集中的数据,转换到另一个对象

策略:封装数据到对象的方式(示例:将数据库保存在User、保存到数组、保存到集合)

ArrayHandler

将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

ArrayListHandler

将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

BeanHandler

将结果集中第一条记录封装到一个指定的javaBean中。

BeanListHandler

将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

ColumnListHandler

将结果集中指定的列的字段值,封装到一个List集合中

ScalarHandler

它是用于单数据。例如select count(*) from 表操作。

MapHandler

将结果集第一行封装到Map集合中,Key 列名, Value 该列数据

MapListHandler

将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

KeyedHandler

查询的每一行数据存储到map集合中,将多个map集合再存储到map中

三、javaBean

javaBean是一个遵循特定写法的Java类,它通常具有如下特点

1.所有的成员变量都需要用private关键字修饰

2.为类编写一个无参构造方法

3.为类编写一个有参构造方法(全部参数)

4. 为每一个成员编写一对Get/set方法

public class Student {

private long id;
private String name;

public Student(){

}
public Student(long id, String name) {
this.id = id;
this.name = name;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}


public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

四、DButils框架的使用

1. 建立分层

主类文件夹 DButilsTest

Dao层文件夹 dao

Bean层文件夹 Bean

2. 配置文件

设置c3p0-config.xml配置文件。此文件放置在src目录下

 version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/company?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTCproperty>
<property name="user">rootproperty>
<property name="password">property>
<property name="checkoutTimeout">30000property>
<property name="idleConnectionTestPeriod">30property>
<property name="initialPoolSize">10property>
<property name="maxIdleTime">30property>
<property name="maxPoolSize">100property>
<property name="minPoolSize">10property>
<property name="maxStatements">200property>
default-config>

<named-config name="mysql">
<property name="driverClass">com.mysql.cj.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/company?characterEncoding=utf-8&useSSL=false&serverTimezone=UTCproperty>
<property name="user">rootproperty>
<property name="password">property>

<property name="acquireIncrement">5property>
<property name="initialPoolSize">10property>
<property name="minPoolSize">5property>
<property name="maxPoolSize">20property>
<property name="maxStatements">50property>
<property name="maxStatementsPerConnection">5property>
named-config>
c3p0-config>

3. 生成JavaBean文件

可以选择自动生成也可以选择手动操作

自动生成操作:使用Idea企业版或者社区版下载Database Navigator插件

这里推荐Idea企业版,

步骤:单击database,会有一个加号,单击data source的MySQL,输入自己的账户密码,连接地址,Test Connectional测试创建成没成功,创建成功会出现如下图:

Java DButils框架_数据库

选择表右键单击Scriped Excensions 的Generate POJOS groovy,然后选择生成到Bean层文件夹底下

public class Student {

private long id;
private String name;
private String address;
private double chinese;
private double english;
private double math;

public Student(){

}

public Student(long id, String name, String address, double chinese, double english, double math) {
this.id = id;
this.name = name;
this.address = address;
this.chinese = chinese;
this.english = english;
this.math = math;
}

public long getId() {
return id;
}

public void setId(long 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 double getChinese() {
return chinese;
}

public void setChinese(double chinese) {
this.chinese = chinese;
}


public double getEnglish() {
return english;
}

public void setEnglish(double english) {
this.english = english;
}


public double getMath() {
return math;
}

public void setMath(double math) {
this.math = math;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Student").append('[')
.append("id=")
.append(id)
.append(",name=")
.append(name)
.append(",address=")
.append(address)
.append(",chinese=")
.append(chinese)
.append(",english=")
.append(english)
.append(",math=")
.append(math)
.append(']');
return sb.toString();
}
}

4.最后一步就可以进行增删改查的操作

import com.cheng.Bean.Emp;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;

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

public class EmpDao {
/**创建c3p0连接池的变量
* c3p0通过xml文件来配置连接池
* 1.先配置xml文件
* 2.将文件放入搭配src文件夹底下
* 3.定义连接池变量
* 4.定义连接变量
* 5.指定数据库驱动程序
* 6.创建数据库连接池对象给连接池变量
* 7.创建连接变量对象给上面定义连接变量
* */
//创建一个全局的COnnection对象
public Connection conn = null;

//定义连接方法
public Connection getConnection(){
ComboPooledDataSource cpds = null;
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//通过连接池获取数据库连接
cpds = new ComboPooledDataSource();//创建出连接池
conn = cpds.getConnection();//获取连接对象
System.out.println("数据库连接创建成功");

}catch (Exception e){
System.out.println("数据库创建连接失败");
e.printStackTrace();
System.exit(0);
}
return conn;
}

//定义释放连接的方法
public void closeAll(Connection conn) throws SQLException {
if ((conn!=null)||(!conn.isClosed())){
conn.close();
}
}

//定义增加记录的方法
//字段对应的是emp里的字段
//添加与emp相对应的值
public int insertValues(String sql,Object[] param) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用qr对象的update方法执行sql语句
int rowcount = qr.update(conn,sql,param);
//将连接交还连接池
DbUtils.closeQuietly(conn);
//返回插入的行数
return rowcount;
}


//定义修改记录的方法
public int updateValues(String sql,Object[] param) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用qr对象的update方法执行sql语句
int rowcount = qr.update(conn,sql,param);
//将连接交还连接池
DbUtils.closeQuietly(conn);
//返回更新的行数
return rowcount;
}

//定义删除记录的方法
public int dropValues(String sql,Object[] param) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用qr对象的update方法执行sql语句
int rowcount = qr.update(conn,sql,param);
//将连接交还连接池
DbUtils.closeQuietly(conn);
//返回删除的行数
return rowcount;
}

//查询记录
//不同的resultSetHandler实现类来处理结果集
//(1)结果集的第一种实现类,ArrayHandle,返回结果集中的一行数据
public void arrayHandle(String sql,Object[] params) throws SQLException {
//创建一个QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用qr对象方法并执行sql,创建一个array数组,用来存放返回值
Object[] ojbjs = qr.query(conn, sql, new ArrayHandler(), params);
//打印数据
for (Object obj: ojbjs) {
System.out.print(obj+"\t");
}
}
//(2)结果集的第二种实现类,ArrayListHandler
public void arrayListHandler(String sql,Object[] params) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用QueryRunner的query方法并执行SQL,创建List对象,用来存放Array数组
List<Object[]> lsit = qr.query(conn,sql,new ArrayListHandler(),params);
//遍历打印数据
for (Object[] objs: lsit) {
for (Object obj: objs) {
System.out.print(obj+"\t");
}
System.out.println();
}
}
//(3)结果集的第二种实现类,BanHandler 讲结果集的第一行数据存储到java Bean 对象中
public void beanHandler(String sql,Object[] params) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用方法 执行SQL语句,创建JAVABean对象用来存放结果集
Emp emp = qr.query(conn,sql,new BeanHandler<Emp>(Emp.class),params);
//打印数据
System.out.println(emp);
}
//(4)结果集的第四种实现类,BenaListHandler,讲结果集存放到JAVABEan对象中
public void beanListHandler(String sql,Object[] params) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用query方法执行sql,创建一个List集合,集合中的元素为JAVABEAN
List<Emp> list = qr.query(conn,sql,new BeanListHandler<Emp>(Emp.class),params);
//打印数据
for (Emp emp:list) {
System.out.println(emp);
}
}
//5.结果集的第五种实现类,ScalarHandler,适合单个查询,Select语句结果集只有一个值
public void scalerHandler(String sql,Object[] params) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
Object obj = qr.query(conn,sql,new ScalarHandler<Object>("平均工资"),params);
//打印数据
System.out.println(obj);
}


//6.结果集的第五种实现类 ColumListHandler 存储一个列到集合
public void columnListHandler(String sql,Object[] params) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用query方法执行sql,将一列数据存入到集合
List<Object> list = qr.query(conn,sql,new ColumnListHandler<Object>("姓名"),params);
//打印数据
for (Object obj: list) {
System.out.println(obj);
}
}


//7.结果集的第七种实现类 MApHandler 将结果集的第一行,存入map集合中
public void mapHandler(String sql,Object[] params) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用query方法执行sql 将返回结果集第一行装入map = 集合中
Map<String ,Object> map = qr.query(conn,sql,new MapHandler(),params);
//打印数据
System.out.println(map);

}
//8.结果集的第八种实现类 MapListHandler 将结果集放入到List集合中
public void mapListHnadler(String sql,Object[] params) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用query方法执行sql 把返回的结果集中每一行都装入map中,再装入List集合中
List<Map<String ,Object>> list = qr.query(conn,sql,new MapListHandler(),params);
//打印数据
for (Map map: list) {
System.out.println(map);
}
}
//9.结果集的第九种实现类,KeyedHandler结果集的每一行数据都纯存到map集合中,将多个map集合在储存到map中
public void keyedHandler(String sql,Object[] params) throws SQLException {
//创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//调用query方法执行sql,结果集的每一行数据都储存到map集合中,将多个map集合在储存到map中
Map<Object,Map<String,Object>> map = qr.query(conn,sql,new KeyedHandler<>(),params);
for (Object obj:map.keySet()) {
for (String key:map.get(obj).keySet()) {
System.out.println(key+"\t"+map.get(obj).get(key)+"\t");
}
System.out.println();
}
}

调用Dao层底下的EmpDao的操作

import com.cheng.DAO.EmpDao;

import java.sql.SQLException;

public class EmpDaoTest {
public static void main(String[] args) throws SQLException {
EmpDao empDao = new EmpDao();
empDao.conn = empDao.getConnection();
//调用显示方法
// empDao.arrayHandle("select *from emp",null);

// empDao.arrayListHandler("select *from emp",null);

//empDao.beanHandler("select *from emp",null);
// empDao.beanListHandler("select *from emp",null);
// empDao.scalerHandler("select avg(sal) as 平均工资 from emp ",null);
//empDao.columnListHandler("select name as 姓名 from emp ",null);
//empDao.mapHandler("select *from emp",null);
empDao.mapListHnadler("select *from emp",null);
//empDao.keyedHandler("select *from emp",null);
empDao.closeAll(empDao.conn);//关闭连接
}
}


举报

相关推荐

0 条评论