1. 程式人生 > >對於Hibernate的底層淺談

對於Hibernate的底層淺談

equal pass set方法 lena session cut try main throw

哇,我發現忙起來真的是沒有時間來寫,最近在學框架,感覺特別有興趣,對於框架的感激就是又恨又愛的感覺,hibernate,沒有研究太深,模擬的寫了一點底層的實現,其實就是發射吧,我沒有追蹤源碼去看,就是簡單的模擬,哈哈哈,反射出原始類型的沒有寫現在再追struts的底層,上次我還信誓旦旦的說,年前能寫25篇,現在想說我錯了,哈哈哈哈

好了,代碼就寫了一點,都是我猜的,如果有不對的,大神們求帶

public class Session {
private static Map<String,String> map = new HashMap<String,String>();
private static final String driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/demo";
private static final String username = "root";
private static final String password = "0610";
//模擬底層save
public void save(Object obj) throws Exception{
String sql = generateSQL(obj);//調用生成sql語句的方法
System.out.println(sql);//打印sql語句
Class.forName(driver);
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
Set<String> keys = map.keySet();
int i = 1;//表示占位符的索引
for (String key : keys) {
//獲取屬性對應的get方法
Method m = obj.getClass().getMethod(map.get(key));
//通過反射調用get方法獲取屬性的值,作為占位符的值
ps.setObject(i, m.invoke(obj));
i++;//占位符+1
}
ps.executeUpdate();//指定插入語句
}

/**
* 生成sql語句的方法
* insert into 表名(列名,列名,...) values(?,?,...)
* @param obj
* @return
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static String generateSQL(Object obj) throws Exception{
//獲取實體類中所有的屬性
Field[] fields = obj.getClass().getDeclaredFields();
//向map中存放鍵值對:鍵是屬性名,也就是列名;值是屬性get方法的名字
for(int i = 0;i < fields.length;i++){
map.put(fields[i].getName(), "get" +fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1));
}
String columns = "";//存儲列名
String values = "";//存儲?
Set<String> keys = map.keySet();
for (String key : keys) {
columns = columns + key + ",";//拼接列名
values = values + "?,";
}
//截取最後的逗號
if(columns.endsWith(",")){
columns = columns.substring(0, columns.length()-1);
values = values.substring(0,values.length()-1);
}

//獲取實體類的表名
String tName = obj.getClass().getSimpleName();
//拼接sql語句
String sql = "insert into " + tName + "(" + columns + ") values(" + values + ")";
return sql;
}
//根據id生成sql語句
public String selectById(Class objClass) throws Exception{
//生成一個對象,
Constructor<?> construction =objClass.getConstructor();
Object object=construction.newInstance();
//獲得所有的屬性,
Field[] fields = objClass.getDeclaredFields();
for(int i = 0;i < fields.length;i++){
map.put(fields[i].getName(), "set" +fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1));
}
String columns = "";//存儲列名
Set<String> keys = map.keySet();
for (String key : keys) {
columns = columns + key + ",";//拼接列名
}
//所有的屬性的名字,
if(columns.endsWith(",")){
columns = columns.substring(0, columns.length()-1);

}
//獲取實體類的表名
String tName = objClass.getSimpleName();
//拼接sql語句
String sql = " select " + columns + " from "+ tName +" where mid =? ";
return sql;

}

//根據class對象和id進行查詢
public Object get(Class<?> objClass,Long id) {
Constructor<?> cons=null;
Object obj=null;
try {
cons = objClass.getConstructor();
obj=cons.newInstance();
String sql = selectById(objClass);//調用生成sql語句的方法
System.out.println(sql);//打印sql語句
Class.forName(driver);
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
//執行方法進行獲得結果集
ps.setObject(1, id);
//進行查詢
ResultSet rs = ps.executeQuery();
while(rs.next()){
//對對象進行封裝
Set<String> keys = map.keySet();
for (String key : keys) {
Object o= rs.getObject(key);
Method m = objClass.getMethod(map.get(key),new Class<?>[]{o.getClass()});
//執行對象的set方法
m.invoke(obj,o);
}

}
System.out.println(obj);
} catch (Exception e) {

}
return obj;
}

//根據id進行刪除
public void delete(Object obj){
//根據id進行刪除
Class objClass=obj.getClass();
String sql="";
//獲取對象的id
Field[] fields = objClass.getDeclaredFields();
for(int i=0;i<fields.length;i++){
if("mid".equalsIgnoreCase(fields[i].getName())){
//進行執行刪除操作
String name = objClass.getSimpleName();
//獲得該屬性的值,
String setterName="get" +fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1);
//獲得getter的方法
Method method;
try {
method = objClass.getMethod(setterName);
Object id = method.invoke(obj);
sql=" delete from "+name+" where mid= ? ";
System.out.println(sql);
Class.forName(driver);
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql);
//執行方法進行獲得結果集
ps.setObject(1, id);
ps.executeUpdate();
System.out.println("刪除成功");
}catch (Exception e) {
e.printStackTrace();
}

}
}
}

//刪除main方法測試
public static void main(String[] args) {
Session session=new Session();
Object object = session.get(Customer.class, 1L);
session.delete(object);

}

/*//查詢main方法進行測試
public static void main(String[] args) {

Session session =new Session();
try {
Object object = session.get(Customer.class, 1L);
} catch (Exception e) {
e.printStackTrace();
}

}*/

//添加的測試
/*public static void main(String[] args) throws Exception {
Session session = new Session();

Customer customer = new Customer();
customer.setMid(1111L);
customer.setName("阿裏巴巴");
customer.setAddress("杭州");

session.save(customer);
}
*/


}

對於Hibernate的底層淺談