1. 程式人生 > >hibernate中的實體時怎麽反射成表

hibernate中的實體時怎麽反射成表

java反射機制 book types 名稱 數組 else zab dao ||

//封裝實體類

package common.dao;

public class BookDao {

private Integer bookId;
private String bookName;
private String bookAuth;
private int bookCount;


public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public String getBookName() {


return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuth() {
return bookAuth;
}
public void setBookAuth(String bookAuth) {
this.bookAuth = bookAuth;
}
public int getBookCount() {
return bookCount;
}
public void setBookCount(int bookCount) {

this.bookCount = bookCount;
}
}

package common.dao;

public class CarDao {

private Integer carId;
private String carName;
private Double carPrice;


public Integer getCarId() {
return carId;
}
public void setCarId(Integer carId) {
this.carId = carId;
}
public String getCarName() {
return carName;


}
public void setCarName(String carName) {
this.carName = carName;
}
public Double getCarPrice() {
return carPrice;
}
public void setCarPrice(Double carPrice) {
this.carPrice = carPrice;
}


}

//hbm,xml基本配置

<?xml version="1.0" encoding="UTF-8"?>
<mapping>
<class name="common.dao.BookDao" table="t_user">
<id name="bookId">
<generator class="increment"></generator>
<property name="bookName" column="book_Name"></property>
<property name="bookAuth" column="book_Auth"></property>
<property name="bookcount" column="book_Count"></property>
</id>
</class>
</mapping>

//有兩種配置方式

package dao;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import common.dao.BookDao;
import common.dao.CarDao;

public class TestDao {

/* public void save(Object obj) throws Exception{
Class<? extends Object> clazz = obj.getClass();
//System.out.println(clazz);
String name = clazz.getName();
Field field = clazz.getDeclaredField(name);
//getsimpleName 獲得類 的名稱 獲取類
String tableName = clazz.getSimpleName();
//System.out.println(tableName+" 1");
StringBuffer hql =new StringBuffer();
hql.append(" insert into "+tableName);
//System.out.println(clazz.getName()+" 2");
Field[] fields = clazz.getDeclaredFields();
StringBuffer value1=new StringBuffer();
StringBuffer value=new StringBuffer();
for (Field field : fields) {
value1.append(","+field.getName());
//獲取權限 1-5 2代表私有的 getName 類裏面的字段 getType字段的數據類型
//System.out.println(field.getModifiers()+"======"+field.getName()+"====="+field.getType());
Method method = clazz.getMethod(makeMethodName(field.getName()), null);
//System.out.println(method.getName());
Object invoke = method.invoke(obj, null);
System.out.println(method.getName()+":"+invoke);
if(invoke.getClass().getSimpleName().equals("String")){
invoke="‘"+invoke+"‘";
}
value.append(","+invoke);

}
//System.out.println(value.substring(1));
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method +" 3");
}
hql.append(" ( "+value1.toString().substring(1)+" )");
hql.append(" values("+value.toString().substring(1)+" )");
System.out.println(hql.toString());
}
//拼接私有化的get對象方法
private String makeMethodName(String fieldName) {
return "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
}*/

private static Map<String, Object> mapping = new HashMap<String, Object>();

static {
mapping.put("common.dao.BookDao", "t_book");
mapping.put("bookId", "book_Id");
mapping.put("bookName", "book_Name");
mapping.put("bookAuth", "book_Auth");
mapping.put("bookCount", "book_Count");
}

public static void save(Object obj) throws Exception{
//System.out.println(mapping.get("common.dao.BookDao"));
Class<? extends Object> clazz = obj.getClass();
String tableName = (String) mapping.get(clazz.getName());
StringBuffer sql = new StringBuffer("insert into ");
System.out.println(tableName);
if(tableName==null||"".equals(tableName)){
throw new Exception("對不起訪問的實體對象不存在 "+obj.getClass().getSimpleName() );
}
//System.out.println(tableName);
sql.append(tableName);
StringBuffer valueName = new StringBuffer();
StringBuffer value= new StringBuffer();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// System.out.println(field.getName());
// System.out.println(mapping.get(field.getName()));
Method method = clazz.getMethod(MakeMathodName(field.getName()), null);
// System.out.println(method);
Object invoke = method.invoke(obj, null);
// System.out.println(invoke);
if(invoke.getClass().getSimpleName().equals("String")){
invoke="‘"+invoke+"‘";
}
valueName.append(","+mapping.get(field.getName()));
value.append(","+invoke);
}
sql.append(" ("+valueName.substring(1)+")");
sql.append(" values ("+value.substring(1)+")");
System.out.println(sql);

}

private static String MakeMathodName(String fieldName) {
//System.out.println("get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1));
return "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
}

public static void main(String[] args) throws Exception {
CarDao car = new CarDao();
car.setCarId(1);
car.setCarName("法拉利");
car.setCarPrice(12.5);

BookDao book = new BookDao();
book.setBookId(2);
book.setBookName("駱駝祥子");
book.setBookCount(1000);
book.setBookAuth("老舍");
TestDao testDao = new TestDao();
save(car);
save(book);
}

/*完成反射機制的三個條件 getClass 獲取類的路徑 */

/* public void save(Object obj) throws Exception{
// StringBuffer sql = new StringBuffer();
// Class<? extends Object> clazz = obj.getClass();
// String tableName = clazz.getSimpleName();
// sql.append("insert into "+tableName+" values (");
//// System.out.println(clazz.getName());
//// System.out.println(clazz.getSimpleName());
//// 獲得類中的所有屬性,課後作業:這個方法能不能獲得繼承的屬性。
// Field[] fields = clazz.getDeclaredFields();
// StringBuffer values = new StringBuffer();
// for (Field field : fields) {
//// System.out.println(field.getModifiers() + ":" + field.getType() +":"+field.getName());
// Method method = clazz.getMethod(makeMethodName(field.getName()),null);
//// System.out.println(method.getName());
//// invoke表示動態調用當前方法,方法兩個參數:調用誰的method,方法的參數值
// Object value = method.invoke(obj, null);
//// System.out.println(value);
// if(value.getClass().getSimpleName().equals("String")){
// value = "‘" + value + "‘";
// }
// values.append(value + ",");
// }
// sql.append(values.toString().substring(0,values.toString().length()-1));
// sql.append(")");
// System.out.println(sql.toString());
// }
//
// fieldName --> userName; getUserName()
public String makeMethodName(String fieldName){
return "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
}

public static void main(String[] args) throws Exception {
HibernateDAO hibernateDAO = new HibernateDAO();
UserDTO user = new UserDTO();
user.setId(1);
user.setUserName("admin");
user.setUserPwd("aaa");
user.setAge(21);
hibernateDAO.save(user);

BookDTO book = new BookDTO();
book.setId(21);
book.setBookName("西遊記");
book.setPrice(20.00);
hibernateDAO.save(book);
}

public void save(Object obj) throws Exception{
StringBuffer sql = new StringBuffer();
sql.append("insert into ");
Class<? extends Object> clazz = obj.getClass();
String tableName = (String)mapping.get(clazz.getName());
if(tableName == null || tableName.equals("")){
throw new Exception("對不起,沒有關於" + obj.getClass().getSimpleName() + "的hbm映射");
}
sql.append(tableName);
System.out.println(tableName);
sql.append(" (");
Field[] fields = clazz.getDeclaredFields();
StringBuffer values = new StringBuffer();
for (int i = 0; i < fields.length; i++) {
Field filed = fields[i];
Method method = clazz.getMethod(MakeMathodName(filed.getName()),null);
Object value = method.invoke(obj, null);
if(value.getClass().getSimpleName().equals("String")){
value = "‘"+value+"‘";
}
if(i == fields.length-1){
sql.append(mapping.get(filed.getName()));
values.append(value);
}else{
sql.append(mapping.get(filed.getName()) + ",");
values.append(value + ",");
}

}
sql.append(") values (");
sql.append(values.toString());
sql.append(")");
System.out.println(sql.toString());
}
*/
}

//百度百科

Java反射機制深入研究 Java 反射是Java語言的一個很重要的特征,它使得Java具體了“動態性”。 在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?答案是肯定的。這種動態獲取類的信息以及動態調用對象的方法的功能來自於Java 語言的反射(Reflection)機制。 Java 反射機制主要提供了以下功能: 在運行時判斷任意一個對象所屬的類。 在運行時構造任意一個類的對象。 在運行時判斷任意一個類所具有的成員變量和方法。 在運行時調用任意一個對象的方法。 Reflection 是Java被視為動態(或準動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fields和methods的所有信息,並可於運行時改變fields內容或調用methods。 一般而言,開發者社群說到動態語言,大致認同的一個定義是:“程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言”。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。 盡管在這樣的定義與分類下Java不是動態語言,它卻有著一個非常突出的動態相關機制:Reflection。這個字的意思是“反射、映象、倒影”,用在Java身上指的是我們可以於運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。這種“看透class”的能力(the ability of the program to examine itself)被稱為introspection(內省、內觀、反省)。Reflection和introspection是常被並提的兩個術語。 在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中: Class類:代表一個類。 Field 類:代表類的成員變量(成員變量也稱為類的屬性)。 Method類:代表類的方法。 Constructor 類:代表類的構造方法。 Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法。 下面給出幾個例子看看Reflection API的實際運用: 一、通過Class類獲取成員變量、成員方法、接口、超類、構造方法等 在java.lang.Object 類中定義了getClass()方法,因此對於任意一個Java對象,都可以通過此方法獲得對象的類型。Class類是Reflection API 中的核心類,它有以下方法 getName():獲得類的完整名字。 getFields():獲得類的public類型的屬性。 getDeclaredFields():獲得類的所有屬性。 getMethods():獲得類的public類型的方法。 getDeclaredMethods():獲得類的所有方法。 getMethod(String name, Class[] parameterTypes):獲得類的特定方法,name參數指定方法的名字,parameterTypes 參數指定方法的參數類型。 getConstructors():獲得類的public類型的構造方法。 getConstructor(Class[] parameterTypes):獲得類的特定構造方法,parameterTypes 參數指定構造方法的參數類型。 newInstance():通過類的不帶參數的構造方法創建這個類的一個對象。

hibernate中的實體時怎麽反射成表