反射之动态拼接sql字符串的实现
前言
自己在学习JDBC连接数据库,不用框架手动实现时,个人觉得反射动态拼接sql的思想很好,当然了大家伙觉得好才是真的好广州好迪,手动狗头),所以才有了本文对该知识点梳理与总结。分享给大家,下面开始步入文章的正文,亲们不要掉队。
嘘~看这里:使用的开发工具是IDEA哦)
正文
首先带领大家理解一下我的思路,遥想当时我想了几个小时不知如何下手,无所事事敲键盘,未曾想用最简单的方式反而有了结果。
具体实现步骤
- JDBC连接数据库
- 根据数据库表中字段创建实体类
亲们,上面这两步我就不说了,不是本文的重点不做说明,有时间会总结JDBC连接数据库。
小小脑袋讲故事给大家听
我是小朋友望舒,在很久很久以前,我的梦想是实现动态拼接sql,既然动态拼接,我就要有东西来存放它,那就整两条String字符串)(不妨给他们起名sqlSentence,sqlResult)把他们拼接成sql来展现我拼接后的字符串。不用多久,我就会升职加薪、当上总经理、出任CEO、迎娶白富美、走上人生巅峰,想想还有点小激动…)
公式 sql = sqlSentence + sqlResult
String sqlSentence = "";
String sqlResult = "";
Jetbrains全家桶1年46,售后保障稳定
接下来就是反射原理地实现了(不得不说反射真的很强大),从反射的百宝箱里面找到了两个工具:getClass)[获得类]、getSimpleName)[获得类的名字],拿着他俩去我家后院一顿操作:
Class<?> aClass = webpage.getClass);
String table = aClass.getSimpleName);
我发现了后院(数据库中的)里的神奇宝物(webpage表,实际就是实体类!) 把他们sout(懂得都懂,不懂得问我)一下就是这个东东
隐隐约约看见宝物上印着一幅画~~ 喏,就是这个(毫无保留展示给亲们)
差点以为自己的梦想实现了,却发现自己要找的东西还没有出现。于是我又拿出了百宝箱的另外两件工具getDeclaredFields)[获得某个属性对象]、getName)[获得类的完整路径名字];用它们探索宝物的奥秘!
Field[] fields = aClass.getDeclaredFields);
String s1 = "";
String v1 = "";
for Field f : fields) {
f.setAccessibletrue);
if f.getwebpage)==null){
return;
}else{
sqlSentence = sqlSentence + f.getName) + ",";
f.setAccessibletrue);
sqlResult = sqlResult + "'" + f.getwebpage) + "'" + ",";
}
}
这里我解释一下:上面几行代码原理很简单,如果字段不为空就通过反射拿到实体类属性,换句话说就是拿到数据库表中字段,然后用foreach循环遍历出来,并用单引号” ’ “和” , “隔开就达到了下面这样的效果)
我拿出我的✂[substring)方法]把后面多余的逗号剪掉就会更好看一点,给我的✂亮个相,不要嫌它丑
sqlSentence = sqlSentence .substring0, s1.length) - 1);
sqlResult = sqlResult .substring0, v1.length) - 1);
我在院子里跑累了,就打算躺下来休息休息,随手把它们(sqlSentence,sqlResult)放在了床边,我就昏昏欲睡了。。。。。。
不知睡了多久,刹那间一道强光闪现,我揉了揉睡眼惺忪的眼睛— —没错 宝物合二为一了!梦想实现了!!幸福来得太突然,一时间竟不知所措)
String sql = "insert into " + table + "" + sqlSentence + ") values " + sqlResult + ")";
System.out.printlnsql);
打印在控制台如下
自此,有了这件宝物望舒过上了愉快幸福的996生活~~~
完结!撒花!!!
结语
故事讲完了,第一次尝试着用这种方式来描述问题,还请大家多多指正。
我是望舒,Salute!!!