问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javaWeb中使用反射机制为数据库中表生成的实体类的的对象赋值?

发布网友 发布时间:2022-04-08 03:31

我来回答

3个回答

懂视网 时间:2022-04-08 07:53



在准备写之前,我们需要一些规则:
    1、由实体类名,可以知道我这个类是存放在哪张表里---这里我采用的是和t_类名
    2、由实体类中的变量名可以知道对应表中的字段名的一一这里我采用f_变量名做为字段名
    3、实体类里,有着对变量的赋值与获取,且方法名有一定的规则----比如我们常用的get、set方法 ,这里我也是采用这种方法

一、利用如上规则设计相关的类与表:
我这里写了两个实体类customer和admin,并在类中多加了一个toString方法,便于后面打印信息查看:
  package com.java.reflect.database; public class Customer {     private Long id;     private String username;     private String password;     private String realname;     private String address;     private String email;     private String mobile;          @Override     public String toString() {         return "Customer [id=" + id + ", username=" + username + ", password="                 + password + ", realname=" + realname + ", address=" + address                 + ", email=" + email + ", mobile=" + mobile + "]";     }          public Long getId() {         return id;     }     public void setId(Long id) {         this.id = id;     }     public String getUsername() {         return username;     }     public void setUsername(String username) {         this.username = username;     }     public String getPassword() {         return password;     }     public void setPassword(String password) {         this.password = password;     }     public String getRealname() {         return realname;     }     public void setRealname(String realname) {         this.realname = realname;     }     public String getAddress() {         return address;     }     public void setAddress(String address) {         this.address = address;     }     public String getEmail() {         return email;     }     public void setEmail(String email) {         this.email = email;     }     public String getMobile() {         return mobile;     }     public void setMobile(String mobile) {         this.mobile = mobile;     } }   类似可以写admin,都贴出来的话会很长,就不贴了,对应的表结构设计如下:
  技术分享                                   技术分享  
二、利用反射拼出对应的数据库操作语句

保存语句拼凑:
  public static String saveSql(Object o){         StringBuilder sql = new StringBuilder();         Class c = o.getClass();                  sql.append("INSERT INTO ");                  Method[] methods = c.getMethods();         String cName = c.getName();         ArrayList<String> fieldNames = new ArrayList<String>();         ArrayList<Object> fieldValues = new ArrayList<Object>();                  String tableName = "t_"+cName.substring(cName.lastIndexOf(".")+1,cName.length());                  sql.append(tableName);         sql.append(" (");                  for(Method method : methods){             String mName = method.getName();             if(mName.startsWith("get") && !mName.startsWith("getClass")){                 String fName = "f_"+mName.substring(3);                 fieldNames.add(fName);                 try{                     Object value = method.invoke(o, null);                     if(value instanceof String){                         fieldValues.add("""+value+""");                     }                     else{                         fieldValues.add(value);                     }                 }                 catch(Exception e){                     e.printStackTrace();                 }             }         }         for(int i = 0;i<fieldNames.size();++i){             if(i==0){                 sql.append(fieldNames.get(i));             }             else{                 sql.append(","+fieldNames.get(i));             }         }         sql.append(") values (");         for(int i = 0;i<fieldValues.size();++i){             if(i==0){                 sql.append(fieldValues.get(i));             }             else{                 sql.append(","+fieldValues.get(i));             }         }         sql.append(")");         return sql.toString();     }   这里的重点在于利用反射拼凑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语句,执行,这个应该简单了吧
        执行结果如图:                 技术分享 
          技术分享 

代码大致是这样子的,但是从健壮性上去考虑的话,还有很多地方需要修改,这里只是用来简单说明如何利用反射来实现这种统一的DAO操作。
  关于查询,可以自己练习一下,也是同样利用反射拼凑出来,但是查询的关键在于如何利用反射把查到数据包装成你需要的一个实体类。 
测试代码:  技术分享  打印结果:  技术分享技术分享  
 这里没用泛型的一个不好的地方在于,操作时经常需要进行强制类型转换,后面可以考虑利用泛型。

版权声明:本文为博主原创文章,未经博主允许不得转载。

利用反射技术实现POJO的数据库操作

标签:java   数据库   

热心网友 时间:2022-04-08 05:01

在CustomerInfo 这个类中所有的属性(id...........detailInfo)要实现setXXX getXXX方法,并且CustomerDetailInfo 这个类中的属性也要实现setyyyy geyyyy方法,然后再用的时候,可以实例化CustomerInfo cus这个类,然后cus.setXXX.setyyyy就能进行赋值,不知道你是否听懂,不懂再问我

热心网友 时间:2022-04-08 06:19

不知道你是否说的是hibernate框架中的使用方法。我这有个Hibernate的API,给你看看

你的问题应该是在文档中“关系”的“外键一对一”

追问额,不是,我说的是javaWeb中的反射,还是谢谢你

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
这是真的黑米还是假的? 牡丹江市区好玩的地方 显卡问题,现在的显卡显存一般都为多少? 现在主流显存是多少?512M5年后会过时吗 主流家用电脑配置家用电脑买什么样配置比较好 现在的电脑显存一般是多少? 安顺万家领秀城怎么样?好不好?值不值得买? 请问下面一道题怎么加标点 花园里 牡丹 月季 玫瑰 芍药 开得美丽极了... 是什么把大地打扮的这么漂亮呢 是雪呀 这两句话怎么写标点符号? 通州有那些私立高中啊 森森hs2t1500FD怎么样 hs2崩坏怎么降 hs2角色卡怎么删除 hs2怎么设置动态花瓣 hs2怎么换人 hs2手机版怎么装mod hs2服装卡怎么用 hs2汉化怎么弄 hs2第一人称怎么换成女的了 hs2人物卡怎么设置喜欢 hs2怎么看成就 hs2怎么拍照 hs2zipmod怎么用 贝壳市值超过万科将会对其公司造成什么影响? 华为N2S如何录屏? 锦州有贝壳找房吗? honeyselect2工作室怎么打开录制 贝壳资金监管安全吗 形容事情很糟糕的成语有哪些? 天津的津,去掉三点水,是什么字?请发拼音给我,谢谢 幼儿户外安全要求 如何保证幼儿户外活动的安全 幼儿户外活动的安全教育意义 如何保证幼儿户外游戏活动时的安全 如何做好幼儿园户外活动的安全防范工作 螺纹钢身上符号是4/422/5G/16是什么牌子钢筋? 昆钢生产的钢筋的代号,刻在钢筋上的字母---KG 请问哪些 螺纹钢4EKF是什么意思? 螺纹钢上4/J/G/12符号代表什么?是哪个厂家的货 钢筋原材料上有厂家标识吗?有的话是什么样子的,一条钢筋上有几个标识? 逃之夭夭的歌词 作文,《友情》写关于和小伙伴的一件事 求 逃之夭夭 百度网盘免费资源下载链接,谢谢 匪帮说唱传奇电影中的插曲? 仙剑插曲歌词 求钟汉良翻唱的所有歌曲的mp3,特别是粤语歌,623988220@qq.com。谢谢。。。 ABCC的词有什么?至少二个。 钟汉良所有歌曲打包下载(注意是所有哦) 秦霄贤深情唱《空白格》,有哪些相声演员唱歌非常好听? 跪求钟汉良小哇的歌曲来电铃音,不要全部的就是其中一段就行,谢谢!xiaosss@wo.com.cn