利用反射技术实现POJO的数据库操作
记得第一次写项目的时候,傻傻的数据库一张表,代码里就写一个DAO类,几张表就写几个DAO类,大量的反复代码,自己粘着都嫌烦,后来接触了Hibernate,不得不说对我们这样的小白用处还是非常大的。那么多的实体类,一个DAO就能够实现主要的数据库操作了。于是我用的不亦乐乎,但究竟是怎么做的,从来没有考虑过。如今用这些框架已经有一段时间了,原谅我脑洞大开,想自己实现一下这样的类似的功能:
在准备写之前,我们须要一些规则:
1、由实体类名,能够知道我这个类是存放在哪张表里---这里我採用的是和t_类名
2、由实体类中的变量名能够知道相应表中的字段名的一一这里我採用f_变量名做为字段名
3、实体类里,有着对变量的赋值与获取,且方法名有一定的规则----比方我们经常使用的get、set方法 ,这里我也是採用这样的方法
一、利用如上规则设计相关的类与表:
我这里写了两个实体类customer和admin,并在类中多加了一个toString方法,便于后面信息打印查看:
类似能够写admin。都贴出来的话会非常长,就不贴了,相应的表结构设计例如以下:
二、利用反射拼出相应的数据库操作语句
保存语句拼凑:
这里的重点在于利用反射拼凑SQL语句的过程----
1、这个函数的參数类型是什么?怎样接收一个随意的实体类?
这里我用的是object,由于不管你传什么样的一个參数过来,其都是Objcet类的一个子类。用Object没有问题,这里我在考虑后面利用泛型,只是这种话在后面查询的话。实例化的时候要麻烦一点。
临时先不考虑。
2、怎样知道这个实体类的类名?并找到相应的表?
利用函数getClass得到这个实体类相应的类。再利用getName得到类名,包含包名,再依照你制定的规则解析出相应的表名
3、開始拼凑sql语句,由于要重复的改变sql字符串,这里我用的StringBuilder对象。在插入的时候。我们的语句是这种
INSERT INTO 表名(字段名) VALUES (相应的值)
这里我们有三个须要知道的变量。表名已经在第二步中拿到
如今我们考虑拿字段名。拿到后存放到一个list里,首先拿我们全部的方法。找到以get开头的方法,我们依照对变量赋值时命名函数规则。全部以get开头的(我们把getClass排除在外),解析得到相应的字段名。这里相应我的语句:
String fName = "f_"+mName.substring(3);
有了字段名。接下来,拿相应的值,也存到相应的list里。这里取值用的method.invoke方法。请參照上面代码,为了拼凑方便,对于字符串。我直接以“xxxx”的形式存储。
有了对应的值。接下就是拼凑了,这个应该没什么难度,最后对于随意一个对象,拼凑的结果例如以下,customer有点长没能截全:
三、利用已经拼凑好的sql语句,运行。这个应该简单了吧
运行结果如图:
/1a0aa07e-0fe3-40f1-acb3-3bf8b91c0fe1/wH7XOU2B7hk6mDG.NJ6K11Is1C7GqJqJztQNMuBBeD0!/o/dFKSfW96JAAA&bo=zQAsAM0ALAADACU!" style="vertical-align:top; width:205px; height:44px">
/1a0aa07e-0fe3-40f1-acb3-3bf8b91c0fe1/.4qfDNoRX4A*p9pkcCxjZaLoQ953i6T*KsUuxpP*160!/o/dAe37G44IwAA&bo=DwIwAA8CMAADACU!" style="vertical-align:top; width:527px; height:48px">
測试代码:
/1a0aa07e-0fe3-40f1-acb3-3bf8b91c0fe1/HeQy6owjUTVdq0z9LqiGGaskocmRWOu6utHKj.4YkgA!/o/dNiZem99JAAA&bo=AwJvAAMCbwADACU!" style="vertical-align:top; width:515px; height:111px">
/1a0aa07e-0fe3-40f1-acb3-3bf8b91c0fe1/KLFBBe*EZD1yobXGz2iS3IVb0EuJ4xRibwrrAJzqC00!/o/dGvRg29xJAAA&bo=wgBxAMIAcQADACU!" style="vertical-align:top; width:0px">
/1a0aa07e-0fe3-40f1-acb3-3bf8b91c0fe1/oUM8BuiICbnS2C4u7BO4APESgCj9yKG9WlVFFNPzveY!/o/dKmO6W4.IwAA&bo=wgNYAMIDWAADACU!" style="vertical-align:top; width:870px; height:79px">
这里没用泛型的一个不好的地方在于,操作时常常须要进行强制类型转换。后面能够考虑利用泛型。
利用反射技术实现POJO的数据库操作的更多相关文章
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- Java JDBC利用反射技术将查询结果封装为对象
1.JDBC将返回结果集封装成对象demo class JdbcDemo { /** * 获取数据库列名 * @param rs * @return */ private static String[ ...
- 【转】【Java】利用反射技术,实现对类的私有方法、变量访问
java关于反射机制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基于java的反射机制. 下面是一个关于利用java的反射机制,实现了对私 ...
- 万能的JDBC工具类。通过反射机制直接简单处理数据库操作
package com.YY.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connect ...
- JDBC 利用反射技术将查询结果封装为对象(简单ORM实现)
ORM(Object Relational Mapping)对象关系映射 public class ORMTest { public static void main(String[] args) t ...
- 结合java的反射和泛型性质简化JDBC和相应的同步等服务器数据库操作代码
github地址:https://github.com/hzphzp/HeartTrace_Server 我们的服务器端数据库并没有用sqllite, 而是直接用mysql,并且用JDBC直接进行操作 ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- Java开发笔记(七十九)利用反射技术操作私有属性
早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性 ...
- Java开发笔记(八十)利用反射技术操作私有方法
前面介绍了如何利用反射技术读写私有属性,不单是私有属性,就连私有方法也能通过反射技术来调用.为了演示反射的逆天功能,首先给Chicken鸡类增加下列几个私有方法,简单起见弄来了set***/get** ...
随机推荐
- 【git】不检查特定文件的更改情况
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的.正确的做法是在每个clone下来的仓库中手动设置不要检查特定文件的更 ...
- 求分数序列的前n项之和
有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和. 输入 测试数据有多组,其第一行为一个正整数k(0<k<=90),表示测试数据的 ...
- cf886d Restoration of string
明确几点 假设有串 ab,那么 a 后头必须是 b,b 前头必须是 a,否则就不是最频繁的了. 不可成环,aba是非法的. #include <iostream> #include < ...
- 使用create datafile... as ...迁移数据文件到裸设备
下面是一个测试过程 1.首先创建裸设备:root@ultra66 # cd /opt/app/oradata/test root@ultra66 # lscontrol01.c ...
- Leetcode 337.大家结舍III
打家劫舍III 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根".除了"根"之外,每栋房子有且只有 ...
- HDU-5423 Rikka with Tree。树深搜
Rikka with Tree 题意:给出树的定义,给出树相似的定义和不同的定义,然后给出一棵树,求是否存在一颗树即和其相似又与其不同.存在输出NO,不存在输出YES. 思路:以1号节点为根节点,我们 ...
- 刷题总结——卡牌配对(bzoj4205网络流)
题目: Description 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值 ...
- P1282 多米诺骨牌 (差值DP+背包)
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...
- 类 this指针 const成员函数 std::string isbn() const {return bookNo;}
转载:http://www.cnblogs.com/little-sjq/p/9fed5450f45316cf35f4b1c17f2f6361.html C++ Primer 第07章 类 7.1.2 ...
- log4j中isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled的封装
1. log4j中log.isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled()作用 项目在应用log4j打印Debug,Info和Tra ...