DBUtils框架編程步驟

JDBC元數據API :是框架編寫的基礎,掌握元數據API ,更清楚知道框架是如何實現的html

元數據MetaData : 指數據庫中 庫、表、列的定義信息
一、DataBaseMetaData 數據庫元數據
二、ParameterMetaData 參數元數據
三、ResultSetMetaData 結果集元數據java

 

上面的元數據能夠沒必要太深刻了解,只須要知道DBUtils框架是使用該API實現的就能夠了mysql

------------------------------------------------------------------------------------------------------------------------------------------------sql

DBUtils學習
一、QueryRunner 框架核心類 ,全部數據庫操做都是必須經過 QueryRunner 進行的
二、ResultSetHandler 結果集封裝接口,完成將ResultSet 結果集 封裝爲一個Java對象
三、DbUtils 工具類 提供驅動管理、事務管理、釋放資源等一系列公共方法數據庫

 

去官網下載DBUtils
將dbutils的jar 複製 WEB-INF/lib apache

QueryRunner 與 ResultSetHandler 一塊兒使用,完成數據表增刪改查
構造器:
QueryRunner() -------- 沒有傳遞鏈接池給DBUtils 框架,框架不能得到數據庫鏈接,接下來每一個操做,必須將數據庫鏈接傳給框架 (手動管理事務)
QueryRunner(DataSource ds) ---- 將鏈接池給DBUtils框架,之後每一個操做,都會從鏈接池中獲取一個新的鏈接 (每條SQL 一個單獨的事務)編程

更新操做 insert update delete
public int update(Connection conn, String sql, Object... params) ---- 手動管理事務,沒有將鏈接池提供框架,傳入鏈接
public int update(String sql, Object... params) ----- 將鏈接池交給框架,由框架管理事務,不須要傳入鏈接
查詢操做 select
public Object query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
public Object query(String sql, ResultSetHandler<T> rsh, Object... params) app

一、須要手動管理事務
QueryRunner()
public int update(Connection conn, String sql, Object... params)
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)框架

二、由框架管理事務 (每條SQL都是一個單獨事務)
QueryRunner(DataSource ds)
public int update(String sql, Object... params)
public Object query(String sql, ResultSetHandler<T> rsh, Object... params) dom

 

ResultSetHandler 在DBUtils 框架中提供九個默認 實現類,直接使用九個默認實現類,能夠完成常規操做,而不須要自定義結果集封裝
1) ArrayHandler 和 ArrayListHandler 將數據表的每行記錄保存Object[] 中
2) BeanHandler 和 BeanListHandler 將數據表每行記錄 保存JavaBean對象中
* 封裝javabean屬性時,必須保證數據表列名與 javabean屬性名一致,不然沒法封裝
3) MapHandler和 MapListHandler 將結果每行記錄保存到一個Map集合,key是列名,value是值
4) ColumnListHandler 查詢結果集中指定一列數據
5) KeyedHandler(name) 結果集每行數據封裝map,再將map存入另外一個map 做爲value,指定一列做爲key
6) ScalarHandler 進行單值查詢 select count(*) from account;

重點:BeanHandler 和 BeanListHandler 、ScalarHandler 、ColumnListHandler

------------------------------------------------------------------------------------------------------------------------------------------------

編程步驟:

導入jar包:

mysql-connector-java-5.0.8-bin.jar commons-dbutils-1.4.jar c3p0-0.9.1.2.jar

 

c3p0-config.xml :c3p0的配置文件,位於工程src目錄下

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///day15?generateSimpleParameterMetadata=true</property>
    </default-config> <!-- This app is massive! -->
</c3p0-config> 

 

工具類(經過c3p0 創建鏈接和釋放資源)

package cn.itcast.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 工具類 創建鏈接 釋放資源
 * 
 * @author seawind
 * 
 */
public class JDBCUtils {
    // 經過c3p0 數據庫鏈接池 創建鏈接
    // 自動讀取 src下 c3p0-config.xml 配置文件
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

    public static DataSource getDataSource() {
        return dataSource;
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    // 釋放資源的方法 能夠被 DBUtils框架 DbUtils工具類取代
    public static void release(ResultSet rs, Statement stmt, Connection conn) {
        // 釋放資源
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        release(stmt, conn);
    }

    public static void release(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

DBUtilsTest:對數據庫的CRUD操做

package cn.itcast.dbutils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.junit.Test;

import cn.itcast.domain.Account;
import cn.itcast.utils.JDBCUtils;

/**
 * 調用DBUtils框架完成增刪改查
 * 
 * @author seawind
 * 
 */
public class DBUtilsTest {
    @Test
    // 查詢
    public void testSelect() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());

        // 自定義結果集封裝
        List<Account> accounts = queryRunner.query("select * from account",
                new ResultSetHandler<List<Account>>() {
                    @Override
                    public List<Account> handle(ResultSet rs)
                            throws SQLException {
                        List<Account> accounts = new ArrayList<Account>();
                        try {
                            while (rs.next()) {
                                Account account = new Account();
                                account.setId(rs.getInt("id"));
                                account.setName(rs.getString("name"));
                                account.setMoney(rs.getDouble("money"));

                                accounts.add(account);
                            }
                            return accounts;
                        } catch (SQLException e) {
                            e.printStackTrace();
                            throw new RuntimeException(e);
                        }
                    }
                });

        for (Account account : accounts) {
            System.out.println(account.getName() + "," + account.getMoney());
        }
    }

    @Test
    // 刪除
    public void testDelete() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        queryRunner.update("delete from account where name =?", "ddd");
    }

    @Test
    // 修改 Account 數據
    public void testUpdate() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        queryRunner.update("update account set name=?,money=? where id =?",
                "小明", 3000, 2);
    }

    @Test
    // 插入Account表數據
    public void testInsert() throws SQLException {
        // 建立QueryRunner對象
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        // 插入
        queryRunner.update("insert into account values(null,?,?)", "eee", 1000);
    }
}

DBUtils九個內置Handler(結果集處理)

package cn.itcast.dbutils;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import cn.itcast.domain.Account;
import cn.itcast.utils.JDBCUtils;

/**
 * 使用 DBUtils 九個內置handler
 * 
 * @author seawind
 * 
 */
public class ResultSetHandlerTest {
    // ScalarHandler
    @Test
    public void testScalarHandler() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        long value = (Long) queryRunner.query("select count(*) from account",
                new ScalarHandler(1));

        System.out.println(value);
    }

    @Test
    // KeyedHandler
    public void testKeyedHandler() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        Map<Object, Map<String, Object>> map = queryRunner.query(
                "select * from account", new KeyedHandler("id"));
        System.out.println(map);
    }

    // ColumnListHandler
    @Test
    public void testColumnListHandler() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        List<Object> list = queryRunner.query("select * from account",
                new ColumnListHandler("money"));
        System.out.println(list);
    }

    // MapListHandler
    @Test
    public void testMapListHandler() throws SQLException {
        // 每行---Map 不少行 ---List<Map>
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        List<Map<String, Object>> list = queryRunner.query(
                "select * from account", new MapListHandler());
        System.out.println(list);
    }

    // MapHandler
    @Test
    public void testMapHandler() throws SQLException {
        // 每行記錄 保存Map集合
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        Map<String, Object> map = queryRunner.query("select * from account",
                new MapHandler());

        System.out.println(map);
    }

    // BeanListHandler
    @Test
    public void testBeanListHandler() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        // 每行記錄 --Account 不少行 --- List<Account>
        List<Account> accounts = queryRunner.query("select * from account",
                new BeanListHandler<Account>(Account.class));
        for (Account account : accounts) {
            System.out.println(account.getId());
            System.out.println(account.getName());
            System.out.println(account.getMoney());
        }
    }

    // BeanHandler
    @Test
    public void testBeanHandler() throws SQLException {
        // 將第一行數據 --- java對象中
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        // 泛型用來控制方法返回值,參數建立方法返回結果對象
        Account account = queryRunner.query("select * from account",
                new BeanHandler<Account>(Account.class));
        System.out.println(account.getId());
        System.out.println(account.getName());
        System.out.println(account.getMoney());
    }

    // ArrayListHandler
    @Test
    public void testArrayListHandler() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        // 每行是 Object[] ----- 不少行 List<Object[]>
        List<Object[]> list = queryRunner.query("select * from account",
                new ArrayListHandler());
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
    }

    // ArrayHandler
    @Test
    public void testArrayHandler() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        // 封裝結果集第一行數據 ---- Object[]
        Object[] arr = queryRunner.query("select * from account",
                new ArrayHandler());
        System.out.println(Arrays.toString(arr));
    }
}

 擴展閱讀:

DBUtils – BeanProcessor擴展,支持自定義字段映射 - Iteam項目組 Smith&Wesson(史密斯威森) - 博客頻道 - CSDN.NET

擴展commons dbutils的JavaBean轉換方式 - nighty - BlogJava

Common Dbutils詳解 - 指引前行 - 博客頻道 - CSDN.NET

Apache DBUtils使用總結 【轉】 - 夜真寒 - 博客園

DBUtils使用詳解一 - luxiaoyu_sdc的專欄 - 博客頻道 - CSDN.NET

DBUtils使用詳解二 - luxiaoyu_sdc的專欄 - 博客頻道 - CSDN.NET

DBUtils 增刪改查例子 - OPEN 開發經驗庫

Dbutils詳解 - gaozhuang211 - BlogJava

DBUtils – BeanProcessor擴展,支持自定義字段映射 - Iteam項目組 Smith&Wesson(史密斯威森) - 博客頻道 - CSDN.NET

相關文章
相關標籤/搜索