亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

BeanUtils工具

2019-11-14 22:12:22
字體:
來源:轉載
供稿:網友
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的參數

    @Test    public 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,Float        BeanUtils.set

對比一下,我們發現,使用BeanUtils里賦值好像更麻煩。。。但這只是在這段代碼中而已,運用BeanUtils上面代碼的這個功能,

我們可以寫出一個通用的方法,可以把請求中的參數拷貝到javaBean對象中!

約定前提: 請求中的參數名稱 需要和javabean的屬性名稱保持一致?。。。ublic 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對象中

@Test    public 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中

@Test    public 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對象中獲取

元數據信息:結果集的列數,以及每列的名稱

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

獲取數據庫的元數據
    @Test    public 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 block            e.printStackTrace();        }        }

這個和beanutils沒什么關系,所以不是重點。

獲取參數元數據
    PreparedStatement sta=null;    Connection conn=null;    @Test    public void Test2()    {        //獲取連接池        ComboPooledDataSource pool = new ComboPooledDataSource();        try {            //獲取連接             conn = pool.getConnection();            //準備SQL語句            String sql ="insert into student(sid,sname) values(?,?)";            //獲得Statement             sta = 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 block            e.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 block                        e.printStackTrace();                    }                }            }        }    }

以上就是使用元數據來對預編譯的SQL語句來進行方便的參數賦值的方法~當參數比較多的時候,我們就不必一個一個地自己賦值,可以利用循環來給它賦值。

獲取結果集的元數據

我們先發送一個查詢語句獲得一個結果集,然后可以利用元數據來很方便地封裝結果集返回的結果~

    @Test    public 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 block            e.printStackTrace();        }            }    

這就完成了~

優缺點

優點:比較通用

缺點:就是每次調用這兩個方法都要在內部生產一個連接池,這樣一個連接池來完成一條語句是十分浪費的,所以這一點可以改進~改進方法也比較簡單~這里就不演示了~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人精品午夜在线观看| 日韩av电影在线网| 欧美在线视频播放| 日本精品视频在线播放| 中文字幕在线国产精品| 亚洲黄色www网站| 国产午夜精品一区二区三区| 欧美精品午夜视频| 日韩av综合中文字幕| 久久久久久久久久久免费精品| 亚洲精品国产精品国自产观看浪潮| 亚洲精品动漫100p| 97在线精品视频| 日韩欧美精品免费在线| 亚洲欧美国产精品| 国产成人自拍视频在线观看| 国产精品嫩草影院一区二区| 国产成人综合精品| 欧美最猛性xxxxx(亚洲精品)| 国产精品视频久久久久| 成人午夜在线视频一区| 最好看的2019年中文视频| 91久久精品日日躁夜夜躁国产| 国产美女精品视频| 性夜试看影院91社区| 欧美成人精品一区二区三区| 欧美精品激情blacked18| 国产伊人精品在线| 欧美精品久久久久久久免费观看| 最近中文字幕mv在线一区二区三区四区| 国产成人综合久久| 国产日产久久高清欧美一区| 亚洲丁香久久久| 亚洲黄页视频免费观看| 96国产粉嫩美女| 日韩中文字幕在线播放| 亚洲网站视频福利| 欧美极品第一页| 亚洲精品久久久久久久久久久久久| 18性欧美xxxⅹ性满足| 亚洲天堂第二页| 国产精品久久精品| 国产精品丝袜久久久久久高清| 久久香蕉国产线看观看av| 亚洲欧美激情精品一区二区| 国产成人精品在线| 欧美在线观看网站| 国产精品永久在线| 欧美精品video| 久久99视频精品| 国产精品福利在线观看| 国产偷亚洲偷欧美偷精品| 亚洲国产一区二区三区在线观看| 亚洲欧美国产一本综合首页| 日韩性生活视频| 日韩成人激情在线| 国产欧美一区二区三区在线看| 国产精品自拍网| 中文字幕欧美视频在线| 日韩高清av一区二区三区| 91香蕉嫩草神马影院在线观看| 久色乳综合思思在线视频| 精品福利免费观看| 2018日韩中文字幕| 日韩精品高清视频| 性夜试看影院91社区| 成人中文字幕+乱码+中文字幕| 欧美黑人视频一区| 成人两性免费视频| 亚洲成色777777在线观看影院| 精品国产欧美成人夜夜嗨| 亚洲福利视频久久| 亚洲欧洲黄色网| 久久久精品中文字幕| 欧美黑人性猛交| 欲色天天网综合久久| 26uuu亚洲国产精品| 7m精品福利视频导航| 欧美精品videos性欧美| 欧美成人免费小视频| 成人激情视频小说免费下载| 亚洲精品久久久久中文字幕二区| 亚洲国产成人精品一区二区| 欧美午夜激情视频| 亚洲欧洲成视频免费观看| 亚洲三级黄色在线观看| 精品日韩中文字幕| 中文字幕av一区二区三区谷原希美| 日韩欧美一区二区在线| zzijzzij亚洲日本成熟少妇| 久久国产精品亚洲| 国产精品亚洲欧美导航| 亚洲美女免费精品视频在线观看| 日韩美女在线观看| 欧美日韩在线免费| 欧美另类xxx| 国产亚洲精品美女久久久久| 日韩黄在线观看| 国产精品免费在线免费| 欧美日韩国产丝袜另类| www.午夜精品| 蜜臀久久99精品久久久无需会员| 国语自产精品视频在线看抢先版图片| 欧美日韩精品在线观看| 原创国产精品91| 欧美日韩国产中文精品字幕自在自线| 国产一区二区在线播放| 4k岛国日韩精品**专区| 国产精品高潮在线| 亚洲最大成人在线| 亚洲天堂网在线观看| 日韩精品免费电影| 亚洲女人初尝黑人巨大| 亚洲一区二区中文| 欧美整片在线观看| 国产日韩欧美在线播放| 久久九九亚洲综合| 国产精品自产拍在线观看中文| 国产精品极品在线| 国产欧美欧洲在线观看| 在线播放国产一区中文字幕剧情欧美| 中文字幕精品影院| 韩国三级日本三级少妇99| 米奇精品一区二区三区在线观看| 91亚洲精华国产精华| 国产日韩中文在线| 亚洲精品国产综合区久久久久久久| 亚洲日本欧美中文幕| 久久久久久久久亚洲| 日韩a**中文字幕| 亚洲精品福利免费在线观看| 7777免费精品视频| 日本精品免费一区二区三区| 日本91av在线播放| 欧美日韩国产区| 日韩精品在线视频观看| 91欧美精品午夜性色福利在线| 日韩欧美精品中文字幕| 国产精品精品一区二区三区午夜版| 日韩国产一区三区| 91精品视频在线| 国产999精品久久久| 成人精品一区二区三区电影黑人| 2019中文字幕免费视频| 国内精品久久久久影院优| 日韩精品视频中文在线观看| 欧美激情国产高清| 亚洲精品综合精品自拍| 亚洲国产精品资源| 欧美性精品220| 欧美丰满少妇xxxxx做受| 4444欧美成人kkkk| 日韩欧美福利视频| 97精品国产97久久久久久免费| 精品国产一区二区三区久久狼5月| 亚洲女人被黑人巨大进入| 国产成人综合av| 成人免费看片视频| 91国产高清在线| 日本中文字幕久久看| 欧美日韩视频在线| 久久久精品亚洲| 亚洲欧洲日产国产网站| 国产精品色悠悠|