1. 程式人生 > >模擬實現MyBites中通過SQL反射實體類對象功能

模擬實現MyBites中通過SQL反射實體類對象功能

println sub var void mysql exc 模擬實現 obj 執行

話不多說,直接上幹貨!

package cn.test;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Timestamp;

import org.junit.Test;

import cn.core.domain.User;


public class UseMyBites { /** * 模擬MyBites根據sql動態創建對象. * @throws Exception */ @Test public void simulation() throws Exception{ //className應該是傳參或者是讀取配置文件讀出來的一個指定類型,這裏為了測試直接先寫死了。 String className="cn.core.domain.User"; //加載驅動,下面是jdbc的一段代碼 Class.forName("com.mysql.jdbc.Driver"); Connection conn
=DriverManager.getConnection("jdbc:mysql://192.168.1.68/base", "root", "root"); String sql="select * from base_user where user_id=?"; PreparedStatement ps=conn.prepareStatement(sql); ps.setString(1, "00a8ea6b8b524205bc0af1c3249abe54"); ResultSet rs=ps.executeQuery();
//循環獲取每行數據 while (rs.next()) { //每一行就表示一個對象,通過反射將實體類創建出來 Object object=Class.forName(className).newInstance(); //通過ResultSetMetaData這個對象獲取查詢語句的原始列名,列總數以及列的類型 ResultSetMetaData data=rs.getMetaData(); //獲取列總數 int count=data.getColumnCount(); //循環得到列名和列類型 for (int i = 1; i <= count; i++) { String column=data.getColumnName(i);//獲取列名 String typeName=data.getColumnTypeName(i);//獲取列類型 String setMethodName=bulidSetMethod(column);//獲取具體實體類中的set方法名 //根據列類型去獲取列數據,具體參考數據庫的類型將和rs.getXXX對應上去取值即可 if("VARCHAR".equals(typeName)){ String value=rs.getString(column);//取值 //通過方法名進行反射得到具體的方法對象 Method method=object.getClass().getMethod(setMethodName,String.class); //執行這個方法並對應的字段去賦值 method.invoke(object, value); }else if("DATETIME".equals(typeName)){//操作同上,只不過類型換成了時間類型 Timestamp value=rs.getTimestamp(column); Method method=object.getClass().getMethod(setMethodName,Timestamp.class); method.invoke(object, value); } //將數據庫的類型都列出來,剩余的和上述差不多就不一一寫出來了.... } //下面這塊就到了我們實際運用的過程了 這塊可以根據業務需要 返回會單個object或者是list User user=(User)object; System.out.println(user); } } /** * 將列名轉換成對應的set方法名. * @param columnName 列名 * @return set方法名 */ public String bulidSetMethod(String columnName){ String c1="set"; String c2=columnName.substring(0,1).toUpperCase(); String c3=columnName.substring(1); return c1+c2+c3; } }

OK,java中所有的持久化框架底層全是jdbc去實現的,那麽通過jdbc模擬一個MyBites主要是通過java反射的機制去實現的,通過反射sql的列名得到具體的set方法名,通過執行set方法給字段註入具體的值,所以框架本身並不難,只要想通了其中的點,其實實現起來也就幾行代碼而已。

模擬實現MyBites中通過SQL反射實體類對象功能