DbUtils學習(介紹和入門)

一:DbUtils是什麼?

(當我們很難理解一個東西的官方解釋的時候,就讓我們記住它的作用)
Dbutils:主要是封裝了JDBC的代碼,簡化dao層的操作。
作用:幫助java程序員,開發Dao層代碼的簡單框架。
框架的作用:幫助程序員,提高程序的開發效率。
出生:Dbutils是由Apache公司提供。

二:爲什麼需要DbUtils?

在使用DbUtils之前,我們Dao層使用的技術是JDBC,那麼分析一下JDBC的弊端:
(1)數據庫鏈接對象、sql語句操作對象,封裝結果集對象,這三大對象會重複定義
(2)封裝數據的代碼重複,而且操作複雜,代碼量大
(3)釋放資源的代碼重複

結果:(1)程序員在開發的時候,有大量的重複勞動。
(2)開發的週期長,效率低

DbUtils三個核心類介紹:

1:DbUtils:連接數據庫對象----jdbc輔助方法的集合類,線程安全

構造方法:DbUtils()
作用:控制連接,控制書屋,控制驅動加載額一個類。

2:QueryRunner:SQL語句的操作對象,可以設置查詢結果集的封裝策略,線程安全。

構造方法:
(1)QueryRunner():創建一個與數據庫無關的QueryRunner對象,後期再操作數據庫的會後,需要手動給一個Connection對象,它可以手動控制事務。
Connection.setAutoCommit(false);
設置手動管理事務
Connection.commit(); 提交事務

(2)QueryRunner(DataSource ds):創建一個與數據庫關聯的queryRunner對象,後期再操作數據庫的時候,不需要Connection對象,自動管理事務。
DataSource:數據庫連接池對象。

構造函數與增刪改查方法的組合:
QueryRunner()
update(Connection conn, String sql, Object… params)
query(Connection conn, String sql, ResultSetHandler rsh, Object… params)

QueryRunner(DataSource ds)
update(String sql, Object… params)
query(String sql, ResultSetHandler rsh, Object… params)

3:ResultSetHandle:封裝數據的策略對象------將封裝結果集中的數據,轉換到另一個對象

策略:封裝數據到對象的方式(示例:將數據庫保存在User、保存到數組、保存到集合)
方法介紹:handle(ResultSet rs)
備註:詳解參考ResultSetHandle實現類

四:DbUtils快速入門

使用Dbutils注意事項:
(1)需要導入的jar包:①MySql驅動 ②c3p0包 ③DbUtils包
(2)添加c3p0配置文件
(3)可以自行添加一個JDBCUtils工具類:用來獲取c3p0連接池對象

五:代碼演示

c3p0-config.xml 代碼片.

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!--默認配置,c3p0框架默認加載這段默認配置 -->
	<default-config>
		<!--配置JDBC四個基本屬性 -->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql:///jdbc</property>
		<property name="user">root</property>
		<property name="password">root</property>
	</default-config>
</c3p0-config>

JDBCUtils.java代碼片.

package cn.utils;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCUtils {

    // 獲得c3p0連接池對象
    private static ComboPooledDataSource ds = new ComboPooledDataSource();

    /**
     * 獲得數據庫連接對象
     *
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 獲得c3p0連接池對象
     * @return
     */
    public static DataSource getDataSource() {
        return ds;
    }
}

案例一:使用queryRunner對象完成增刪改操作:

1.數據庫

代碼片.

drop database if exists jdbc;
CREATE DATABASE IF NOT EXISTS jdbc;
USE jdbc;
 
drop table if exists user ;
CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL ,
  `pwd` varchar(50) DEFAULT NULL ,
  PRIMARY KEY (`id`)
) ;
#數據初始化
insert into user values (null ,'zhangsan' ,'123456' );
insert into user values (null ,'lisi' ,'123456' );

2.演示代碼

代碼片.

	// 需求:向user表插入一條數據

	// @Test

	public void test1() {

		// 第一步:創建queryRunner對象,用來操作sql語句

		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

		// 第二步:創建sql語句

		String sql = "insert into user values(null,?,?)";

		// 第三步:執行sql語句,params:是sql語句的參數

		// 注意,給sql語句設置參數的時候,按照user表中字段的順序

		try {

			int update = qr.update(sql, "狗蛋", "123456");

			System.out.println(update);

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

	// 需求:修改id==7的數據

	// @Test

	public void test2() {

		// 第一步:創建queryRunner對象,用來操作sql語句

		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

		// 第二步:創建sql語句

		String sql = "update user set name = ? where id = ?";

		// 第三步:執行sql語句,params:是sql語句的參數

		// 注意,給sql語句設置參數的時候,按照user表中字段的順序

		try {

			int update = qr.update(sql, "柳巖", 3);

			System.out.println(update);

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

	// 需求:刪除id==7的數據

	// @Test

	public void test3() {

		// 第一步:創建queryRunner對象,用來操作sql語句

		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

		// 第二步:創建sql語句

		String sql = "delete from user where id = ?";

		// 第三步:執行sql語句,params:是sql語句的參數

		// 注意,給sql語句設置參數的時候,按照user表中字段的順序

		try {

			int update = qr.update(sql, 3);

			System.out.println(update);

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

案例二:QueryRunner的query方法和ResultSetHandler接口的使用

1.數據庫表

同上一案例User表

2.自定義實現ResultSetHandler封裝查詢結果集

自定義策略

代碼片.

package cn.handler;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.commons.dbutils.ResultSetHandler;

import com.ambow.domain.User;
 
// ResultSetHandler<T>,<T>表示封裝結果的類型
//MyHandler 是自定義的ResultSetHandler封裝結果集策略對象
public class MyHandler implements ResultSetHandler<List<User>>{
 
   @Override
   public List<User> handle(ResultSet rs) throws SQLException {
      // 封裝數據,數據從 Resultset 中獲取
      List<User> list = new ArrayList<User>();
       while(rs.next()){
         User u = new User();
         u.setId(rs.getInt( "id"));
         u.setName(rs.getString( "name"));
         u.setPwd(rs.getString( "pwd"));
 
         list.add(u);
      }
       return list;
   }
 
}

3:測試代碼

代碼片.

	// 需求:獲取user表中所有的數據

	// @Test

	public void test4() {

		// 第一步:創建queryRunner對象,用來操作sql語句

		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

		// 第二步:創建sql語句

		String sql = "select * from user";

		// 第三步:執行sql語句,params:是sql語句的參數

		// 注意,給sql語句設置參數的時候,按照user表中字段的順序

		try {

			List<User> list = qr.query(sql, new MyHandler());

			System.out.println(list);

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

案例三:ResultSetHandler實現類介紹(由DbUtils框架提供)

備註:DbUtils給我們提供了10個ResultSetHandler實現類,分別是:
①ArrayHandler: 將查詢結果的第一行數據,保存到Object數組中
②ArrayListHandler 將查詢的結果,每一行先封裝到Object數組中,然後將數據存入List集合
③BeanHandler 將查詢結果的第一行數據,封裝到user對象
④BeanListHandler 將查詢結果的每一行封裝到user對象,然後再存入List集合
⑤ColumnListHandler 將查詢結果的指定列的數據封裝到List集合中
⑥MapHandler 將查詢結果的第一行數據封裝到map結合(key列名,value列值)
⑦MapListHandler 將查詢結果的每一行封裝到map集合(key列名,value列值),再將map集合存入List集合
⑧BeanMapHandler 將查詢結果的每一行數據,封裝到User對象,再存入mao集合中(key列名,value列值)
⑨KeyedHandler 將查詢的結果的每一行數據,封裝到map1(key列名,value列值 ),然後將map1集合(有多個)存入map2集合(只有一個)
⑩ScalarHandler 封裝類似count、avg、max、min、sum…函數的執行結果

以上10個ResultSetHandler實現類,常用的是BeanHandler、BeanListHandler和ScalarHandler,下面將對這三個實現類,寫測試類

一:測試BeanHandler策略

代碼片.

	// 需求:測試BeanHandler策略

	// BeanHandler:將查詢結果的第一行數據,封裝到user對象

	// @Test

	public void test7() {

		// 第一步:創建queryRunner對象,用來操作sql語句

		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

		// 第二步:創建sql語句

		String sql = "select * from user";

		// 第三步:執行sql語句,params:是sql語句的參數

		// 注意,給sql語句設置參數的時候,按照user表中字段的順序

		try {

			User user = qr.query(sql, new BeanHandler<User>(User.class));

			System.out.println(user.getName());

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

二:測試BeanListHandler策略

代碼片.

	// 需求:測試BeanListHandler策略

	// BeanListHandler:將查詢結果的每一行封裝到user對象,然後,再存入list集合

	//@Test

	public void test8() {

		// 第一步:創建queryRunner對象,用來操作sql語句

		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

		// 第二步:創建sql語句

		String sql = "select * from user";

		// 第三步:執行sql語句,params:是sql語句的參數

		// 注意,給sql語句設置參數的時候,按照user表中字段的順序

		try {

			List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));

			System.out.println(list);

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

三:測試ScalarHandler策略

代碼片.

	// 需求:測試ScalarHandler策略

	// ScalarHandler:封裝類似count、avg、max、min、sum。。。。函數的執行結果

	@Test

	public void test14() {

		// 第一步:創建queryRunner對象,用來操作sql語句

		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

		// 第二步:創建sql語句

		String sql = "select count(*) from user";

		// 第三步:執行sql語句,params:是sql語句的參數

		// 注意,給sql語句設置參數的時候,按照user表中字段的順序

		try {

			Object object = qr.query(sql, new ScalarHandler());

			System.out.println(object);

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

參考文獻1


  1. http://www.cnblogs.com/CQY1183344265/p/5854418.html ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章