最新要闻
- 男子驾车路遇“雪狼” 回头瞬间笑喷:原是只哈士奇
- 【热闻】刘作虎宣布闭关打磨细节:OPPO Find X6就快来了
- 当前速读:苹果联合创始人称ChatGPT不懂人性:可能会犯下可怕错误
- 《流浪地球2》里的“天梯”真的能建成吗?
- 当前头条:猛男最爱!Xbox手柄新配色“浪漫粉”今晚发售 网友惊了
- 当前快播:唯一16GB显存!宏碁Intel Arc A770旗舰显卡降价:2380元最便宜
- 直降700元 小牛G2/G2s部分车型促销:理论续航60-90公里
- 环球速讯:曾靠6字赚苹果上千万的汉王 怎么就搭上ChatGPT的风口
- 环球看热讯:你喝奶 选哪个品牌放心?蒙牛回应男子买酸奶打开全是清水
- RTX 30别买了 高性价比RTX 40游戏本杀到:价格屠夫还是这两家
- 全球观速讯丨40S精梳棉 裸感体验:老牌宜而爽平角裤39元4条发车
- 环球讯息:短信不死
- 全球关注:检测到外星生命“存在证据”!“三体人”要来了吗?
- 天天报道:吉利赚了10个沃尔沃
- 全球最新:多家游戏公司招聘客服实为找托:引导玩家氪金
- 即时看!长城大力布局新能源 哈弗如歌、枭龙曝光:外观个性均可上绿牌
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【全球快播报】利用反射和代理简单模拟mybatis实现简单的CRUD
利用反射接口做java数据库操作
今天突发奇想,好像一些基本的CRUD操作路数都是一样的,又想到mybatis中的操作,便想着简单的模拟一下。随便写写,就当练习反射了。
Dao接口类:
这里使用泛型,是为了更好的对数据进行处理
(资料图片)
public interface BaseDao { // 获取所有信息 List getAll(); // 根据id查询信息 T getById(int id); // 根据id修改信息 int updateById(T t); // 根据id删除信息 int deleteById(int id); // 插入数据 int insert(T t); }
之前一直在犹豫,是否可以对接口创建代理类,后来查阅了一些资料,发现mybatis好像就是对接口的一些代理的处理。
使用JDK自带的代理接口InvocationHandler
:
public class ProxyGen implements InvocationHandler { // 要代理的接口 private Class aClass;// 要处理的表名 private String tableName;// pojo的字节码文件 private Class objClass;// 完整的构造方法 public ProxyGen(Class interfaceClazz, String tableName, Class objClass) { this.aClass = interfaceClazz; this.tableName = tableName; this.objClass = objClass; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ ...... // 代码处理 } // 获取代理类 public T getProxy() { return (T) Proxy.newProxyInstance(aClass.getClassLoader(), new Class[]{aClass}, this); } }
下面展示一下利用反射做简单的CRUD:
先做一些简单的提前准备:
// 一些连接信息Connection connect = null;ResultSet rs = null;PreparedStatement ps = null;// 这时候通过反射拿到类的属性信息try {// 获取连接connect = SqlUtil.getConnect();} catch (Exception e) {throw new RuntimeException(e);}
把这些先声明出来,方便后续的管理和使用。
查询全部数据:
// 获取所有的学生信息if (method.getName().equalsIgnoreCase("getAll")) { // 存储查询到的所有信息 List list = new ArrayList<>(); // 这里执行结果 ps = connect.prepareStatement("select * from " + tableName); // 查询结果 进行封装 rs = ps.executeQuery(); // 按照顺序进行赋值 while (rs.next()) { // 获取到所有的字段 进行反射赋值 必须确保有序 ! List fields = getClassFileds(objClass); // 获取类对象 Object objClazz = objClass.getConstructor(null).newInstance(null); // 赋值完毕 // 利用了反射出来的字符是有序的,这样保证了数据库的字段顺序和反射出来的字段顺序一致 for (int i = 0; i < fields.size(); i++) { Object object = rs.getObject(i + 1); fields.get(i).setAccessible(true); fields.get(i).set(objClazz, object); } list.add( objClazz); }// 关闭连接 SqlUtil.close(connect, ps, rs); return list;}
根据id查询信息:
// 根据id查询信息 if (method.getName().equalsIgnoreCase("getById")) { // 先查看输入的参数是否获取到 System.out.println("args = " + Arrays.toString(args)); // 获取执行结果 ps = connect.prepareStatement("select * from " + tableName + " where id = " + args[0]); // 获取执行结果 rs = ps.executeQuery(); // 获取类对象信息 Object obj = objClass.getConstructor(null).newInstance(); // 获取POJO类的字段信息 List fileds = getClassFileds(objClass); while (rs.next()) { // 循环赋值 for (int i = 0; i < fileds.size(); i++) { // 因为字段是私有的 所以需要加上这一步 fileds.get(i).setAccessible(true); // 给字段赋值 fileds.get(i).set(obj, rs.getObject(i + 1)); } } // 释放资源 SqlUtil.close(connect, ps, rs); // 返回对象 return obj; } /** * 获取类反射字段 * * @param objClass * @return */ private List getClassFileds(Class objClass) { ArrayList list = new ArrayList<>(); // 获取当前类的所有的字段 Field[] fields = objClass.getDeclaredFields(); for (Field field : fields) { list.add(field); } return list; }
根据Id修改信息:
既然是反射,那就得把数据写活,如果直接用
pojo
类的字段和属性,那不是写死了?
// 根据id修改信息 /** * 这个比较特殊 传入的对象是一个student对象 */ if (method.getName().equalsIgnoreCase("updateById")) { // 拿到传输过来的对象 Object obj = args[0]; // 做一个自适应 如果值为null就不修改 Field[] fields = obj.getClass().getDeclaredFields(); // 拼接字符串 StringBuilder builder = new StringBuilder(); builder.append("update ").append(tableName).append(" ").append("set "); // 循环获取值 for (Field field : fields) { field.setAccessible(true); Object o = field.get(obj); if (o != null && !field.getName().equalsIgnoreCase("id")) { // 这里需要注意 如果对象为时间 需要转换一下 if (o instanceof Date) { o = String.format("%tF", (Date) o); } // 继续拼接 builder .append(field.getName()) .append("=") .append(""") .append(o) .append(""") .append(","); } } // 拼接sql 如果拼接完最后一个字符为[,],需要去掉 String sql = builder.toString().endsWith(",") ? builder.deleteCharAt(builder.length() - 1).toString() : builder.toString(); // 主键id单独 处理 for (Field field : fields) { field.setAccessible(true); Object o = field.get(obj); if (field.getName().equalsIgnoreCase("id") && o != null) { sql += " where id = "" + o + """; } } System.out.println("sql = " + sql); // 执行对象 ps = connect.prepareStatement(sql); // 获取执行结果 int i = ps.executeUpdate(); SqlUtil.close(connect, ps, rs); return i; }
根据id修改对象:
/** * 根据id删除对象 */ if (method.getName().equalsIgnoreCase("deleteById")) { // 获取参数 Integer arg = (Integer) args[0]; // 数据判断 避免空指针异常 if (arg != null) { // 直接拼接删除sql语句 String sql = "delete from " + tableName + " where id = " + arg; System.out.println("sql = " + sql); ps = connect.prepareStatement(sql); int i = ps.executeUpdate(); SqlUtil.close(connect, ps, rs); return i; } else { return 0; } }
插入数据:
// 插入数据 if (method.getName().equalsIgnoreCase("insert")) { // 传入的对象 Object obj = args[0]; // 根据传入的对象进行拼接sql Field[] fields = obj.getClass().getDeclaredFields(); // 拼接字符串 StringBuilder builder = new StringBuilder(); builder.append("insert into ").append(tableName).append(" ").append(" set "); for (Field field : fields) { field.setAccessible(true); Object o = field.get(obj); if (o != null) { // 这里需要注意 如果对象为时间 需要转换一下 if (o instanceof Date) { o = String.format("%tF", (Date) o); } builder.append(field.getName()).append("="").append(o).append("","); } } // 拼接sql 如果拼接完最后一个字符为[,],需要去掉 String sql = builder.toString().endsWith(",") ? builder.deleteCharAt(builder.length() - 1).toString() : builder.toString(); ps = connect.prepareStatement(sql); int i = ps.executeUpdate(); SqlUtil.close(connect, ps, rs); return i; }
简单测试了一下,还不错。
【全球快播报】利用反射和代理简单模拟mybatis实现简单的CRUD
世界微动态丨Docker参数命令大全详解
男子驾车路遇“雪狼” 回头瞬间笑喷:原是只哈士奇
【热闻】刘作虎宣布闭关打磨细节:OPPO Find X6就快来了
当前速读:苹果联合创始人称ChatGPT不懂人性:可能会犯下可怕错误
《流浪地球2》里的“天梯”真的能建成吗?
每日短讯:开学小测总结(下)
【报资讯】【DFS】飞行员兄弟
今日热闻!03.Python Dash网页开发:多页面网站制作
【环球报资讯】二叉树的深度之DFS、BFS
当前头条:猛男最爱!Xbox手柄新配色“浪漫粉”今晚发售 网友惊了
当前快播:唯一16GB显存!宏碁Intel Arc A770旗舰显卡降价:2380元最便宜
直降700元 小牛G2/G2s部分车型促销:理论续航60-90公里
环球速讯:曾靠6字赚苹果上千万的汉王 怎么就搭上ChatGPT的风口
环球看热讯:你喝奶 选哪个品牌放心?蒙牛回应男子买酸奶打开全是清水
RTX 30别买了 高性价比RTX 40游戏本杀到:价格屠夫还是这两家
全球观速讯丨40S精梳棉 裸感体验:老牌宜而爽平角裤39元4条发车
环球讯息:短信不死
全球关注:检测到外星生命“存在证据”!“三体人”要来了吗?
天天报道:吉利赚了10个沃尔沃
记录--数组去重的五种方法
每日看点!D. Moscow Gorillas
环球热消息:Microsoft Azure 教程_编程入门自学教程_菜鸟教程-免费教程分享
环球百事通!文盘Rust -- 领域交互模式如何实现
打开MASA Blazor的正确姿势1:目录&MASA Blazor是???
全球最新:多家游戏公司招聘客服实为找托:引导玩家氪金
即时看!长城大力布局新能源 哈弗如歌、枭龙曝光:外观个性均可上绿牌
明天是情人节!全国多地现巨型玫瑰
世界看热讯:谁说鱼只有7秒记忆?研究首次证明鱼能认出自己的脸
今日热闻!马斯克“黑子”自费400万元 把特斯拉FSD负面广告送上美国超级碗
【Oculus Interaction SDK】(八)特殊的 UI(曲面效果 & 手指点击)
环球最新:并行执行异步方法的最佳实践
全球快播:react 中componentDidMount 只加载一次的解决办法
微头条丨ChatGPT爆火,释放了什么不寻常信号?
每日快看:Git下载、安装与配置
旅日大熊猫香香将要回国了:被赞“呆萌可爱迷倒游客”
【世界播资讯】年销35万台无悬念!李想:L8/L7 Air版交付后月销3万保底
牛皮吹大 全球首款量产太阳能电动车:黄了
全球报道:奔驰将在中国启动L3有条件自动驾驶测试:开车不用看路 事故奔驰担责
环球观天下!吴易昺网球ATP赛事夺冠创造历史 你会读吗?央视科普昺:让世界认识这字
焦点热文:[WPF] 使用Silk.NET绘制D3D9或OpenGL内容并完美解决空域问题。
今日热议:【DSP视频教程】第11期:插补算法,曲线拟合丝滑顺畅,统计函数和基础函数加速实现,汇集SIMD,饱和和MAC乘累加应用实战(2023-02-12)
每日热议!【OpenGL+Qt 学习】 你好,三角形
全球微资讯!《焦虑症的自救》焦虑症反反复复?还在为恐惧和焦虑苦恼?快来领取焦虑症自愈宝典!
焦点速读:曾经的国民神车 新款哈弗H6亮相:换张脸、动力更强
你敢开不?特斯拉大雾中自动辅助驾驶 “狂飙”至86km/h
全球即时:少见!女子家中大巨蛋磕开竟是蛋中蛋 最终收获两枚蛋黄:科普原因
世界最新:全新比亚迪宋Pro DM-i申报图出炉:前脸比Plus还凌厉
券后9块9!汤臣倍健维生素D钙片大促:手慢真的无
全球热议:使用cnn,bpnn,lstm实现mnist数据集的分类
热门:ASP.Net WP 教程_编程入门自学教程_菜鸟教程-免费教程分享
每日热文:为什么这11道JVM面试题这么重要(附答案)
环球今日讯!修改Linux内核版本信息的方法
联想小新16 2023轻薄本官宣: 普及2.5K高清大屏、1TB硬盘
你会答?深圳一电子厂入职考数理化、《庄子》和英语等 网友吐槽难:厂商回应
开眼!一宝马车高速行驶未松手刹 四个车轮全磨红了
众泰“亡者归来”推出首款电动车 江南U2正式开售:5.88万起
找数组中重复的数字
最资讯丨十年老程序员:再见了Navicat,以后多数据库管理就看这款SQL工具
【Spring】Bean装配类注解
环球实时:广东最狂野民俗盐拖灶神刷爆网络 场面激烈:堪称我国最热血民俗
微资讯!深圳夜空出现三个不明发光飞行物:飞速掠过
【全球新视野】ASP.Net 教程_编程入门自学教程_菜鸟教程-免费教程分享
今日快讯:连续开车8小时!男子长期久坐后被诊断截瘫 医生提醒
天天快资讯丨丰田顶级名车!世纪SUV最新效果图曝光:有“大汉兰达”那味了
世界热资讯!众泰汽车破产清算 一保时捷Macan将被拍卖!网友:当年皮尺部首车?
当前信息:注意!长期空气污染增加患抑郁症风险:甚至会致死
世界热点! 新型合成皮肤面世:有望解开蚊子传播致命疾病之谜
必知必会的设计原则——迪米特原则
环球关注:20万燃油车能比?百万级轿跑底盘助力:哪吒S麋鹿测试80km/h稳过
【新要闻】看看你的工作会被取代吗?ChatGPT时代生存攻略:未来“高枕无忧”的10种工作
快看:原美团创始人王慧文进军人工智能:称将打造中国的OpenAI
一加Ace 2首销战报出炉:37分钟打破近一年所有安卓机首销全天记录!
德国最新电商周销量:AMD完胜Intel
鼠标不能拖动文件是怎么回事?鼠标不能拖动文件夹怎么解决?
苹果ipad充不上电是什么原因?苹果ipad怎么使用?
YY个人积分怎么计算?yy个人积分在哪里查看?
如何选购抽油烟机?抽油烟机十大名牌排名
word打不开是什么原因?word打不开怎么解决?
固态水指的是什么?固态水冻结状态持续多久?
乌鲁木齐机场属于什么区?乌鲁木齐机场到火车站需要多长时间?
DataX二次开发——HdfsReader和HdfsWriter插件增加parquet文件读写
全链路异步,让你的 SpringCloud 性能优化10倍+
每日焦点!机器学习-SVM
金色枫叶是什么意思?金色枫叶相关的成语有哪些?
无人生还的凶手是谁?无人生还的人物介绍
逆生长是什么意思?人怎么才能逆生长?
快讯:“小行星”撞地球今日中午上演!法国、英国、荷兰均肉眼可见
十大全系标配!长安逸达一出场 就把压力给到合资了
【世界速看料】别迷信日本制造!董明珠:格力中央空调国内第一创历史 日立大金都不行
国产最帅电动猎装车成了!极氪已交付8万台:完成7.5亿美元A轮融资 杀向全球前三
黄旭东评价李培楠《星际争霸2》夺冠:这一刻等了20年!
速讯:Redmi K60官宣降价:2999元普及512GB存储、老用户保价+送手环
不花钱每天能跑12公里 印度首款太阳能汽车亮相:像是“三蹦子”
世界即时:ChatGPT惊动谷歌创始人:罕见出山检查Bard AI代码数据
热议:曝宁德时代将赴美建厂:福特出地出厂房 “宁王”出技术
当前速读:实测用微软ChatGPT写求职信:“不道德”、被拒绝
天天滚动:安全圈最新重大数据泄露事件
世界最新:移动端重排版PDF阅读器比较
Flink 积压问题排查