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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java实现自动映射原生JDBC查询出的数据库字段

發(fā)布時(shí)間:2023/12/31 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现自动映射原生JDBC查询出的数据库字段 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如今框架橫行,很多人用的得心應(yīng)手,可是很多人都沒有了解過底層的東西,導(dǎo)致往后去學(xué)習(xí)別的框架的時(shí)候就不會(huì)那么順利。就比如我們平時(shí)在寫代碼時(shí),都會(huì)用MyBatis或者JPA,但是你了解過他們是怎么匹配字段的嗎?如果突然不讓使用框架,你還能那么輕松的寫出來嗎。
在原生JDBC的場(chǎng)景下,我們?nèi)绾螌⒉樵兊淖侄巫詣?dòng)封裝到對(duì)象中呢?就是通過Java的反射實(shí)現(xiàn),這是一個(gè)很實(shí)用的技術(shù)。我們看一下下面的代碼
這是一個(gè)數(shù)據(jù)庫(kù)表對(duì)應(yīng)的類,其中使用有駝峰命名

@Data @TableName("t_admin") public class Admin implements Serializable {@TableId("username")private String username;//用戶名private String nickName;//用戶昵稱private String password;//用戶密碼private String email;//用戶郵箱private String avatar;//用戶頭像private String qq;private String weChat;private String weChatQrCode;//微信收款碼private String authorImage;//管理員主頁(yè)圖private String alipayQrCode;//管理員主頁(yè)圖private String weChatCode;//微信二維碼private Integer type;//用戶類型 }

對(duì)于這樣一個(gè)類或者數(shù)據(jù)庫(kù),我們當(dāng)然沒有感覺它有多繁瑣,可是當(dāng)不同的類和數(shù)據(jù)表,或者表很多表或者類時(shí),那將會(huì)怎么樣呢?是不是覺得不好寫,而且不容易維護(hù),一旦程序出現(xiàn)變動(dòng),整個(gè)映射都需要重新更改。那么我們來看一下如何通過反射實(shí)現(xiàn)字段映射封裝。

//可以封裝起來,傳入class或者對(duì)象 Admin admin;try {//這里可以通過反射創(chuàng)建admin = new Admin();String regex = "[A-Z]";//匹配駝峰規(guī)則Class.forName("com.mysql.cj.jdbc.Driver");Connection conn = DriverManager.getConnection(url, root, passwd);PreparedStatement ps = conn.prepareStatement("select * from t_admin where username = ? and password = ?");ps.setString(1, username);ps.setString(2, MyConfig.md5Code(password));ResultSet rs = ps.executeQuery();Class<? extends Admin> aClass = admin.getClass();Field[] fields = aClass.getDeclaredFields();//獲得class中的屬性StringBuilder sb = new StringBuilder();while (rs.next()) {//替換駝峰字符for (int i = 0; i < fields.length; i++) {for (int j = 0; j < fields[i].getName().length(); j++) {char ch = fields[i].getName().charAt(j);if ((ch + "").matches(regex)) {sb.append("_" + (ch + "").toLowerCase());} else {sb.append(ch);}}//破壞私有屬性fields[i].setAccessible(true);//這里可以根據(jù)字段進(jìn)行判斷,因?yàn)閿?shù)據(jù)庫(kù)字段是string和integer,所以只判斷兩個(gè)類//這句代碼的意思是判斷兩個(gè)類型是否是一個(gè)類型,可以根據(jù)自己的數(shù)據(jù)庫(kù)進(jìn)行編寫(注意原始數(shù)據(jù)類型即可)boolean b = String.class.isAssignableFrom(fields[i].getType());if (b) {fields[i].set(admin, rs.getString(sb.toString()));} else {fields[i].set(admin, rs.getInt(sb.toString()));}//重置sb(StringBuilder線程不安全,如果在多線程下請(qǐng)使用StringBuffer)sb.setLength(0);}}rs.close();ps.close();conn.close();System.out.println(admin);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} catch (IllegalAccessException e) {throw new RuntimeException(e);}

注意需要導(dǎo)入mysql驅(qū)動(dòng)

是不是覺得很簡(jiǎn)單

總結(jié)

以上是生活随笔為你收集整理的Java实现自动映射原生JDBC查询出的数据库字段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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