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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BeanUtils 用法

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

什么是BeanUtils工具

BeanUtils工具是一種方便我們對(duì)JavaBean進(jìn)行操作的工具,是Apache組織下的產(chǎn)品。

?

BeanUtils工具一般可以方便javaBean的哪些操作?

1)beanUtils?可以便于對(duì)javaBean的屬性進(jìn)行賦值。

2)beanUtils?可以便于對(duì)javaBean的對(duì)象進(jìn)行賦值。

3)beanUtils可以將一個(gè)MAP集合的數(shù)據(jù)拷貝到一個(gè)javabean對(duì)象中。

?

BeanUtils的使用

使用beanUtils按照以下步驟~

?

前提:約定前提:?參數(shù)名稱?需要和javabean的屬性名稱保持一致!!!!

?

步驟一

導(dǎo)包:導(dǎo)入commons-beanutils-1.8.3?包

與?commons-logging-1.1.3?包

?

步驟二

寫代碼使用~下面就來演示下常見的用法

1)設(shè)置javaBean的參數(shù)

?

@Testpublic void test1() throws Exception{//先演示一下不用工具時(shí)的做法//1.生成對(duì)象Student s = new Student();/*2.通過set方法賦值s.setId(1);s.setName("VN");s.setAge(19);s.setClassID(5);s.setBirthday(new Date());用以上這種方法來給對(duì)象的屬性賦值實(shí)在是太麻煩了,下面我們用BeanUtils來進(jìn)行賦值*///1.得到j(luò)avaBean的一個(gè)字節(jié)碼對(duì)象Class clazz = Class.forName("com.vmaxtam.beanutiltest.Student");//2.生成該字節(jié)碼的一個(gè)對(duì)象Object obj = clazz.newInstance();//4.注冊(cè)一個(gè)日期格式轉(zhuǎn)換器ConvertUtils.register(new DateLocaleConverter(), java.util.Date.class);//3.使用工具對(duì)該對(duì)象進(jìn)行賦值//注意: 對(duì)于基本數(shù)據(jù)類型,beanutils工具進(jìn)行自動(dòng)類型轉(zhuǎn)換。把String自動(dòng)轉(zhuǎn)成Integer,Double,FloatBeanUtils.setProperty(obj, "id", "1");BeanUtils.setProperty(obj, "name", "VN");BeanUtils.setProperty(obj, "age", "19");BeanUtils.setProperty(obj, "classID", "5");//如果要使用特殊的日期類型,則String->Date 不能自動(dòng)轉(zhuǎn)換,這時(shí)候就要注冊(cè)一個(gè)轉(zhuǎn)換器BeanUtils.setProperty(obj, "birthday", "1996-06-06");System.out.println(obj); }

?

對(duì)比一下,我們發(fā)現(xiàn),使用BeanUtils里賦值好像更麻煩。。。但這只是在這段代碼中而已,運(yùn)用BeanUtils上面代碼的這個(gè)功能,

我們可以寫出一個(gè)通用的方法,可以把請(qǐng)求中的參數(shù)拷貝到j(luò)avaBean對(duì)象中!

?

約定前提: 請(qǐng)求中的參數(shù)名稱 需要和javabean的屬性名稱保持一致!!!! public static <T>T requestToBean(HttpServletRequest request , Class<T> clazz){//創(chuàng)建javaBean對(duì)象 Object obj=null;try {obj=clazz.newInstance();} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}//得到請(qǐng)求中的每個(gè)參數(shù)Enumeration<String> enu = request.getParameterNames();while(enu.hasMoreElements()){//獲得參數(shù)名String name = enu.nextElement();//獲得參數(shù)值String value = request.getParameter(name);//然后把參數(shù)拷貝到j(luò)avaBean對(duì)象中try {BeanUtils.setProperty(obj, name, value);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}return (T)obj;}

?

上面這個(gè)方法是一個(gè)泛型方法,傳不同的javaBean進(jìn)去都可以從request中獲取參數(shù)值。在一個(gè)工程較大的項(xiàng)目中,如果使用這個(gè)通用的方法,就能節(jié)省很多代碼。

2)把一個(gè)javaBean的屬性拷貝到另一個(gè)javaBean對(duì)象中

?

@Testpublic void test2() throws Exception{//1.生成對(duì)象Student s1 = new Student();Student s2 = new Student();//2.通過set方法賦值s1.setId(1);s1.setName("VN");//s1.setAge(19);//基本數(shù)據(jù)類型可以為null,null也能拷貝s1.setClassID(5);s1.setBirthday(new Date());//特殊類型不能為null//需求:把s1的屬性值拷貝到S2中,注意參數(shù)的順序BeanUtils.copyProperties(s2, s1);System.out.println(s1);System.out.println(s2); }

?

一句代碼就完成拷貝了,不用像以前那樣先用get()方法把s1的屬性值拿出來,再用set()方法供給s2屬性賦值

3)把一個(gè)map集合中的數(shù)據(jù)拷貝到j(luò)avaBean中

?

@Testpublic void test3() throws Exception{//1.生成對(duì)象Map<String,Object> map = new HashMap<String,Object>();//2.給一些參數(shù)map.put("id", 2);map.put("name", "EZ");map.put("age", 22);map.put("classID", 3);map.put("birthday", new Date());//需求:把map的屬性值拷貝到S中Student s = new Student();BeanUtils.copyProperties(s, map);System.out.println(s);}

?

上面這個(gè)也是一步到位,也是使用copyProperties()這個(gè)方法來完成,這樣減少了我們很多的操作了,十分簡(jiǎn)便。

?

?

下面介紹一個(gè)新的概念,學(xué)會(huì)這個(gè)東西后,它能夠和beanUtils組合寫出更多的通用代碼!方便我們的項(xiàng)目!

元數(shù)據(jù)(MetaData)

什么是數(shù)據(jù)庫的元數(shù)據(jù)

數(shù)據(jù)庫中的元數(shù)據(jù)有三種:

?

1)數(shù)據(jù)庫元數(shù)據(jù)(DatabaseMetaData):可以從connection對(duì)象中獲取。

這些元數(shù)據(jù)的信息包括:當(dāng)前使用什么數(shù)據(jù)庫,數(shù)據(jù)庫的版本,數(shù)據(jù)庫驅(qū)動(dòng)的版本

?

2)參數(shù)元數(shù)據(jù)(ParameterMetaData):可以從PreparedStatement中獲取,指sql語句中的參數(shù)

元數(shù)據(jù)的信息:參數(shù)的個(gè)數(shù),以及每個(gè)參數(shù)的類型

?

3)結(jié)果集元數(shù)據(jù)(ResultSetMetaData):可以從ResultSet對(duì)象中獲取

元數(shù)據(jù)信息:結(jié)果集的列數(shù),以及每列的名稱

?

下面就來顯示下怎么獲取這些信息吧~

獲取數(shù)據(jù)庫的元數(shù)據(jù)

@Testpublic void Test1(){//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();try {//獲取連接Connection conn = pool.getConnection();//獲取數(shù)據(jù)庫元數(shù)據(jù)DatabaseMetaData md = conn.getMetaData();//獲得數(shù)據(jù)庫的主版本和副版本int mj = md.getDatabaseMajorVersion();int mi =md.getDatabaseMinorVersion();System.out.println(mj + "."+ mi);//獲得驅(qū)動(dòng)版本int dmj = md.getDriverMajorVersion();int dmi = md.getDriverMinorVersion();System.out.println(dmj + "."+dmi);//當(dāng)前使用什么數(shù)據(jù)庫String b =md.getDatabaseProductName();System.out.println(b);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} }

這個(gè)和beanutils沒什么關(guān)系,所以不是重點(diǎn)。

獲取參數(shù)元數(shù)據(jù)

PreparedStatement sta=null;Connection conn=null;@Testpublic void Test2(){//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();try {//獲取連接conn = pool.getConnection();//準(zhǔn)備SQL語句String sql ="insert into student(sid,sname) values(?,?)";//獲得Statementsta = conn.prepareStatement(sql);//獲取元數(shù)據(jù)ParameterMetaData md = sta.getParameterMetaData();//獲取參數(shù)的一些信息:參數(shù)的個(gè)數(shù)int count = md.getParameterCount();//然后利用這個(gè)數(shù)來給參數(shù)賦值//方便參數(shù)賦值Object value[] = new Object[]{17,"VN"};for(int i = 0;i<count ;i++){sta.setObject(i+1, value[i]);}//執(zhí)行sta.executeUpdate();//有可能具體數(shù)據(jù)庫廠商不支持下面方法//System.out.println("第一個(gè)參數(shù)的類型:"+md.getParameterTypeName(1));} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//關(guān)閉資源if(sta!=null){try {sta.close();} catch (SQLException e) {e.printStackTrace();}if(conn!=null){try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}

以上就是使用元數(shù)據(jù)來對(duì)預(yù)編譯的SQL語句來進(jìn)行方便的參數(shù)賦值的方法~當(dāng)參數(shù)比較多的時(shí)候,我們就不必一個(gè)一個(gè)地自己賦值,可以利用循環(huán)來給它賦值。

?

獲取結(jié)果集的元數(shù)據(jù)

我們先發(fā)送一個(gè)查詢語句獲得一個(gè)結(jié)果集,然后可以利用元數(shù)據(jù)來很方便地封裝結(jié)果集返回的結(jié)果~

?

@Testpublic void Test3(){try {//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();//獲取連接conn = pool.getConnection();//準(zhǔn)備SQL語句String sql="select * from student";//獲得statement對(duì)象sta = conn.prepareStatement(sql);//執(zhí)行,返回結(jié)果集ResultSet res = sta.executeQuery();//獲取結(jié)果集的元素?fù)?jù)ResultSetMetaData rd = res.getMetaData();//利用元數(shù)據(jù)來封裝對(duì)象List<Students> list = new ArrayList<Students>();//獲得結(jié)果集的列數(shù)int colcount = rd.getColumnCount();//循環(huán)結(jié)果集來封裝對(duì)象while(res.next()){Students s = new Students();for(int i = 1; i <= colcount ; i++){//得到列名String colname = rd.getColumnName(i);//得到列值Object value = res.getObject(colname);//利用BeanUtils,放入對(duì)象中BeanUtils.setProperty(s, colname, value);}//把封裝好的對(duì)象放入集合list.add(s);}//然后可以對(duì)List其他操作~ } catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}//關(guān)閉資源}

?

這就是利用元數(shù)據(jù)和BeanUtil結(jié)合方便我們封裝結(jié)果集數(shù)據(jù)的一個(gè)例子了~利用這個(gè)特點(diǎn),我們可以寫出更多的通用的方法。

利用元數(shù)據(jù)和BeanUtil 編寫通用的 更新方法 和 查詢方法

?

以下就是一個(gè)通用的查詢方法

參數(shù)說明:

    sql:要預(yù)編譯的查詢語句

    values:把sql語句的參數(shù)放到這個(gè)數(shù)組中

    clazz:最后集合中返回的javaBean的類型

public static <T> List<T> query(String sql,Object[] values,Class<T> clazz){Connection conn = null;PreparedStatement sta = null;ResultSet res = null;try {//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();//獲取連接conn = pool.getConnection();//獲取statement對(duì)象,預(yù)編譯sta = conn.prepareStatement(sql); //利用參數(shù)的元數(shù)據(jù)給預(yù)編譯的SQL語句賦值ParameterMetaData pmd = sta.getParameterMetaData();//獲得參數(shù)個(gè)數(shù)int pcount = pmd.getParameterCount();//賦值if(values != null){for(int i=1 ;i<=pcount;i++){sta.setObject(i, values[i-1]);}}//執(zhí)行res = sta.executeQuery();//獲得結(jié)果集元數(shù)據(jù)ResultSetMetaData rsmd = res.getMetaData();//創(chuàng)建存儲(chǔ)對(duì)象的集合List<T> list = new ArrayList<T>();//獲取列的數(shù)量int colcount = rsmd.getColumnCount();//封裝對(duì)象while(res.next()){//生成要封裝的對(duì)象的實(shí)例Object obj = clazz.newInstance();for(int i=1;i<=colcount;i++){//獲得列名String colname = rsmd.getColumnName(i);//獲得列值Object colvalue = res.getObject(i);//封裝BeanUtils.setProperty(obj, colname, colvalue);}//把封裝好的對(duì)象放入集合list.add((T) obj);}return (List<T>)list; } catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}finally{//釋放資源if(res!=null){try {res.close();} catch (SQLException e1) {e1.printStackTrace();}}if(sta!=null){try {sta.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();//放回連接池} catch (SQLException e) {e.printStackTrace();}}} }

以上就是一個(gè)通用的查詢方法啦~下面來看一個(gè)通用的更新方法,比上面的簡(jiǎn)單~

通用的更新方法

public static void update(String sql,Object[] values){Connection conn =null;PreparedStatement sta = null;try {//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();//獲取連接conn = pool.getConnection();//預(yù)編譯sta= conn.prepareStatement(sql);//獲取參數(shù)的元數(shù)據(jù)ParameterMetaData pmt = sta.getParameterMetaData();//獲取參數(shù)的個(gè)數(shù)int pcount = pmt.getParameterCount();//參數(shù)賦值for(int i = 1; i<=pcount;i++){sta.setObject(i, values[i-1]);}//執(zhí)行更新sta.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

這就完成了~

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):比較通用

缺點(diǎn):就是每次調(diào)用這兩個(gè)方法都要在內(nèi)部生產(chǎn)一個(gè)連接池,這樣一個(gè)連接池來完成一條語句是十分浪費(fèi)的,所以這一點(diǎn)可以改進(jìn)~改進(jìn)方法也比較簡(jiǎn)單~這里就不演示了~

總結(jié)

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

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