commons-dbutils 是一个封装了数据库增、删、改、查的工具类,代码非常简洁。只需要调用类`QueryRunner`中方法即可。
<br/>
使用 commons-dbutils 工具步骤如下:
**1. pom.xml**
```xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.15</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
```
**2. 配置文件,选择xml或者properties都可以**
* `resources/c3p0.properties`
```properties
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/jdbc_db?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=UTC
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.user=root
c3p0.password=root
c3p0.acquireIncrement=3
c3p0.idleConnectionTestPeriod=60
c3p0.initialPoolSize=10
c3p0.maxIdleTime=60
c3p0.maxPoolSize=20
c3p0.maxStatements=100
c3p0.minPoolSize=5
```
* `resources/c3p0-config.xml`
```xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="jdbc_db"><!-- 代码读取的逻辑名,可以随便取 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl"> jdbc:mysql://localhost:3306/jdbc_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="maxPoolSize">20</property>
<property name="minPoolSize">3</property>
<property name="maxStatements">30</property>
<property name="maxIdleTime">150</property>
</named-config>
</c3p0-config>
```
**3. 调用类`QueryRunner`中方法完成数据库操作**
```java
public class CommonsDbutils {
//采用.properties格式,则不需要传入参数
//private DataSource dataSource = new ComboPooledDataSource();
//如果采用xml格式,则需要传入在xml文件创建的逻辑名
private DataSource dataSource = new ComboPooledDataSource("jdbc_db");
private QueryRunner queryRunner = new QueryRunner(dataSource);
/**
* 增、删、改可以统一调用 update 方法。
*/
@Test
public void update() throws SQLException {
int r1 = queryRunner.update("insert into student values(?,?,?,?)", "1011", "张无忌", 25, "男");
int r2 = queryRunner.update("update student set `name`=? where id=?", "张三丰", "1011");
int r3 = queryRunner.update("delete from student where id=?", "1011");
}
/**
* 查询返回的是单个实体。
*/
@Test
public void queryBean() throws SQLException {
Student student = queryRunner.query("select * from student where id=?", new BeanHandler<>(Student.class), 1009);
System.out.println(student);
//Student(id=1009, name=田七9, age=32, sex=男9)
}
/**
* 查询返回的是多个实体。
*/
@Test
public void queryListBean() throws SQLException {
List<Student> studentList = queryRunner.query("select * from student limit ?,?", new BeanListHandler<>(Student.class), 1, 5);
System.out.println(studentList);
//[Student(id=10010, name=田七10, age=33, sex=男10),
// Student(id=1003, name=王五, age=27, sex=男),
// Student(id=1005, name=田七5, age=28, sex=男5),
// Student(id=1006, name=田七6, age=29, sex=男6),
// Student(id=1007, name=田七7, age=30, sex=男7)]
}
/**
* 统计。
*/
@Test
public void queryCount() throws SQLException {
long count = queryRunner.query("select count(*) from student", new ScalarHandler<Long>());
System.out.println(count);
//8
}
}
```
- 网络通信
- 网络协议
- 端口和套接字
- TCP网络程序
- UDP网络程序
- 多线程聊天室
- 多线程
- 线程相关概念
- 线程实现方式
- 中断线程
- 线程生命周期
- 线程优先级
- 优先级规则
- 案例演示
- 线程同步机制
- 线程同步机制
- synchronized关键字
- ReentrantLock类
- Condition类
- 监视器概念
- volatile关键字
- final变量
- 死锁
- 线程局部变量
- 读/写锁
- 原子类
- 阻塞队列
- 工作规则
- 案例演示
- 常用阻塞队列
- 线程安全集合
- 高效的映射/集/队列
- 并发集视图
- 写数组的拷贝
- Arrays类的并行数组算法
- 同步包装器
- Callable与Future
- 执行器
- 线程池
- 预定执行
- 控制任务组
- Fork-Join框架
- 同步器
- 同步器
- 信号量
- CountDownLatch类
- CyclicBarrier类
- Exchanger类
- SynchronousQueue类
- 线程与Swing
- Swing与线程问题
- 两个原则
- Swing工作线程
- 单一线程规则
- 文件IO
- File类
- 文件输入输出
- ZIP压缩文件
- 集合
- 集合框架
- 集合接口
- 集合实现类
- 线程安全集合
- 集合算法
- 迭代器
- 集合排序
- JDBC
- JDBC是什么
- JDBC-ODBC桥
- JDBC驱动程序类型
- JDBC常用类与接口
- 数据库操作
- 连接数据库
- 增/删/改/查/预处理
- 事务
- 批处理
- commons-dbutils工具
- 安全问题
- Jedis
- 使用Jedis操作Redis数据库
- JSON转换
- 使用连接池
- 案例
- 单例破坏
- 单例定义
- 单例实现方式
- 懒汉式实现单例
- 饿汉式实现单例
- 单例破坏
- 类的单例破坏
- 枚举的单例破坏
- 克隆
- 克隆是什么
- 浅克隆
- 深克隆
- 注解
- 注解是什么
- 三大注解
- 内置注解
- 元注解
- 自定义注解
- NIO
- 相关概念
- BIO/NIO/AIO
- 多线程编程
- 线程同步
- 线程通信
- NIO
- NIO三大核心组件
- NIO网络编程
- NIO文件读写
- AIO
- Java8新特性
- Lambda表达式
- 方法引用
- 函数式接口
- 默认方法
- 什么是默认方法
- 默认方法语法格式
- 多个同名的默认方法问题
- 静态默认方法
- 默认方法实例
- Stream
- Stream是什么
- Stream示例
- Optional容器
- 新的日期时间API
- Base64
- SPI
- SPI是什么
- SPI与API的区别
- 常见场景
- 使用SPI需遵循的约定
- SPI使用步骤