BeanUtils 用法
什么是BeanUtils工具
BeanUtils工具是一種方便我們對JavaBean進行操作的工具,是Apache組織下的產品。
?
BeanUtils工具一般可以方便javaBean的哪些操作?
1)beanUtils?可以便于對javaBean的屬性進行賦值。
2)beanUtils?可以便于對javaBean的對象進行賦值。
3)beanUtils可以將一個MAP集合的數據拷貝到一個javabean對象中。
?
BeanUtils的使用
使用beanUtils按照以下步驟~
?
前提:約定前提:?參數名稱?需要和javabean的屬性名稱保持一致!!!!
?
步驟一
導包:導入commons-beanutils-1.8.3?包
與?commons-logging-1.1.3?包
?
步驟二
寫代碼使用~下面就來演示下常見的用法
1)設置javaBean的參數
?
@Testpublic void test1() throws Exception{//先演示一下不用工具時的做法//1.生成對象Student s = new Student();/*2.通過set方法賦值s.setId(1);s.setName("VN");s.setAge(19);s.setClassID(5);s.setBirthday(new Date());用以上這種方法來給對象的屬性賦值實在是太麻煩了,下面我們用BeanUtils來進行賦值*///1.得到javaBean的一個字節碼對象Class clazz = Class.forName("com.vmaxtam.beanutiltest.Student");//2.生成該字節碼的一個對象Object obj = clazz.newInstance();//4.注冊一個日期格式轉換器ConvertUtils.register(new DateLocaleConverter(), java.util.Date.class);//3.使用工具對該對象進行賦值//注意: 對于基本數據類型,beanutils工具進行自動類型轉換。把String自動轉成Integer,Double,FloatBeanUtils.setProperty(obj, "id", "1");BeanUtils.setProperty(obj, "name", "VN");BeanUtils.setProperty(obj, "age", "19");BeanUtils.setProperty(obj, "classID", "5");//如果要使用特殊的日期類型,則String->Date 不能自動轉換,這時候就要注冊一個轉換器BeanUtils.setProperty(obj, "birthday", "1996-06-06");System.out.println(obj); }?
對比一下,我們發現,使用BeanUtils里賦值好像更麻煩。。。但這只是在這段代碼中而已,運用BeanUtils上面代碼的這個功能,
我們可以寫出一個通用的方法,可以把請求中的參數拷貝到javaBean對象中!
?
約定前提: 請求中的參數名稱 需要和javabean的屬性名稱保持一致!!!! public static <T>T requestToBean(HttpServletRequest request , Class<T> clazz){//創建javaBean對象 Object obj=null;try {obj=clazz.newInstance();} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}//得到請求中的每個參數Enumeration<String> enu = request.getParameterNames();while(enu.hasMoreElements()){//獲得參數名String name = enu.nextElement();//獲得參數值String value = request.getParameter(name);//然后把參數拷貝到javaBean對象中try {BeanUtils.setProperty(obj, name, value);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}return (T)obj;}?
上面這個方法是一個泛型方法,傳不同的javaBean進去都可以從request中獲取參數值。在一個工程較大的項目中,如果使用這個通用的方法,就能節省很多代碼。
2)把一個javaBean的屬性拷貝到另一個javaBean對象中
?
@Testpublic void test2() throws Exception{//1.生成對象Student s1 = new Student();Student s2 = new Student();//2.通過set方法賦值s1.setId(1);s1.setName("VN");//s1.setAge(19);//基本數據類型可以為null,null也能拷貝s1.setClassID(5);s1.setBirthday(new Date());//特殊類型不能為null//需求:把s1的屬性值拷貝到S2中,注意參數的順序BeanUtils.copyProperties(s2, s1);System.out.println(s1);System.out.println(s2); }?
一句代碼就完成拷貝了,不用像以前那樣先用get()方法把s1的屬性值拿出來,再用set()方法供給s2屬性賦值
3)把一個map集合中的數據拷貝到javaBean中
?
@Testpublic void test3() throws Exception{//1.生成對象Map<String,Object> map = new HashMap<String,Object>();//2.給一些參數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);}?
上面這個也是一步到位,也是使用copyProperties()這個方法來完成,這樣減少了我們很多的操作了,十分簡便。
?
?
下面介紹一個新的概念,學會這個東西后,它能夠和beanUtils組合寫出更多的通用代碼!方便我們的項目!
元數據(MetaData)
什么是數據庫的元數據
數據庫中的元數據有三種:
?
1)數據庫元數據(DatabaseMetaData):可以從connection對象中獲取。
這些元數據的信息包括:當前使用什么數據庫,數據庫的版本,數據庫驅動的版本
?
2)參數元數據(ParameterMetaData):可以從PreparedStatement中獲取,指sql語句中的參數
元數據的信息:參數的個數,以及每個參數的類型
?
3)結果集元數據(ResultSetMetaData):可以從ResultSet對象中獲取
元數據信息:結果集的列數,以及每列的名稱
?
下面就來顯示下怎么獲取這些信息吧~
獲取數據庫的元數據
@Testpublic void Test1(){//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();try {//獲取連接Connection conn = pool.getConnection();//獲取數據庫元數據DatabaseMetaData md = conn.getMetaData();//獲得數據庫的主版本和副版本int mj = md.getDatabaseMajorVersion();int mi =md.getDatabaseMinorVersion();System.out.println(mj + "."+ mi);//獲得驅動版本int dmj = md.getDriverMajorVersion();int dmi = md.getDriverMinorVersion();System.out.println(dmj + "."+dmi);//當前使用什么數據庫String b =md.getDatabaseProductName();System.out.println(b);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} }這個和beanutils沒什么關系,所以不是重點。
獲取參數元數據
PreparedStatement sta=null;Connection conn=null;@Testpublic void Test2(){//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();try {//獲取連接conn = pool.getConnection();//準備SQL語句String sql ="insert into student(sid,sname) values(?,?)";//獲得Statementsta = conn.prepareStatement(sql);//獲取元數據ParameterMetaData md = sta.getParameterMetaData();//獲取參數的一些信息:參數的個數int count = md.getParameterCount();//然后利用這個數來給參數賦值//方便參數賦值Object value[] = new Object[]{17,"VN"};for(int i = 0;i<count ;i++){sta.setObject(i+1, value[i]);}//執行sta.executeUpdate();//有可能具體數據庫廠商不支持下面方法//System.out.println("第一個參數的類型:"+md.getParameterTypeName(1));} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//關閉資源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();}}}}}以上就是使用元數據來對預編譯的SQL語句來進行方便的參數賦值的方法~當參數比較多的時候,我們就不必一個一個地自己賦值,可以利用循環來給它賦值。
?
獲取結果集的元數據
我們先發送一個查詢語句獲得一個結果集,然后可以利用元數據來很方便地封裝結果集返回的結果~
?
@Testpublic void Test3(){try {//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();//獲取連接conn = pool.getConnection();//準備SQL語句String sql="select * from student";//獲得statement對象sta = conn.prepareStatement(sql);//執行,返回結果集ResultSet res = sta.executeQuery();//獲取結果集的元素據ResultSetMetaData rd = res.getMetaData();//利用元數據來封裝對象List<Students> list = new ArrayList<Students>();//獲得結果集的列數int colcount = rd.getColumnCount();//循環結果集來封裝對象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,放入對象中BeanUtils.setProperty(s, colname, value);}//把封裝好的對象放入集合list.add(s);}//然后可以對List其他操作~ } catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}//關閉資源}?
這就是利用元數據和BeanUtil結合方便我們封裝結果集數據的一個例子了~利用這個特點,我們可以寫出更多的通用的方法。
利用元數據和BeanUtil 編寫通用的 更新方法 和 查詢方法
?
以下就是一個通用的查詢方法
參數說明:
sql:要預編譯的查詢語句
values:把sql語句的參數放到這個數組中
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對象,預編譯sta = conn.prepareStatement(sql); //利用參數的元數據給預編譯的SQL語句賦值ParameterMetaData pmd = sta.getParameterMetaData();//獲得參數個數int pcount = pmd.getParameterCount();//賦值if(values != null){for(int i=1 ;i<=pcount;i++){sta.setObject(i, values[i-1]);}}//執行res = sta.executeQuery();//獲得結果集元數據ResultSetMetaData rsmd = res.getMetaData();//創建存儲對象的集合List<T> list = new ArrayList<T>();//獲取列的數量int colcount = rsmd.getColumnCount();//封裝對象while(res.next()){//生成要封裝的對象的實例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);}//把封裝好的對象放入集合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();}}} }以上就是一個通用的查詢方法啦~下面來看一個通用的更新方法,比上面的簡單~
通用的更新方法
public static void update(String sql,Object[] values){Connection conn =null;PreparedStatement sta = null;try {//獲取連接池ComboPooledDataSource pool = new ComboPooledDataSource();//獲取連接conn = pool.getConnection();//預編譯sta= conn.prepareStatement(sql);//獲取參數的元數據ParameterMetaData pmt = sta.getParameterMetaData();//獲取參數的個數int pcount = pmt.getParameterCount();//參數賦值for(int i = 1; i<=pcount;i++){sta.setObject(i, values[i-1]);}//執行更新sta.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}這就完成了~
優缺點
優點:比較通用
缺點:就是每次調用這兩個方法都要在內部生產一個連接池,這樣一個連接池來完成一條語句是十分浪費的,所以這一點可以改進~改進方法也比較簡單~這里就不演示了~
總結
以上是生活随笔為你收集整理的BeanUtils 用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初学者必学:绘画初学者如何设计人物?
- 下一篇: 3.黑客常用端口利用总结