一、概述
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
1.1 DBUtils简介
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
1.对于数据表的读操作,可以把结果转换成List,Array,Set等java集合,便于程序员操作。
2.对于数据表的写操作,也变得很简单(只需写sql语句)。
1.2 DBUtils包括的主要类
- DbUtils类:启动类
- QueryRunner类:执行SQL语句的类
这里要注意,传入的参数是【数据源】,而不是Connection
//构造方法,传入的参数是【数据源】,而不是Connection,这里要注意
public QueryRunner(DataSource ds) {
super(ds);
}
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
- ResultSetHandler接口:转换类型接口
- ScalarHandler 类:适合获取一行一列数据【重点】
- BeanHandler类:实现类,把记录转成对象【重点】
- BeanListHandler类:实现类,把记录转化成List,储存的是JavaBean类型的对象【重点】
- ArrayHandler类:实现类,把记录转化成数组,这里是将该行的各列条目数据存储为数组,是Object类型
- ArrayListHandler类:把记录转化成数组,并放入集合中,该集合存储的是数组,数组是每行的个列条目数据信息,是Object类型
- ColumnListHandler类:取某一列的数据,封装到List中
二、DBUtils的使用
该工具类的使用方式可以参考《DAO模式》的查询的实现原理,以及《JDBC基础操作》的抽取数据库工具类部分。
-
创建项目
-
导入jar包,放到新建的lib文件夹下
commons-dbutils-1.6.jar DBUtils工具类包
druid-1.1.5.jar 阿里德鲁伊连接池
mysql-connector-java-5.1.41-bin 与数据库的连接jar包 -
导入配置文件,放到src目录下
database.properties / druid.properties 配置文件#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/practice?useSSL=true&characterEncoding=utf8
username=root
password=123456
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000 -
DruidUtils.java工具类
public class DruidUtils {
private static DruidDataSource dataSource = null;
static {
InputStream is = DBUtil_druid.class.getClassLoader().getResourceAsStream("database.properties");
Properties properties = new Properties();
try {
properties.load(is);
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
is.close();
} catch (Exception e) {
System.out.println("注册失败");
e.printStackTrace();
}
}
//对外提供数据源,而不是Connection
public static DruidDataSource getDataSource() {
return dataSource;
}
}
- 创建对应的包和方法
/*dao.impl包下*/
//EMPDao接口
public interface EMPDao {
public List<EMP> findAll(); //查询所有,返回List集合
public EMP findById(Integer id); //根据id查找某一个,返回对象
public void add(EMP emp); //添加员工
public void update(EMP emp); //更新员工
public void delete(Integer id); //根据id删除某一个员工
public long getCount(); //获取总的数据个数
public List<String> findNames(); //查找,只返回姓名集合
public Object[] findArrayEmp(Integer id); //根据id查找某一个员工各列条目信息,返回数组
public List<Object[]> findAllInfo(); //查询所有,返回的是由数组构成的集合
}
//EMPDao_impl实现类【使用了DBUtils中的方法】
public class EMPDao_impl implements EMPDao {
@Override
public List<EMP> findAll() {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
try {
List<EMP> empList = qr.query("select * from emp", new BeanListHandler<EMP>(EMP.class));
return empList;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查询失败", e);
}
}
@Override
public EMP findById(Integer id) {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
try {
EMP emp = qr.query("select * from emp where id = ?", new BeanHandler<EMP>(EMP.class),id);
return emp;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("未找到", e);
}
}
@Override
public void add(EMP emp) {
//创建查询执行器,并指定连接池,注意传入的是数据源,而不是连接
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//执行
Object[] params = {emp.getName(), emp.getAge(),emp.getJob()};
try {
int update = qr.update("insert into emp(name, age, job) value (?, ?, ?)", params);
if (update > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void update(EMP emp) {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
try {
int update = qr.update("update emp set name = ?,age = ?,job=? where id=?",emp.getName(), emp.getAge(), emp.getJob(), emp.getId());
if (update > 0) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("更新失败", e);
}
}
@Override
public void delete(Integer id) {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
try {
int i = qr.update("delete from emp where id = ?", id);
if (i > 0) {
System.out.println("删除成功");
}
} catch (SQLException e) {
e.printStackTrace();
new RuntimeException("删除异常", e);
}
}
@Override
public long getCount() {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
try {
Long query =(long) qr.query("select count(*) from emp", new ScalarHandler<>());
return query;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查找失败", e);
}
}
@Override
public List<String> findNames() {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
try {
List<String> list = qr.query("select * from emp", new ColumnListHandler<String>("name"));
return list;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查询失败", e);
}
}
//查找某一行的列字段明细
@Override
public Object[] findArrayEmp(Integer id) {
QueryRunner queryRunner = new QueryRunner(DruidUtils.getDataSource());
try {
Object[] query = queryRunner.query("select * from emp where id = ?", new ArrayHandler(), id);
return query;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("找不到", e);
}
}
@Override
public List<Object[]> findAllInfo() {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
try {
List<Object[]> list = qr.query("select * from emp", new ArrayListHandler());
return list;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查询失败", e);
}
}
}
/*domain包下的对象类,这里只写出属性部分*/
public class EMP {
private Integer id; //注意必须是包装类
private String name;
private Integer age;
private String job;
//还有构造方法,set和get方法以及toString方法等
...
}