O Commons DbUtils é uma biblioteca de ferramentas de código aberto fornecida pela organização Apache para o simples encapsulamento do JDBC, que pode simplificar o desenvolvimento de aplicativos JDBC sem afetar o desempenho do programa.
Uso de DBUtils
1. O que é DBUtils?
1. Introdução
a. dbUtils é um Java operar um banco de dados ferramenta embalados , o banco de dados pode ser simples e rápido para uso
b. Para uma operação de leitura da base de dados, o conjunto de resultados pode ser empacotado em ResultSet List
, Set
, Array
como Java conjunto
c. Para uma operação de gravação, enquanto as declarações de gravação SQL
d Pode usar fontes de dados, JBDI
2. Função
DBUtils encapsula operações JDBC, simplifica o processo e torna a programação mais concisa
Segundo, os três principais objetos do DBUtils
1. A classe QueryRunner
O método principal ::
query()
executar operações DQL
update()
: executar operações DML
batch()
: executar operações em lote
2. Interface ResultSetHandler
用于DQL操作后,封装查询的结果集
3. classe DBUtils
是一个工具类,定义了关闭资源和事务处理的方法
Terceiro, o simples uso de DBUtils
- Importe pacotes jar, use o banco de dados MySQL, C3P0, DBUtils, importe pelo menos esses três pacotes jar
- Criar um objeto QueryRunner requer uma fonte de dados
//创建一个 QueryRunner 对象,括号里面需要一个数据源,在另外的包创建
QueryRunner runner = new QueryRunner(C3P0Util.getDataSource());
O arquivo da fonte de dados é mostrado na figura abaixo; os códigos específicos de C3P0Util.java e C3P0-config.xml estão listados no final do artigo.
- Definir instrução SQL
//定义SQL语句,比如查询学生表的全部信息
String sql = "select * from student";
- Ao usar o DQL, use ArrayListHandler () para encapsular o conjunto de resultados
//执行sql语句并封装查询结果
List<Object[]> objectList = runner.query(sql, new ArrayListHandler());
- Por fim, use o método close () do DBUtils para liberar recursos
Quatro, objeto QueryRunner
1. Construtor
new QueryRunner():事务可以自己控制
也就是说,这个对象调用的方法(query、update、batch)的参数中都需要Connection 对象
2. Métodos comuns
-
consulta: (Os exemplos específicos são descritos abaixo )
ArrayHandler
: Adequados única fileira de várias colunas condições
ArrayListHandler
: para linhas e colunas
ColumnListHandler
: Indicado linha única policíclico
KeyedHandler
: ir para uma pluralidade de registos de cada pacote para o mapa , o Mapa então encapsulado em outro Mapa em, valor de chave para o campo especificado
MapHandler
: apropriado para tomar uma linha de dados, os nomes de atributo e valores para cada linha de dados é encapsulado em Mapa de
MapListHandler
: para tomar uma pluralidade de registos, regista o pacote para o mapa , o então Mapa encapsulado Lista de
ScalaHandler
: para tomar separadas individuais de dados
BeanHandler
para: ler uma linha de dados, e encapsulado num objecto especificado em
BeanListHandler
: para leitura de uma pluralidade de linhas de dados, e o objecto especificado para o pacote, e adicionado ao conjunto -
atualizar
Inserir: adicionar dados
@Test
public void testInsert() throws SQLException{
//1. 得到一个QueryRunner对象
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
//2. 定义SQL语句
String sql = "insert into stu value(?,?,?,?)";
//3.定义一个参数数组
Object[] params = {"1","花无缺",27,"男"}
//4. 执行DML操作
int count = runner.update(conn,sql,params);
}
Atualização: modificar os dados
@Test
public viod testUpdate() throws SQLException{
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
String sql = "update ste set s_name=?,where s_id=?";
Object[] params = {"叶孤城","13"};
int count = runner.update(sql,params);
}
Excluir: excluir dados
@Test
public viod testDelete() throws SQLException{
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
String sql = "delete from stu where sid=?";
Object[] params = {"13"};
int count = runner.delete(sql,params);
}
- lote: operação em lote
@Test
public void testBatch() throws SQLException{
//1. 得到一个QueryRunner对象
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
//2. 定义SQL语句
String sql = "insert into stu value(?,?,?,?)";
//3.定义一个参数数组
Object[] params = {
{"1","花无缺",27,"男"}
{"2","小鱼儿",27,"男"}
}
//4. 执行DML操作
int[] count = runner.batch(sql,params);
}
Cinco, interface ResultSetHandler
Há muitas maneiras, o acima query
método não são mencionados, o uso são semelhantes, são os primeiros a construir QueryRunner
um objeto, instruções SQL definidos na implementação do método, em que um ato da classe, o outro não enumerá-los
MapHandler
: Remova a linha de dados, os nomes de atributos e valores de cada linha de dados encapsulado Mapa de
@Test
public void testMap() throws SQLException{
//1. 得到一个QueryRunner对象
QueryRunner runner = new QueryRunner(C3P0Util.getConnection());
//2. 定义查询所有的SQL语句
String sql = "select * from stu where s_id=?";
//3.执行SQL语句,并封装查询结果
Map<String,Object> map = runner.query(sql,new MapHandler(),"13");
for(Map.Entry<string,Object> entry:map.entrySet()){
String key =entry.getKey();
Object value = entry.getValue();
System.out.println(key);
System.out.println(value);
}
}
Seis, desenvolvimento de transações DBUtils
@Test
public void testInsert() throws SQLException{
//1. 得到一个QueryRunner对象
QueryRunner runner = new QueryRunner();
//2. 得到数据库的连接
Connection conn = C3P0Util.getConnection();
//设置事务不自动提交
conn.setAutoComit(false);
//3. 定义插入的SQL语句
String sql = "insert into stu value(?,?,?,?)";
//4.定义一个参数数组
Object[] params = {"1","花无缺",27,"男"}
//4. 执行DML操作
int count = runner.update(conn,sql,params);
try{
System.out.println(1/0);//假设让程序出错,使它事务回滚
conn.commit();//提交事务
System.out.println("插入数据"+(count == 1? "成功":"失败"));
}catch(Exception e){
e.prinltStackTrace();
conn.rollback();//回滚事务
System.out.println("事务回滚了...");
}
}
Sete, código específico C3P0Util.java e C3P0-config.xml (selecione para ver)
C3P0Util :
package cn.csdn.utils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 使用C3P0连接池得到数据库的连接对象
*
* @author 长歌
* @2020年4月22日下午4:21:31
*/
public class C3P0Util {
private C3P0Util() {
}
// C3P0得到数据源的方式
private static DataSource dataSource = new ComboPooledDataSource();
/**
* 返回数据源对象
*/
public static DataSource getDataSource() {
return dataSource;
}
/**
* 得到数据库的连接对象
*/
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("创建数据库连接失败...");
}
}
/**
* 关闭数据库资源
* @param autoCloseables
*/
public static void close(AutoCloseable... autoCloseables) {
if (autoCloseables == null || autoCloseables.length == 0) {
return;
}
for (AutoCloseable autoCloseable : autoCloseables) {
if (autoCloseable == null) {
continue;
}
// 不关闭conn对象
if (autoCloseable.getClass() != Connection.class) {
try {
autoCloseable.close();
} catch (Exception e) {
System.err.println("关闭数据库资源失败:" + autoCloseable);
autoCloseable = null;
}
}
}
}
}
C3P0-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/csdn</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>
</c3p0-config>