问题描述
是通过反射机制实现吗?面试的时候我说通过hibernate,他说效率比较低,因之前的项目没有自己做过映射到数据库。谢谢了!
解决方案
我写过这么一个工具,http://zyn010101.iteye.com/admin/blogs/1562103
解决方案二:
也许面试官想让你说内存数据库。。。
解决方案三:
首先写一段程序,通过读取配置文件的数据源配置(可能是java属性文件,xml 或者txt)判定需要链接的数据库类型(mysql,oracle或者mssql),然后读取数据库信息(需要链接哪个数据库)。 根据以上信息,可以从系统数据库中查出,需要链接的数据库的所有信息(包括:所有表,视图的信息)。 获取到信息后,通过JAVA反射机制,就可以进而建立数据表到JAVA实体的对应关系(具体对照关系可以写在自己定义的配置文件中)。基本思路就是这样。具体实现,可以自己编码试一试。
解决方案四:
可以通过注解来对数据库做映射,通过配制实体对象的关系和实体之间的关系来反映到数据库里生成相应的数据表及关系。(可以到网上去找一些关于注解的说明)
解决方案五:
没理解清楚,不就是用SQL语句保存Bean的属性到数据表字段而已吧。你要自己写一框架那也是框架,还不如直接用人家的。
解决方案六:
我智商低,除了反射,其他的没懂!
解决方案七:
Hibernate的效率的确不如直接写sql效率高,不过省去了自己写sql的麻烦。可能就是鱼和熊掌不能兼得吧。。
解决方案八:
我不知道为什么面试的人说hibernate映射效率低下???难道是想给你下马威。最终的原理都是通过反射做到这一点
解决方案:
把hibernate效率低的部分去了就是你的答案了
解决方案:
存二进制数据,通过序列化反序列化
解决方案:
这个其实就是自己写咯。首先要解决1个问题:对应关系的问题。数据库表中的数据如何和你的对象建立关系?字段之间怎么映射?Hibernate/JPA的做法是采用配置文件或者注解来对应字段和对象成员变量的关系。如果你自己实现不妨采用直接映射的办法,即:成员变量和数据库字段名相同,一一对应。这个问题解决完之后,剩下的事情就简单了,你只需要用Resultset取数据,然后set成员变量(这里你采用反射)。Book book = new Book();while(rs.next()){ string filedName = getFiledName(i); //获取第i个成员名 Object val = rs.getObject(filedName); setObjectProp(book, filedName, val); //通过反射修改成员变量 i++;}
解决方案:
这个问题其实比较简单,最基本的就是采用反射字段和数据库返回结果集的映射关系,通过resultset获取一个ResultSetMetaData的对象,然后用他一一跟你的field反射做对应检查并复制,但是前提条件是你的feild的name必须跟你返回的结果集的字段名称严格对应才行。当然,你也可以自定义注解,或者xml、properti等方式,增加pojo与resultset的字段名的翻译处理,这样就不用非常严格的把pojo的field与结果集的字段名严格一一对应了。反射和jdbc接口都是java基础,好好看看jdk很简答。不过频繁的反射会带来额外的CPU和内存消耗,建议一次反射后将映射关系缓存起来,这样就省去很多不必要的操作步骤和系统资源了
解决方案:
就如前面提到的hibernate其实就是,但如果要自己实现一套完全没必要。我个人感觉这个问题是要使用反射,这里我给一个简单的例子:条件:1、javabean是符合POJO的,标准的get和set方法要有;2、表名、表字段要有对应匹配方式的,这里假设你的class类名就是表名,而属性名也是表字段名,同时属性类型与数据库字段自动转换不会冲突(不能属性是string而表字段是number);3、javabean中如果有属性也是javabean那么引用主键你是已经有了获取方式的,这个比较复杂暂不考虑。实现方式1、通过反射获取javabean的类,得到其对应的数据库表-->完成表映射2、通过反射获取javabean中的属性及对应值-->完成表字段映射3、SQL的拼装当然这是个非常简单的例子,如果要更强的功能那么就需要做更多的扩展,希望有帮助到你
解决方案:
JDBC+CONNECTIONPOOL效率应该高,但是编写麻烦。写一个泛型的主DAO,然后对应每张表一个POJO,一个DAO(继承主DAO)。
解决方案:
反射是肯定的,简单了说,Hibernate也是基于反射,只不过用了javasist字节码增强而已。