利用反射技术实现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** ...
随机推荐
- php redis通用类
<?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...
- PAT Basic 1065
1065 单身狗 “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣 ...
- HTML、CSS知识点总结_D
一,html+css基础 1-1 Html和CSS的关系 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1. HTM ...
- linux 环境下bash脚本中找不到命令
mr.sh: line 1: HADOOP_CMD: command not found mr.sh: line 4: INPUT_FILE_PATH: command not found mr.sh ...
- 用Go编写的本地文件服务器
本文来自网易云社区,转载务必请注明出处. 一.前言 一切问题的起源就是来自一个问题"为什么我打的jar包没有注解?",带着这个疑问查了一圈资料,原来问题主要是在没有将源码中的注释进 ...
- 五、人生苦短,我用python【第五篇】
Python基本数据类型 运算符 1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算: 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为 ...
- C/C++复杂类型声明
曾经碰到过让你迷惑不解.类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明. 我们将从每天都能碰到的较 ...
- POJ 1606 Jugs
Jugs Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4280 Accepted: 2533 Special Ju ...
- iOS学习笔记14-网络(三)WebView
一.WebView WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用,WKWebView是在i ...
- 【Luogu】P1040加分二叉树(区间DP)
题目链接 区间DP,因为中序遍历的性质:区间[l,r]的任何一个数都可以是该区间的根节点. 更新权值的时候记录区间的根节点,最后DFS输出. 见代码. #include<cstdio> # ...