前言
先说一下原生JDBC的弊端:
1、数据库连接对象、sql语句操作对象、封装结果集对象,重复定义
2、封装数据的代码重复,而且操作复杂,代码量大
3、释放资源的代码重复。
总结:开发的时候有大量重复劳动,开发周期长,效率低
在涉及mybatis框架之前,先学习一下轻量方便的dbutils框架也是很有必要的,比如小型的管理系统之类的,不需要java代码和sql语句分离,sql语句也不复杂的情况下dbutils就派上用场了。
dbutils是什么
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。 (采自百度百科)
说白了dbutils就是一个封装了原生jdbc很多操作(增删改查)的工具类。
比如原生jdbc查询数据需要将结果集ResultSet遍历、取数据、封装成bean等等繁琐的工作, 而dbutils直接一个query()方法就可以将数据集封装到指定对象的List<>中。
实例
CRUD都主要通过一个类QueryRunner,主要用到的方法就是query()以及update()。
下面直接上代码,代码里面的注释已经很清晰明白了。
数据源来自c3p0:
<named-config name="user">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydata</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">5</property><!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="initialPoolSize">100</property>
<property name="maxPoolSize">1000</property>
</named-config>
获得数据源的方法就一行代码:
private static DataSource dataSource=new ComboPooledDataSource("user");//数据源:C3P0连接池
查询稍微复杂点,分为三种:查询一条数据、查询数据集、查询指定字段某一个数据。
查询一条数据:
@Test
public void queryBean() throws SQLException{
QueryRunner queryRunner=new QueryRunner(dataSource);
User user=queryRunner.query("select * from user where id=5",new BeanHandler<User>(User.class));
System.out.println(user);
}
注:BeanHandler实现类返回一个bean对象。
运行截图:
查询数据集:
@Test
public void dbUtilsQuery() throws SQLException {
QueryRunner queryRunner=new QueryRunner(dataSource);//这里可以不写数据源,这样在下面query()|update()方法中加上
//Connection参数
String sql="select * from user";
List<User> users=queryRunner.query(sql,new BeanListHandler<User>(User.class));//将查询出来的数据转换为User实体列表
for(User u:users){
System.out.println(u);
}
}
注:BeanListHandler实现类返回Bean对象的List。
运行截图:
查询某一个数据:
//使用new ScalarHandler()实现类查询单个数据,比如这里查询有多少条数据count(*)
public Long querySize() throws SQLException{
QueryRunner queryRunner=new QueryRunner(dataSource);
Long size=queryRunner.query("select count(*) from user",new ScalarHandler<Long>());
//System.out.println(size);
return size;
}
注:ScalarHandler 实现类返回某个数据。
由于此方法后面要调用,所以把@Test注解去掉了,运行结果截图就省略了。
修改:
@Test
public void modify() throws SQLException{
QueryRunner queryRunner=new QueryRunner(dataSource);
int i=queryRunner.update("update user set age=35 where name=?","chen");//和preparedStatement同样的操作
//update(sql,参数1,参数2...)
if(i>=1) {
queryBean();
}
}
运行截图:
插入:
@Test
public void insert() throws SQLException{//批量插入数据
QueryRunner queryRunner=new QueryRunner(dataSource);
Object [][]params=new String[5][3];//这里的5表示插入5条数据,3表示3个字段(id,name,age)
int size=querySize().intValue();
System.out.println(size);
for(int i=1;i<=5;i++){//之所以要[i-1]是因为i=1开始的,i=5过后要下标越界
params[i-1][0]=size+i+" ";
params[i-1][1]="dbutil"+(size+i);
params[i-1][2]= (int)(Math.floor(Math.random()*10+20))+" ";//随机生成年纪20-30岁
}
int result[]=queryRunner.batch("insert into user(id,name,age) values(?,?,?)",params);
if(result!=null){
System.out.println("插入成功~");
}
}
运行截图:
删除的操作同修改,只是改一下sql语句就行了。
所以说dbutils用起来还是很方便的。
原创:https://blog.csdn.net/qq_37094660/article/details/95206941