Dbutils
操作數據第三方包。依賴數據源DataSource(DBCP|C3p0)。
QueryRunner – 接收DataSource|Connection,查詢數據刪除修改操作。返回結果。
ResultSetHandler – 結果集句柄,將結果數據封裝成程序所需要的數據類型Map,List,Bean。
第一步:創建一個新的java項目

第二步:導入包
MySQL.jar
Dbcp.jar – 連接池的包。
Dbtutil.jar
第三步:創建dataSource數據源
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db909?characterEncoding=UTf8
username=root
passWord=1234
maxActive=5
工廠類創建一個唯一的dataSorcepackage cn.itcast.utils;import java.io.InputStream;import java.util.PRoperties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class DataSourceUtils { private static DataSource ds; static{ try{ //讀取資源文件 InputStream in = DataSourceUtils.class .getClassLoader().getResourceAsStream("dbcp.properties"); //讀取資源對象 Properties prop = new Properties(); prop.load(in); //創建ds ds = new BasicDataSourceFactory().createDataSource(prop); }catch(Exception e){ throw new RuntimeException(e.getMessage(),e); } } //返回整個池對象 public static DataSource getDatasSource(){ return ds; }}
第四步:開始測試dbutils的使用
Queryrunner.query 只可以執行select語句。
Queryrunner.update只可以接收update,delte,insert語句。
保存數據:
@Test    public void insert1() throws Exception{        QueryRunner run = new QueryRunner(getDatasSource());        String sql = "insert into users values('U002','李四','888')";        run.update(sql);    }    //接收?    @Test    public void insert2() throws Exception{        QueryRunner run = new QueryRunner(getDatasSource());        String sql = "insert into users values(?,?,?)";        run.update(sql,"U003","王五","7777");    }    //刪除    @Test    public void del1() throws Exception{        QueryRunner run = new QueryRunner(getDatasSource());        String sql = "delete from users where name=?";        int len = run.update(sql,"李四");        System.err.println(len);    }    @Test    public void udpate1() throws Exception{        QueryRunner run = new QueryRunner(getDatasSource());        String sql = "update users set name=? where id=?";        run.update(sql,"趙'七","U001");    }查詢:
查詢時除了使用queryrunner還要使用別一個核心類resultsethandler:結果集的句本周 封裝結果到List,Map,Bean。
ArrayHandler,  - 用于查詢一行唯一的數據。Object[]QueryRunner run = new QueryRunner(getDatasSource());       String sql = "select * from users";       Object[] os = run.query(sql,new ArrayHandler());       for(Object o:os){           System.err.println(o);       }結果是:
U001
趙'七
123
ArrayListHandler,  - 將所有的結果封裝成List<Object[]>        QueryRunner run = new QueryRunner(getDatasSource());        String sql = "select * from users";        List<Object[]> list = run.query(sql,new ArrayListHandler());        for(Object[] os:list){            for(Object o:os){                System.err.print(o+"/t");            }            System.err.println("/n=====");        }返回的是:
U001 趙'七 123
=====
U002 AaA 44
=====
U003 88 777
=====
 BeanHandler,   - 返回一個 Bean,結果封裝到Bean。只查詢第一行。適合根據id查詢唯一的一行。@Test    public void query2() throws Exception{        QueryRunner run = new QueryRunner(getDatasSource());        String sql = "select * from users where id=?";        User user =                 run.query(sql,new BeanHandler<User>(User.class),"U003");        System.err.println(user);    }BeanListHandler ,  - 返回List<Bean>所有行,都封裝到List,適合于查詢多個結果@Test    public void query3() throws Exception{        QueryRunner run = new QueryRunner(getDatasSource());        String sql = "select * from users";        List<User> us =                 run.query(sql,new BeanListHandler<User>(User.class));        for(User u:us){            System.err.println(u);        }            }結果是:
User [id=U001, name=趙'七, pwd=123]
User [id=U002, name=AaA, pwd=44]
User [id=U003, name=88, pwd=777]
ColumnListHandler, - 查詢一個字段時就可以使用這種方式 select name from table;QueryRunner run = new QueryRunner(getDatasSource());        String sql = "select * from users";        List<Object> list = run.query(sql, new ColumnListHandler("pwd"));        for(Object o:list){            System.err.println(o);        } KeyedHandler -- QueryRunner run = new QueryRunner(getDatasSource());        String sql = "select * from users";        Map<Object,Map<String,Object>> mm =                 run.query(sql, new KeyedHandler("id"));        Iterator it = mm.keySet().iterator();        while(it.hasNext()){            Map m1 = mm.get(it.next());            System.err.println(m1.get("id")+","+m1.get("name")+","+m1.get("pwd"));        }結果是:
{U001={id=U001, pwd=123, name=趙'七}, U002={id=U002, pwd=44, name=AaA}, U003={id=U003, pwd=777, name=88}}
, MapHandler , 與 BeanHandler應,只返回第一行,封裝成Map類型 - 也適合于查詢一個結果集的 適合于關聯查詢,且沒有匹配的Bean。
MapListHandler ,  - List<Map>@Test    public void query6() throws Exception{        QueryRunner run = new QueryRunner(getDatasSource());        String sql = "SELECT u.name as uname,c.name as cname"+                     " FROM users u INNER JOIN contacts c ON u.id=c.uid";        System.err.println(sql);        List<Map<String,Object>> mm = run.query(sql,new MapListHandler());        System.err.println(mm);    }SELECT u.name as uname,c.name as cname FROM users u INNER JOIN contacts c ON u.id=c.uid[{uname=Jack, cname=Rose}, {uname=Jack, cname=李四}, {uname=Jack, cname=王五}, {uname=張三, cname=馬六}, {uname=張三, cname=趙七}]ScalarHandler – 標量- 用于select count(1)|sum|avg|max …一些聚合函數@Test public void query7() throws Exception{ QueryRunner run = new QueryRunner(getDatasSource()); String sql = "select count(*) from contacts"; Object o = run.query(sql,new ScalarHandler()); Integer ss = Integer.valueOf(o.toString()); System.err.println(ss); }
總結:
1:包裝HttpServletRequest。是對getParaqmgermap增強。
2:用dbcp連接數據庫,并在一個項目中維護一個唯一的dataSource。
工廠類,一個datasource的成員靜態。
Static代碼塊中讀取配置文件連接數據庫。創建datasource。
提供一個工廠方法返回整個池對象。
3:dbutils的所有查詢方法
所有ResultSetHandler的子類做一次。
MapHandler
MapListHandler
BeanHandler
BeanListHandler
ScalerHandler
新聞熱點
疑難解答