hibernate中的实体时怎么反射成表

//封装实体类

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():通过类的不带参数的构造方法创建这个类的一个对象。

时间: 2024-09-29 03:59:02

hibernate中的实体时怎么反射成表的相关文章

hibernate中many-to-one关联时出现ObjectNotFoundException异常

采用多对一关联,如果一的那端删除了,多的这端无法感知,虽然数据库中可以通过外键配置将多的一端置空,可是在hibernate里面我暂时不知道如何处理. 目前采用的方式: 1.首先,数据库中需要配置好外键,保证数据库中的数据是正确的. 2.在hibernate的many-to-one元素中增加一个属性:not-found="ignore". 若有更合适的方法,还望告知.

在应用hibernate框架操作数据库时,是先建表还是先建类?

先建表 可以用myeclipse反转生成类 还可以生成映射文件(更加方便) 先建类 可以设置hibernate属性动态生成表 但映射文件要自己选 在做项目时,首先都会进行数据分析,会形成数据字典.当数据字典出来以后,我们可以根据数据字典写sql语句建表,也可以根据这份数据字典写实体类或实体类映射文件,然后再生成数据表.通过表生产实体类这一过程叫做反向工程.不过现在公司开发采用反向工程的比较多,因为数据表通常都会在编码前设计好,相对较稳定,这样有利于程序员编码等后期工作.

datagrid中reoload提交时如何批量提交表单中的查询条件

看标题描述有点复杂,看下图: 直接将手工添加的一个个字段直接用一句代码完成. $('#dg_sub').datagrid("reload",$('#searchForm').serializeObject()); serializeObject 输出的实际是一个对象

使用Redis在Hibernate中进行缓存

Hibernate是Java编程语言的开放源代码,对象/关系映射框架.Hibernate的目标是帮助开发人员摆脱许多繁琐的手动数据处理任务.Hibernate能够在Java类和 数据库表之间以及Java和SQL中的数据类型之间创建映射. 任何处理大量数据的非平凡应用程序都必须依靠缓存和其他技术来提高效率.缓存是一种通过使用缓冲区存储经常访问的数据来提高应用程序性能的策略.通过减少数据库请求的数量并将数据存储在更靠近CPU的位置,缓存可以显着提高应用程序的速度. 在本文中,我们将研究如何使用 Re

NSArray中存的是实体时的排序

NSArray中存储的是实体时的排序 by 伍雪颖 NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"distanceValue" ascending:YES]; NSArray *tempArray = [goodsInfoArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor1, ni

hibernate中写配置文件xxx.hbm.xml时那个成员变量的类型type如何写的问题

hibernate中的类型就是8种基本类型的包装类首字母变为小写,有integer,long,short,float,double,charchter,byte,boolean,当然还包括其他类型如:yes_no,true_false hibernate中的类型的作用是匹配数据库表中字段的类型和Java类中属性的类型不匹配的问题的一种解决方案,比如string完成从java.lang.String到VARCHAR的映射,所以在xxx.hbm.xml映射文件中我们写属性的类型时会写成如type="

窗体DataGridView控件中按回车键时,单元格向下移动,如何能改成向右移动

方法一:protected override void OnKeyUp(System.Windows.Forms.KeyEventArgs e) { base.OnKeyUp(e); if (e.KeyCode == System.Windows.Forms.Keys.Enter) { e.Handled = true; System.Windows.Forms.SendKeys.Send("{TAB}"); } } protected override bool ProcessCmd

三、hibernate中持久化类的使用

hibernate的持久化类 持久化:将内存中的一个对象持久化到数据库中的过程,hibernate就是一个用来进行持久化的框架 持久化类:一个Java对象与数据库中表建立了关系映射,那么这个类在hibernate中就可以称之为持久化类 Java实体类 该Java类的映射文件 持久化类的使用 提供无参构造 从之前测试类中查询的使用来看: User user = session.get(User.class, 1); 说明hibernate内部是使用反射技术实现生成对象实例,所以持久化类中的Java

关于hibernate中对象的三种状态分析

一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load():持久态到瞬态的方法有delete():游离态到持久态的方法有update().saveOrUpdate().lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二,Hibernate的状态 hibernate的