日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Common-BeanUtils 使用

發(fā)布時(shí)間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Common-BeanUtils 使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

BeanUtils 介紹

???????所謂 BeanUtils 為何要開發(fā)呢, 每個(gè)工程師或許在寫 JavaBean 的時(shí)候, 都會(huì)乖乖地去寫 getters 和 setters, 就是 getXXX() 及 setXXX() methods, 但是當(dāng)你的 object 是動(dòng)態(tài)產(chǎn)生的, 也許是用檔案, 也許是其它原因, 那你該如何去存取數(shù)據(jù)呢 !!幾個(gè)例子你可能會(huì)用到 BeanUtils, 當(dāng)然, 這是已經(jīng)存在的項(xiàng)目了。

  • BSF: Script Language 和 Java Object Model 之間
  • Velocity/ JSP: 使用 template 建立相似的網(wǎng)頁(yè)
  • jakarta taglibs/ Struts/ Cocoon: 建立自己特殊的 Tag Libraries for JSP 或 XSP
  • ant build.xml/ tomcat server.xml: XML-based 的 設(shè)定檔案 ( configuration resources )

???????你大可以使用 java api 中的 java.lang.reflect 及 java.beans 來達(dá)到這些數(shù)據(jù)交換 ~~ 不過呢, 難度有點(diǎn)高 ,但是, BeanUtils 將會(huì)減低你開發(fā)的時(shí)間 !!目前最新的 stable 版本為 1.9.3,下載地址如下:

  • commons-beanutils-1.9.3.jar;
  • commons-logging.jar;

???????BeanUtils 的 Java API 主要的 package 總共四項(xiàng):

???????1. org.apache.commons.beanutils;?
???????2. org.apache.commons.beanutils.converters;?
???????3. org.apache.commons.beanutils.locale;?
???????4. org.apache.commons.beanutils.locale.converters;

???后三個(gè)包主要是用于數(shù)據(jù)的轉(zhuǎn)換,圍繞著一個(gè) Converter 接口,該接口只有一個(gè)方法:java.lang.Object convert(java.lang.Class type, java.lang.Object value) ,用于將一個(gè) value 轉(zhuǎn)換成另一個(gè)類型為 type 的 Object。在將字符串類型的數(shù)據(jù)轉(zhuǎn)換成日期類型時(shí)會(huì)使用此方法。

測(cè)試用的Bean

???????在開始所有的測(cè)試之前,我寫了一個(gè)簡(jiǎn)單的 Bean,以便于測(cè)試,代碼如下:

package com.study.java.domain;import java.io.Serializable; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map;/** * @Name: User * @Description: JavaBean-User信息類 * @Author: XXX * @CreateDate: XXX * @Version: V1.0*/ public class User implements Serializable {private static final long serialVersionUID = 5210726534179789239L;private String name ;private int age ; private boolean gender ; //性別:trye-男,false-女private Date birthday ; //生日private String[] hobbies ; //愛好private String address ; private List<String> strong ; //特長(zhǎng)private Map<String, String> fault ; //缺點(diǎn)private Student Student ; //內(nèi)嵌學(xué)生對(duì)象public User() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public boolean isGender() {return gender;}public void setGender(boolean gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String[] getHobbies() {return hobbies;}public void setHobbies(String[] hobbies) {this.hobbies = hobbies;}public List<String> getStrong() {return strong;}public void setStrong(List<String> strong) {this.strong = strong;}public Map<String, String> getFault() {return fault;}public void setFault(Map<String, String> fault) {this.fault = fault;}public Student getStudent() {return Student;}public void setStudent(Student student) {Student = student;}}

Commons-Beanutils工具詳解

BeanUtils的使用

???????Beanutils工具在使用時(shí)幾乎只用到以下幾個(gè)方法,其中一個(gè)方法通常情況下都是使用匿名內(nèi)部類,用來注冊(cè)日期類型轉(zhuǎn)換器,以將字符串類型的數(shù)據(jù)轉(zhuǎn)換成指定格式的日期類型。

  • BeanUtils.setProperty(bean, name, value):為指定bean實(shí)例的屬性設(shè)值,等同于bean.setXXX()方法;其中bean是指你將要設(shè)置的對(duì)象,name指的是將要設(shè)置的屬性(寫成”屬性名”),value(想要設(shè)置的屬性值);

  • BeanUtils.copyProperties(bean, name, value):與上邊的setProperty方法功能相同;

  • ConvertUtils.register(Converter converter , Class clazz):類型轉(zhuǎn)換器注冊(cè)方法,當(dāng)需要將String數(shù)據(jù)轉(zhuǎn)換成引用數(shù)據(jù)類型(自定義數(shù)據(jù)類型時(shí),例如Date類型),需要使用此方法實(shí)現(xiàn)轉(zhuǎn)換;

  • BeanUtils.populate(bean,Map):將Map集合中的數(shù)據(jù)注入到JavaBean的屬性中去,其中Map中的key必須與目標(biāo)對(duì)象中的屬性名相同,否則不能實(shí)現(xiàn)拷貝;

  • BeanUtils.copyProperties(newObject,oldObject):實(shí)現(xiàn)對(duì)象之間的拷貝。

說明:自定義數(shù)據(jù)類型使用BeanUtils工具時(shí)必須具備的條件

???????自定義數(shù)據(jù)類型使用BeanUtils工具時(shí),本身必須具備getter和setter方法,因?yàn)锽eanUtils工具本身也是一種內(nèi)省的實(shí)現(xiàn)方法,所以也是借助于底層的getter和setter方法進(jìn)行轉(zhuǎn)換的。

/*** @Name: testSetProperty* @Description: * 1、設(shè)置Bean對(duì)象的單個(gè)屬性* public static void setProperty(Object bean, String name, Object value)* =* public static void copyProperty(Object bean, String name, Object value)* @Author: XXX* @Version: V1.0* @CreateDate: XXX* @Parameters: @throws Exception* @Return: void*/@Testpublic void testSetProperty() throws Exception {System.out.println(user);//設(shè)置String類型的屬性BeanUtils.setProperty(user, "user", "李四") ;//設(shè)置int類型的屬性BeanUtils.setProperty(user, "age", 25) ;//設(shè)置boolean類型的屬性BeanUtils.setProperty(user, "gender", "false") ;//設(shè)置Date類型的屬性//異常信息:DateConverter does not support default String to 'Date' conversion.//注冊(cè)String->日期類型轉(zhuǎn)換器ConvertUtils.register(new Converter() {@Overridepublic Object convert(Class type, Object value) {if(type != Date.class) {return null ;}if(value == null && "".equals(value.toString().trim())) {return null ;}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;Date date = null ;try {date = sdf.parse((String) value) ;} catch (ParseException e) {throw new RuntimeException(e) ;}return date;}}, Date.class) ;BeanUtils.setProperty(user, "birthday", "2016-92-11") ;//設(shè)置數(shù)組類型的屬性String[] hobbies = {"11", "22", "33"} ;BeanUtils.setProperty(user, "hobbies", hobbies) ;//設(shè)置List、Set、Map、內(nèi)嵌對(duì)象等...System.out.println(user);} /*** @Name: testPupulate* @Description: * 2、將Map<String, Object>集合中的內(nèi)容設(shè)置到JavaBean的屬性上* 說明:* Map的key:必須與JavaBean的屬性名稱相同;* Map的value:注入到JavaBean的屬性;* 備注:* 此方法經(jīng)常用于將表單提交的參數(shù)設(shè)置到表單Bean對(duì)象中* @Author: XXX* @Version: V1.0* @CreateDate: XXX* @Parameters: * @Return: void*/@Testpublic void testPupulate() throws Exception {Map<String, Object> map = new HashMap<String, Object>() ;//字符串->字符串屬性map.put("name", "李大魁") ;//字符串->整型屬性map.put("age", "25") ;//字符串->布爾型屬性map.put("gender", "false") ;//字符串->日期類型屬性map.put("birthday", "2016-12-10") ;//字符串->數(shù)組類型屬性String[] hobbies = {"11", "22", "33"} ;map.put("hobbies", hobbies) ;//字符串->List集合屬性List<String> strong = new ArrayList<String>() ;strong.add("1111") ;strong.add("22222") ;strong.add("33333") ;map.put("strong", strong) ;//字符串->Map集合屬性Map<String, String> fault = new HashMap<String, String>() ;fault.put("學(xué)習(xí)222", "偷懶,反應(yīng)慢") ;fault.put("感情222", "磨嘰,不勇敢") ;map.put("fault", fault) ;//字符串->內(nèi)嵌對(duì)象屬性Student student = new Student("三思", "25") ;map.put("student", student) ;User user = new User() ;//注冊(cè)日期類型轉(zhuǎn)換器ConvertUtils.register(new Converter() {@Overridepublic Object convert(Class type, Object value) {if(type != Date.class) {return null ;}if(value == null || "".equals(value.toString().trim())) {return null ;}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;Date date = null ;try {date = sdf.parse((String) value);} catch (ParseException e) {e.printStackTrace();}return date;}}, Date.class) ;//將Map集合注入到JavaBeanBeanUtils.populate(user, map) ;System.out.println(user);}

???????下邊是我在開發(fā)中常用到的表單數(shù)據(jù)轉(zhuǎn)換工具類WebUtils:

package com.study.java.utils;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map;import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter;/** * @Name: WebUtils * @Description: Web工具類 * @Author: XXX * @CreateDate: XXX * @Version: V1.0*/ public class WebUtils {private static final String FORMAT = "yyyy-MM-dd" ;/*** @Name: fillBean* @Description: 將Map集合中的數(shù)據(jù)封裝到JavaBean* 說明:* Map的key:與屬性名稱保持一致;* Map的value:設(shè)置為屬性值;* @Author: XXX* @Version: V1.0* @CreateDate: XXX* @Parameters: @param map* @Parameters: @param clazz* @Return: T*/public static <T> T fillBean(Map<String, Object> map, Class<T> clazz) {T bean = null ;try {bean = clazz.newInstance() ; //注冊(cè)日期類型轉(zhuǎn)換器ConvertUtils.register(new Converter() {@Overridepublic Object convert(Class type, Object value) {if(type != Date.class) {return null ;} if(value == null || "".equals(value.toString().trim())) {return null ;}SimpleDateFormat sdf = new SimpleDateFormat(FORMAT) ;Date date = null ;try {date = sdf.parse((String) value) ;} catch (ParseException e) {e.printStackTrace();}return date;}}, Date.class) ;//將Map集合中的數(shù)據(jù)封裝到JavaBeanBeanUtils.populate(bean, map) ;} catch (Exception e) {throw new RuntimeException(e) ;}return bean ;}/*** @Name: copyProperties* @Description: 實(shí)現(xiàn)JavaBean對(duì)象之間的屬性復(fù)制* 說明:原對(duì)象與目標(biāo)對(duì)象內(nèi)的屬性名稱必須相同* @Author: XXX* @Version: V1.0* @CreateDate: XXX* @Parameters: @param tClazz* @Parameters: @param oClazz* @Return: void*/public static <T, O> void copyProperties(Class<T> tClazz, Class<O> oClazz) {try {T target = tClazz.newInstance() ;O origin = oClazz.newInstance() ;//注冊(cè)日期類型轉(zhuǎn)換器ConvertUtils.register(new Converter() {@Overridepublic Object convert(Class type, Object value) {if(type != Date.class) {return null ;} if(value == null || "".equals(value.toString().trim())) {return null ;}SimpleDateFormat sdf = new SimpleDateFormat(FORMAT) ;Date date = null ;try {date = sdf.parse((String) value) ;} catch (ParseException e) {e.printStackTrace();}return date;}}, Date.class) ;//將源對(duì)象內(nèi)的屬性值復(fù)制到目標(biāo)對(duì)象的屬性上BeanUtils.copyProperties(target, origin) ;} catch (Exception e) {throw new RuntimeException(e) ;}} }

PropertyUtils的使用

???????這個(gè)類和 BeanUtils 類很多的方法在參數(shù)上都是相同的,但返回值不同。BeanUtils 著重于”Bean”,返回值通常是 String,而 PropertyUtils 著重于屬性,它的返回值通常是 Object。

???????在 PropertyUtils 中會(huì)區(qū)分為三種 method 狀態(tài):

  • Simple:如果你是用到 primitive 語(yǔ)法, 如 int, String 或其它自行開發(fā)的 objects 等等, 只需要單一的對(duì)象就可以取得數(shù)據(jù);
PropertyUtils.getSimpleProperty(Object bean, String name);
  • 1
  • Indexed:如果你是用到 Collection 或 List 實(shí)作出來的 objects , 只需要使用一個(gè) index 數(shù)值就可以取得數(shù)據(jù)的型態(tài);
PropertyUtils.getIndexedProperty(Object bean, String name); PropertyUtils.getIndexedProperty(Object bean, String name, int index); PropertyUtils.setIndexedProperty(Object bean, String name, Object value); PropertyUtils.setIndexedProperty(Object bean, String name, int index, Object value);
  • Mapped:如果你是用到 Map 延伸出來的 objects , 只需要使用一個(gè) key 值就可以取得數(shù)據(jù);
PropertyUtils.getMappedProperty(Object bean, String name); PropertyUtils.getMappedProperty(Object bean, String name, String key); PropertyUtils.setMappedProperty(Object bean, String name, Object value); PropertyUtils.setMappedProperty(Object bean, String name, String key, Object value);

但是如果你是巢狀(nested)的數(shù)據(jù)結(jié)構(gòu), 你該如何取得你要的數(shù)據(jù)呢?

PropertyUtils.getNestedProperty(Object bean, String name); PropertyUtils.setNestedProperty(Object bean, String name, Object value);

只需要簡(jiǎn)單地使用 “.”, 就可以得到你要的數(shù)據(jù)了。

ConstructorUtils的使用

???????這個(gè)類中的方法主要分成兩種,一種是得到構(gòu)造方法,一種是創(chuàng)建對(duì)象。事實(shí)上多數(shù)時(shí)候得到構(gòu)造方法的目的就是創(chuàng)建對(duì)象,這里只介紹一下創(chuàng)建對(duì)象。

//根據(jù)一個(gè) java.lang.Class 以及相應(yīng)的構(gòu)造方法的參數(shù),創(chuàng)建一個(gè)對(duì)象 static java.lang.Object ConstructorUtils.invokeConstructor(java.lang.Class klass, java.lang.Object[] args) ;

???????測(cè)試使用的JavaBean:

package com.study.java.domain;import java.io.Serializable;/** * @Name: Month * @Description: 測(cè)試JavaBean * @Author: XXX * @CreateDate: XXX * @Version: V1.0*/ public class Month implements Serializable {private static final long serialVersionUID = -3631848758000270789L;private String name ;private int value ;private int[] days = {11, 22, 33, 44, 55} ;public Month() {}public Month(String name, int value) {this.name = name;this.value = value;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}public int[] getDays() {return days;}public void setDays(int[] days) {this.days = days;}}

???????測(cè)試代碼:

Object obj=ConstructorUtils.invokeConstructor(Month.class, {new Integer(1), "Jan"}); Month month=(Month)obj; try { System.out.println(BeanUtils.getProperty(month,"value")); } catch (Exception e) {e.printStackTrace(); }

???????如果輸出證明,構(gòu)造方法的調(diào)用是成功的。?
???????如果需要強(qiáng)制指定構(gòu)造方法的參數(shù)類型,可以這樣調(diào)用:

Object[] args={new Integer(1), "Jan"}; Class[] argsType={int.class, String.class}; Object obj = null ; obj = ConstructorUtils.invokeExactConstructor(Month.class, args, argsType); //argsType 指定了參數(shù)的類型 Month month=(Month)obj; System.out.println(BeanUtils.getProperty(month,"value"));

???????補(bǔ)充:創(chuàng)建對(duì)象還有一個(gè)方法:invokeExactConstructor,該方法對(duì)參數(shù)要求更加嚴(yán)格,傳遞進(jìn)去的參數(shù)必須嚴(yán)格符合構(gòu)造方法的參數(shù)列表。例如:

Object[] args={new Integer(1), "Jan"}; Class[] argsType={int.class, String.class}; Object obj = null ; //下面這句調(diào)用將不會(huì)成功,因?yàn)?args[0]的類型為 Integer,而不是 int //obj = ConstructorUtils.invokeExactConstructor(Month.class, args); //這一句就可以,因?yàn)?argsType 指定了類型。 obj = ConstructorUtils.invokeExactConstructor(Month.class, args, argsType); Month month=(Month)obj; System.out.println(BeanUtils.getProperty(month,"value"));

MethodUtils的使用說明

???????與 ConstructorUtils 類似,不過調(diào)用的時(shí)候,通常需要再指定一個(gè) method name 的參數(shù)。

DynaClass/DynaBean

???????這似乎是BeanUtils中最有趣的部分之一了,很簡(jiǎn)單,簡(jiǎn)單到光看這兩個(gè)接口中的方法會(huì)不明白為什么要設(shè)計(jì)這兩個(gè)接口?不過看到ResultSetDynaClass后,就明白了。下面是java doc中的代碼:

ResultSet rs = ...; ResultSetDynaClass rsdc = new ResultSetDynaClass(rs); Iterator rows = rsdc.iterator(); while (rows.hasNext()) { DynaBean row = (DynaBean) rows.next(); ... process this row ... } rs.close();

???????原來這是一個(gè)ResultSet的包裝器,ResultSetDynaClass實(shí)現(xiàn)了DynaClass,它的iterator方法返回一個(gè)ResultSetIterator,則是實(shí)現(xiàn)了DynaBean接口。在獲得一個(gè)DynaBean之后,我們就可以用:

DynaBean row = (DynaBean) rows.next(); System.out.println(row.get("field1")); //field1是其中一個(gè)字段的名字

???????再看另一個(gè)類RowSetDynaClass的用法,代碼如下:

String driver="com.mysql.jdbc.Driver"; String url="jdbc:mysql://localhost/2hu?useUnicode=true&characterEncoding=GBK"; String username="root"; String password=""; Connection con=null; PreparedStatement ps=null; ResultSet rs=null; try { Class.forName(driver).newInstance();con = DriverManager.getConnection(url); ps=con.prepareStatement("select * from forumlist");rs=ps.executeQuery(); //先打印一下,用于檢驗(yàn)后面的結(jié)果。while(rs.next()){System.out.println(rs.getString("name"));}rs.beforeFirst();//這里必須用beforeFirst,因?yàn)镽owSetDynaClass只從當(dāng)前位置向前滾動(dòng) RowSetDynaClass rsdc = new RowSetDynaClass(rs); rs.close();ps.close(); List rows = rsdc.getRows();//返回一個(gè)標(biāo)準(zhǔn)的List,存放的是DynaBean for (int i = 0; i <rows.size(); i++) { DynaBean b=(DynaBean)rows.get(i); System.out.println(b.get("name")); } } catch (Exception e) {e.printStackTrace(); } finally {try {con.close();} catch (Exception e) {e.printStackTrace();} }

???????是不是很有趣?封裝了ResultSet的數(shù)據(jù),代價(jià)是占用內(nèi)存。如果一個(gè)表有10萬(wàn)條記錄,rsdc.getRows()就會(huì)返回10萬(wàn)個(gè)記錄。

???????需要注意的是ResultSetDynaClass和RowSetDynaClass的不同之處:

???????1. ResultSetDynaClass是基于Iterator的,一次只返回一條記錄,而RowSetDynaClass是基于List的,一次性返回全部記錄。直接影響是在數(shù)據(jù)比較多時(shí)ResultSetDynaClass會(huì)比較的快速, 而RowSetDynaClass需要將ResultSet中的全部數(shù)據(jù)都讀出來(并存儲(chǔ)在其內(nèi)部),會(huì)占用過多的內(nèi)存,并且速度也會(huì)比較慢。

??????? 2. ResultSetDynaClass一次只處理一條記錄,在處理完成之前,ResultSet不可以關(guān)閉。

??????? 3. ResultSetIterator的next()方法返回的DynaBean其實(shí)是指向其內(nèi)部的一個(gè)固定 對(duì)象,在每次next()之后,內(nèi)部的值都會(huì)被改變。這樣做的目的是節(jié)約內(nèi)存,如果你需要保存每次生成的DynaBean,就需要?jiǎng)?chuàng)建另一個(gè)DynaBean,并將數(shù)據(jù)復(fù)制過去,下面也是java doc中的代碼:

ArrayList results = new ArrayList(); // To hold copied list ResultSetDynaClass rsdc = ...; DynaProperty properties[] = rsdc.getDynaProperties(); BasicDynaClass bdc = new BasicDynaClass("foo", BasicDynaBean.class, rsdc.getDynaProperties()); Iterator rows = rsdc.iterator(); while (rows.hasNext()) { DynaBean oldRow = (DynaBean) rows.next();DynaBean newRow = bdc.newInstance();PropertyUtils.copyProperties(newRow, oldRow);results.add(newRow); }

???????事實(shí)上DynaClass/DynaBean可以用于很多地方,存儲(chǔ)各種類型的數(shù)據(jù)。自己想吧。嘿嘿。

自定義的CustomRowSetDynaClass

???????兩年前寫過一個(gè)與RowSetDynaClass目標(biāo)相同的類,不過多一個(gè)功能,就是分頁(yè),只取需要的數(shù)據(jù),這樣內(nèi)存占用就會(huì)減少。先看一段代碼:

String driver="com.mysql.jdbc.Driver"; String url="jdbc:mysql://localhost/2hu?useUnicode=true&characterEncoding=GBK"; String username="root"; String password=""; Connection con=null; PreparedStatement ps=null; ResultSet rs=null; try { Class.forName(driver).newInstance();con = DriverManager.getConnection(url); ps=con.prepareStatement("select * from forumlist order by name"); rs=ps.executeQuery();/* while(rs.next()){ System.out.println(rs.getString("name")); }rs.beforeFirst();*///第二個(gè)參數(shù)表示第幾頁(yè),第三個(gè)參數(shù)表示頁(yè)的大小CustomRowSetDynaClass rsdc = new CustomRowSetDynaClass(rs, 2, 5);//RowSetDynaClass rsdc = new RowSetDynaClass(rs); rs.close(); ps.close(); List rows = rsdc.getRows(); for (int i = 0; i <rows.size(); i++) { DynaBean b=(DynaBean)rows.get(i); System.out.println(b.get("name")); } } catch (Exception e) { e.printStackTrace(); }finally{try { con.close(); } catch (Exception e) {e.printStackTrace(); } }

???????在這里用到了一個(gè)CustomRowSetDynaClass類,構(gòu)造方法中增加了page和pageSize兩個(gè)參數(shù),這樣,不管數(shù)據(jù)庫(kù)里有多少條記錄,最多只取pageSize條記錄,若pageSize==-1,則功能和RowSetDynaClass一樣。這在大多數(shù)情況下是適用的。該類的代碼如下:

package com.study.java.utils;import java.io.Serializable; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import org.apache.commons.beanutils.BasicDynaBean; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.DynaClass; import org.apache.commons.beanutils.DynaProperty;/** * @Name: CustomRowSetDynaClass * @Description: 自定義CustomRowSetDynaClass * @Author: XXX * @CreateDate: XXX * @Version: V1.0*/ public class CustomRowSetDynaClass implements DynaClass, Serializable {protected boolean lowerCase = true;protected int page = 1;protected int pageSize = -1;protected DynaProperty properties[] = null;protected Map propertiesMap = new HashMap();protected List rows = new ArrayList();public CustomRowSetDynaClass(ResultSet resultSet) throws SQLException {this(resultSet, true) ;}public CustomRowSetDynaClass(ResultSet resultSet, boolean lowerCase) throws SQLException {this(resultSet, 1, -1, lowerCase) ;}public CustomRowSetDynaClass(ResultSet resultSet, int i, int j,boolean lowerCase) {if(resultSet ==null) {throw new NullPointerException() ;}this.lowerCase = lowerCase;this.page = page;this.pageSize = pageSize;try {introspect(resultSet);copy(resultSet);} catch (SQLException e) {e.printStackTrace();}}public CustomRowSetDynaClass(ResultSet resultSet, int page, int pageSize) throws SQLException {this(resultSet, page, pageSize, true);}public DynaProperty[] getDynaProperties() {return (properties);}public DynaProperty getDynaProperty(String name) {if (name == null) {throw new IllegalArgumentException("No property name specified");}return ((DynaProperty) propertiesMap.get(name));}public String getName() {return (this.getClass().getName());}public DynaBean newInstance() throws IllegalAccessException,InstantiationException {throw new UnsupportedOperationException("newInstance() not supported");}public List getRows() {return (this.rows);}protected void copy(ResultSet resultSet) throws SQLException {int abs = 0;int rowsCount = 0;int currentPageRows = 0;resultSet.last();rowsCount = resultSet.getRow();if (pageSize != -1) {int totalPages = (int) Math.ceil(((double) rowsCount) / pageSize);if (page > totalPages)page = totalPages;if (page < 1)page = 1;abs = (page - 1) * pageSize;} else {pageSize = rowsCount;if (abs == 0)resultSet.beforeFirst();elseresultSet.absolute(abs);while (resultSet.next() && ++currentPageRows <= pageSize) {DynaBean bean = new BasicDynaBean(this);for (int i = 0; i < properties.length; i++) {String name = properties[i].getName();bean.set(name, resultSet.getObject(name));}rows.add(bean);}}}protected void introspect(ResultSet resultSet) throws SQLException {ArrayList list = new ArrayList();ResultSetMetaData metadata = resultSet.getMetaData();int n = metadata.getColumnCount();for (int i = 1; i <= n; i++) { // JDBC is one-relative!DynaProperty dynaProperty = createDynaProperty(metadata, i);if (dynaProperty != null) {list.add(dynaProperty);}}} }

總結(jié)

以上是生活随笔為你收集整理的Common-BeanUtils 使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。