1. 程式人生 > >jdbc升級

jdbc升級

元素 log metadata 類型轉換 getpara nec param sdf 日期轉換

1.BeanUtils組件

  1)使用:導入commons-beanutils-1.8.3.jar核心包,日誌支持包: commons-logging-1.1.3.jar

      缺少日誌的jar文件報錯:java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

  2)用法:

    1.對象屬性的拷貝

      BeanUtils.copyProperty(admin, "userName", "jack");

      BeanUtils.setProperty(admin, "age", 18);

    2.對象的拷貝

      BeanUtils.copyProperties(newAdmin, admin);

    3.map數據拷到javaBean中      

      【註意:map中的key要與javabean的屬性名稱一致】

      BeanUtils.populate(adminMap, map);

  3)例子:

技術分享
public class App {

    //1. 對javabean的基本操作
    @Test
    public void test1() throws Exception {
        
        // a. 基本操作
        Admin admin = new
Admin(); // admin.setUserName("Jack"); // admin.setPwd("999"); // b. BeanUtils組件實現對象屬性的拷貝 BeanUtils.copyProperty(admin, "userName", "jack"); BeanUtils.setProperty(admin, "age", 18); // 總結1: 對於基本數據類型,會自動進行類型轉換! // c. 對象的拷貝
Admin newAdmin = new Admin(); BeanUtils.copyProperties(newAdmin, admin); // d. map數據,拷貝到對象中 Admin adminMap = new Admin(); Map<String,Object> map = new HashMap<String,Object>(); map.put("userName", "Jerry"); map.put("age", 29); // 註意:map中的key要與javabean的屬性名稱一致 BeanUtils.populate(adminMap, map); // 測試 System.out.println(adminMap.getUserName()); System.out.println(adminMap.getAge()); } //2. 自定義日期類型轉換器 @Test public void test2() throws Exception { // 模擬表單數據 String name = "jack"; String age = "20"; String birth = " "; // 對象 Admin admin = new Admin(); // 註冊日期類型轉換器:1, 自定義的方式 ConvertUtils.register(new Converter() { // 轉換的內部實現方法,需要重寫 @Override public Object convert(Class type, Object value) { // 判斷 if (type != Date.class) { return null; } if (value == null || "".equals(value.toString().trim())) { return null; } try { // 字符串轉換為日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.parse(value.toString()); } catch (ParseException e) { throw new RuntimeException(e); } } },Date.class); // 把表單提交的數據,封裝到對象中 BeanUtils.copyProperty(admin, "userName", name); BeanUtils.copyProperty(admin, "age", age); BeanUtils.copyProperty(admin, "birth", birth); //------ 測試------ System.out.println(admin); } //2. 使用提供的日期類型轉換器工具類 @Test public void test3() throws Exception { // 模擬表單數據 String name = "jack"; String age = "20"; String birth = null; // 對象 Admin admin = new Admin(); // 註冊日期類型轉換器:2, 使用組件提供的轉換器工具類 ConvertUtils.register(new DateLocaleConverter(), Date.class); // 把表單提交的數據,封裝到對象中 BeanUtils.copyProperty(admin, "userName", name); BeanUtils.copyProperty(admin, "age", age); BeanUtils.copyProperty(admin, "birth", birth); //------ 測試------ System.out.println(admin); } }
View Code

    註意:拷貝對象屬性時,對於一般類型會自動轉類型,但是遇到特殊類型,如日期類型需要自己定義日期轉換器

       註冊日期類型轉換器:ConvertUtils.register(new DateLocaleConverter(), Date.class);

                 自定義方式:

技術分享
// 註冊日期類型轉換器:1, 自定義的方式
        ConvertUtils.register(new Converter() {
            // 轉換的內部實現方法,需要重寫
            @Override
            public Object convert(Class type, Object value) {
                
                // 判斷
                if (type != Date.class) {
                    return null;
                }
                if (value == null || "".equals(value.toString().trim())) {
                    return null;
                }
                
                
                try {
                    // 字符串轉換為日期
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    return sdf.parse(value.toString());
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
            }
        },Date.class);
View Code

2.元數據

   1)在jdbc中獲得數據庫的定義,例如:數據庫,表,列的定義,就用到元數據

   2)在jdbc中可以用的:數據庫元數據,參數元數據,結果集元數據(。。。MetaData)

      1.獲得數據庫元數據:conn.getMetaData();

      2.參數元數據:pstmt=conn.prepareStsatement(sql);

             pstmt.getParameterMetaData();

      3.結果集元數據:rs = pstmt.executeQuery();

              rs_metaData = rs.getMetaData();

              可以通過結果集元數據獲得列的名稱

例子:

技術分享
//1. 數據庫元數據
    @Test
    public void testDB() throws Exception {
        // 獲取連接
        Connection conn = JdbcUtil.getConnection();
        // 獲取數據庫元數據
        DatabaseMetaData metaData = conn.getMetaData();// alt + shift + L  快速獲取方法返回值
        
        System.out.println(metaData.getUserName());
        System.out.println(metaData.getURL());
        System.out.println(metaData.getDatabaseProductName());
    }
    
    //2. 參數元數據
    @Test
    public void testParams() throws Exception {
        // 獲取連接
        Connection conn = JdbcUtil.getConnection();
        // SQL
        String sql = "select * from dept where deptid=? and deptName=?";
        // Object[] values = {"tom","888"};
        
        PreparedStatement pstmt = conn.prepareStatement(sql);
        // 參數元數據
        ParameterMetaData p_metaDate = pstmt.getParameterMetaData();
        // 獲取參數的個數
        int count = p_metaDate.getParameterCount();
        
        
        // 測試
        System.out.println(count);
    }
    
    // 3. 結果集元數據
    @Test
    public void testRs() throws Exception {
        String sql = "select * from dept ";
        
        // 獲取連接
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement pstmt = conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        // 得到結果集元數據(目標:通過結果集元數據,得到列的名稱)
        ResultSetMetaData rs_metaData = rs.getMetaData();
        
        // 叠代每一行結果
        while (rs.next()) {
            // 1. 獲取列的個數
            int count = rs_metaData.getColumnCount();
            // 2. 遍歷,獲取每一列的列的名稱
            for (int i=0; i<count; i++) {
                // 得到列的名稱
                String columnName = rs_metaData.getColumnName(i + 1);
                // 獲取每一行的每一列的值
                Object columnValue = rs.getObject(columnName);
                // 測試
                System.out.print(columnName + "=" + columnValue + ",");
            }
            System.out.println();
        }
        
    }
View Code

3.DbUtils組件

  1)Apache組織提供的開源JDBC工具類,對jdbc進行了簡單的封裝,引入jar文件 : commons-dbutils-1.6.jar

  2)使用:

     DbUtil關閉資源、加載驅動

     核心工具類:QueryRunner,對數據庫的操作都是通過他來對結果數據進行封裝,處理數據

     操作更新:update(conn,sql,param);//執行更新帶一個占位符的sql

          update(conn ,sql,...param);//執行更新帶多個占位符的sql

          batch(conn,sql,params);批處理

       查詢:query(conn,sql,ResultSetHander<T> rsh,Object...params);這個對查詢結果封裝為自定義的T類型

       DbUtil組件中提供了一些封裝結果的對象就不需要自己去自定義封裝結果了

          BeanHandler:查詢返回一個單一對象;BeanListhandler:查詢返回list集合,集合元素是指定的對象

          ArrayHander:結果集第一行,封裝為對象數據Object[]

          ArrayListHander:結果集每一行封裝為Object[]數組,再添加到list集合中去

          ScalarHandler:放回結果集的第一行第一列

          MapHandler:查詢返回結果的第一條記錄

查詢封裝結果集例子:

技術分享
// 一、查詢, 自定義結果集封裝數據
    @Test
    public void testQuery() throws Exception {
        String sql = "select * from admin where id=?";
        // 獲取連接
        conn = JdbcUtil.getConnection();
        // 創建DbUtils核心工具類對象
        QueryRunner qr = new QueryRunner();
        // 查詢
        Admin admin = qr.query(conn, sql, new ResultSetHandler<Admin>() {

            // 如何封裝一個Admin對象
            public Admin handle(ResultSet rs) throws SQLException {
                if (rs.next()) {
                    Admin admin = new Admin();
                    admin.setId(rs.getInt("id"));
                    admin.setUserName(rs.getString("userName"));
                    admin.setPwd(rs.getString("pwd"));
                    return admin;
                }
                return null;
            }

        }, 29);

        // 測試
        System.out.println(admin);
        // 關閉
        conn.close();

    }
    
    // 二、查詢, 使用組件提供的結果集對象封裝數據
    
    // 1)BeanHandler: 查詢返回單個對象
    @Test
    public void testQueryOne() throws Exception {
        String sql = "select * from admin where id=?";
        // 獲取連接
        conn = JdbcUtil.getConnection();
        // 創建DbUtils核心工具類對象
        QueryRunner qr = new QueryRunner();
        // 查詢返回單個對象
        Admin admin =  qr.query(conn, sql, new BeanHandler<Admin>(Admin.class), 29);
        
        System.out.println(admin);
        conn.close();
    }
    
    // 2)BeanListHandler: 查詢返回list集合,集合元素是指定的對象
    @Test
    public void testQueryMany() throws Exception {
        String sql = "select * from admin";
        conn = JdbcUtil.getConnection();
        QueryRunner qr = new QueryRunner();
        // 查詢全部數據
        List<Admin> list = qr.query(conn, sql, new BeanListHandler<Admin>(Admin.class));
        
        System.out.println(list);
        conn.close();
    }
    @Test
//    3) ArrayHandler, 查詢返回結果記錄的第一行,封裝對對象數組, 即返回:Object[]
//    4) ArrayListHandler, 把查詢的每一行都封裝為對象數組,再添加到list集合中
//    5) ScalarHandler 查詢返回結果記錄的第一行的第一列  (在聚合函數統計的時候用)
//    6) MapHandler  查詢返回結果的第一條記錄封裝為map
    public void testArray() throws Exception {
        String sql = "select * from admin";
        conn = JdbcUtil.getConnection();
        QueryRunner qr = new QueryRunner();
        // 查詢
        //Object[] obj = qr.query(conn, sql, new ArrayHandler());
        //List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());
        //Long num = qr.query(conn, sql, new ScalarHandler<Long>());
        Map<String, Object> map = qr.query(conn,sql, new MapHandler());
        
        conn.close();
    }
View Code

更新例子

技術分享
// 1. 更新
    @Test
    public void testUpdate() throws Exception {
        String sql = "delete from admin where id=?";
        // 連接對象
        conn = JdbcUtil.getConnection();

        // 創建DbUtils核心工具類對象
        QueryRunner qr = new QueryRunner();
        qr.update(conn, sql, 26);

        // 關閉
        DbUtils.close(conn);
    }

    // 2. 批處理
    @Test
    public void testBatch() throws Exception {
        String sql = "insert into admin (userName, pwd) values(?,?)";
        conn = JdbcUtil.getConnection();
        QueryRunner qr = new QueryRunner();
        // 批量刪除
        qr.batch(conn, sql, new Object[][]{ {"jack1","888"},{"jack2","999"}  });
        
        // 關閉
        conn.close();
    }
View Code

          

jdbc升級