DbUtils

原创
2019/09/03 21:10
阅读数 96

DbUtils

概述

DbUtils是Java编程中的数据库操作实用工具,小巧简单实用。

 

DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

POM

<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->

<dependency>

    <groupId>commons-dbutils</groupId>

    <artifactId>commons-dbutils</artifactId>

    <version>1.7</version>

</dependency>

 

依赖

<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>

 

核心功能

QueryRunner中提供对sql语句操作的API

 

ResultSetHandler接口,用于定义select操作后,怎样封装结果集

 

DBUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

QueryRunner

QueryRunner(DataSourcr ds)

提供数据源(连接池),DbUtils底层自动维护连接connection

 

update(String sql,Obj...params)

执行更新数据

 

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

执行查询

ResultSetHandler

ArrayHandler:

适合取1条记录,把结果集中的第一行数据转成对象数组。

 

ArrayListHandler:

适合取多条记录,把结果集中的每一行数据都转成一个对象数组,再存放到List中。

 

BeanHandler:

将结果集中的第一行数据封装到一个对应的JavaBean实例中(把每条记录封装成对象,适合取一条记录)

 

BeanListHandler:

将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

 

MapHandler:

将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

 

MapListHandler:

将结果集中的每一行数据都封装到一个Map里,然后再存放到List

 

ColumnListHandler:

将结果集中某一列的数据存放到List中。

 

KeyedHandler(name):

将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。

 

ScalarHandler:将结果集第一行的某一列放到某个对象中。

 

代码

基础功能

现有一张 User 表,其表结构如下:

id

name

age

email

1

Jone

18

test1@baomidou.com

2

Jack

20

test2@baomidou.com

3

Tom

28

test3@baomidou.com

4

Sandy

21

test4@baomidou.com

5

Billie

24

test5@baomidou.com

 

数据库脚本

DROP TABLE IF EXISTS user;

 

CREATE TABLE user

(

        id BIGINT(20) NOT NULL COMMENT '主键ID',

        name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',

        age INT(11) NULL DEFAULT NULL COMMENT '年龄',

        email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',

        PRIMARY KEY (id)

);

 

 

其对应的数据库 Data 脚本如下

DELETE FROM user;

 

INSERT INTO user (id, name, age, email) VALUES

(1, 'Jone', 18, 'test1@baomidou.com'),

(2, 'Jack', 20, 'test2@baomidou.com'),

(3, 'Tom', 28, 'test3@baomidou.com'),

(4, 'Sandy', 21, 'test4@baomidou.com'),

(5, 'Billie', 24, 'test5@baomidou.com');

 

 

 

 

查询功能

public static void main(String[] args) throws SQLException {


    QueryRunner queryRunner=new QueryRunner(JDBCUtil.getDataSource());
    Object[] param=new Object[]{1};
    User user = queryRunner.query("select * from user where id =?", new BeanHandler<User>(User.class),param);
    System.out.println(user);
}

 

 

 

自定义扩展

如果用户要想自定义业务返回类型

public class CustomerResultSetHandler<T> implements ResultSetHandler<T> {

    @Override
   
public T handle(ResultSet rs) throws SQLException {
        return null;
    }
}

 

 

 

大字段

public void testClob() throws Exception {
    QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
    String sql = "insert into clob values(?)";
    File file = new File("c:/a.txt");
    Long l = file.length();
    char[] buffer = new char[l.intValue()];
    FileReader reader = new FileReader(file);
    reader.read(buffer);
    SerialClob clob = new SerialClob(buffer);
    queryRunner.update(sql, clob);
}

 

 

二进制图片

public void testBlob() throws Exception{
    QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
    String sql = "insert into blob values(?)";
    File file = new File("c:/a.jpg");
    Long l = file.length();
    byte[] buffer = new byte[l.intValue()];
    FileInputStream input = new FileInputStream(file);
    input.read(buffer);
    SerialBlob blob = new SerialBlob(buffer);
    queryRunner.update(sql,blob);
}

 

 

事务操作

事务案例

 

使用ThreadLocal类,传递事务连接

public class JdbcKit {

   
/**
     *
获取连接池
     */
   
public static ComboPooledDataSource ds = new ComboPooledDataSource();
   
/**
     *
线程共享变量
     */
   
public static ThreadLocal<Connection> container = new ThreadLocal<Connection>();

   
/**
     *
获取线程变量
     *
     * @return
    
*/
   
public static ThreadLocal<Connection> getContainer() {
       
return container;
    }

   
public static DataSource getDataSource() {
       
return ds;
    }

   
/**
     *
开启事务
     */
   
public static void startTransaction() {
        Connection conn =
container.get();
       
if (conn == null) {
            conn = getConnection();
           
container.set(conn);
        }
        
try {
            conn.setAutoCommit(
false);
        }
catch (SQLException e) {
           
throw new RuntimeException(e.getMessage(), e);
        }
    }

   
/**
     *
提交事务
     */
   
public static void commit() {
        Connection conn =
container.get();
       
if (conn != null) {
           
try {
                conn.commit();
            }
catch (SQLException e) {
               
throw new RuntimeException(e.getMessage(), e);
            }
        }
    }

   
/**
     *
回滚事务
     */
   
public static void rollback() {
        Connection conn =
container.get();
       
if (conn != null) {
           
try {
                conn.rollback();
            }
catch (SQLException e) {
               
throw new RuntimeException(e.getMessage(), e);
            }
        }
    }

   
/**
     *
关闭连接
     */
   
public static void close() {
        Connection conn =
container.get();
       
if (conn != null) {
           
try {
                conn.close();
            }
catch (SQLException e) {
                
throw new RuntimeException(e.getMessage(), e);
            }
finally {
               
container.remove();
            }
        }
    }


   
/**
     *
获取数据库连接
     *
     * @return
    
*/
   
public static Connection getConnection() {
       
try {
           
return ds.getConnection();
        }
catch (Exception e) {
           
throw new RuntimeException();
        }
    }


}

 

 

 

模拟银行卡转账

 

账户模型

public class Account {

   
private Integer id;

   
private BigDecimal money;

   
public Integer getId() {
       
return id;
    }

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

   
public BigDecimal getMoney() {
       
return money;
    }

   
public void setMoney(BigDecimal money) {
       
this.money = money;
    }
}

 

 

账户持久化

public class AccountDAO {

   
/**
     *
连接
     */
   
private Connection conn;

   
public AccountDAO() {
       
this.conn = JdbcKit.getContainer().get();
    }


   
/**
     *
查询账户ID
     *
     * @param
id
    
* @return
    
*/
   
public Account findAccount(int id) {
        
//处理事务 ,无参构造
        QueryRunner runner = new QueryRunner();
        String sql =
"select * from account where id=?";
        Object[] params = {id};
       
try {
           
//附加连接 处理者为BeanHandler
           
return (Account) runner.query(conn, sql, params, new
                   
BeanHandler(Account.class));
        }
catch (Exception e) {
           
throw new RuntimeException(e.getMessage(), e);
        }
    }

   
/**
     *
更新账户
     *
     * @param
a
    
*/
   
public void updateAccount(Account a) {
        QueryRunner runner =
new QueryRunner();
        String sql =
"update account set money=? where id=?";
        Object[] params = {a.getMoney(), a.getId()};
       
try {
            runner.update(
conn, sql, params);
        }
catch (SQLException e) {
           
throw new RuntimeException(e.getMessage(), e);
        }
    }
}

 

 

账户转账操作

public class AccountService {

   
/**
     *
转账方法
     *
     * @param
fromID 原始账户
     * @param toID   目标账户
     * @param money  转入多少钱
     */

   
public void trafferAccount(int fromID, int toID, BigDecimal money) {
       
try {
            JdbcKit.startTransaction();
            AccountDAO dao =
new AccountDAO();
            Account from = dao.findAccount(fromID);
            Account to = dao.findAccount(toID);
            from.setMoney(from.getMoney().subtract(money));
            to.setMoney(to.getMoney().add(money));
            dao.updateAccount(from);
            dao.updateAccount(to);
            JdbcKit.commit();
        }
catch (Exception e) {
            JdbcKit.rollback();
           
throw new RuntimeException();
        }
finally {
            JdbcKit.close();
        }
    }
}

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部