Java实现自动映射原生JDBC查询出的数据库字段
生活随笔
收集整理的這篇文章主要介紹了
Java实现自动映射原生JDBC查询出的数据库字段
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如今框架橫行,很多人用的得心應手,可是很多人都沒有了解過底層的東西,導致往后去學習別的框架的時候就不會那么順利。就比如我們平時在寫代碼時,都會用MyBatis或者JPA,但是你了解過他們是怎么匹配字段的嗎?如果突然不讓使用框架,你還能那么輕松的寫出來嗎。
在原生JDBC的場景下,我們如何將查詢的字段自動封裝到對象中呢?就是通過Java的反射實現,這是一個很實用的技術。我們看一下下面的代碼
這是一個數據庫表對應的類,其中使用有駝峰命名
對于這樣一個類或者數據庫,我們當然沒有感覺它有多繁瑣,可是當不同的類和數據表,或者表很多表或者類時,那將會怎么樣呢?是不是覺得不好寫,而且不容易維護,一旦程序出現變動,整個映射都需要重新更改。那么我們來看一下如何通過反射實現字段映射封裝。
//可以封裝起來,傳入class或者對象 Admin admin;try {//這里可以通過反射創建admin = new Admin();String regex = "[A-Z]";//匹配駝峰規則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);//這里可以根據字段進行判斷,因為數據庫字段是string和integer,所以只判斷兩個類//這句代碼的意思是判斷兩個類型是否是一個類型,可以根據自己的數據庫進行編寫(注意原始數據類型即可)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線程不安全,如果在多線程下請使用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);}注意需要導入mysql驅動
是不是覺得很簡單
總結
以上是生活随笔為你收集整理的Java实现自动映射原生JDBC查询出的数据库字段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 防范蠕虫式勒索软件病毒攻击的安全预警通告
- 下一篇: Java中映射怎么实现_Java中的映射