最新要闻
- 热门:沃尔沃XC90 T8充电版:经过最新升级后仍是首选SUV
- 全球新消息丨网友用AI生成《黑豹2》电影白人版海报 激怒正义人士
- 热讯:邝飚
- 天天滚动:长度仅23.5mm:尼康尼克尔Z 26mm f/2.8饼干镜头上架
- iPhone更香?调查显示近半数安卓用户考虑换苹果
- 最后一个武侠杂志 《今古传奇·武侠版》停刊:闭关修炼
- 今日快看!力压西游记、红楼梦 豆瓣9.8分:《大明王朝1566》封神国产剧
- 青海首次实现330千伏同塔双回线路中相导线带电消缺
- 男子工作期间上厕所摔伤:被判工伤
- 周杰伦发文谈论AI 称AI取代不了音乐创作的美感
- 今日快讯:86岁老人鸡骨头卡入支气管16年:部分骨头被气管黏膜包住
- 带货主播李佳琦进浙江一大学招美女主播:教室爆满 女生尖叫
- 学生点外卖评3星被商家威胁:不删除差评 让学校把你开除
- 世界速读:周鸿祎:ChatGPT迟早会产生自主意识 为人类带来毁灭危机
- 我国新一代载人登月飞船模型首次展出:将建造月球科研站
- 每日热议!委员建议:允许重大节日燃放烟花爆竹 应科学限放
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
day03-自己实现Mybatis底层机制-02
自己实现Mybatis底层机制-02
7.任务阶段4&5
阶段4任务:开发Mapper接口和Mapper.xml
(资料图片仅供参考)
阶段5任务:开发和Mapper接口相映射的MapperBean
(1)Mapper接口
package com.li.mapper;import com.li.entity.Monster;/** * @author 李 * @version 1.0 * MonsterMapper:声明对数据库的crud方法 */public interface MonsterMapper { //查询方法 public Monster getMonsterById(Integer id);}
(2)Mapper.xml文件
(3)Function.java,用于记录Mapper.xml文件实现的方法信息
package com.li.limybatis.config;import lombok.Getter;import lombok.Setter;/** * @author 李 * @version 1.0 * Function:记录对应 Mapper.xml的方法信息 */@Getter@Setter@ToStringpublic class Function { private String sqlType;//sql类型,如select,update,insert,delete private String funcName;//方法名 private String sql;//执行的sql语句 private Object resultType;//返回类型 private String parameterType;//参数类型}
(4)MapperBean.java,作用是读取Mapper接口对应的Mapper.xml,将该xml文件方法信息封装到MapperBean中。
package com.li.limybatis.config;import lombok.Getter;import lombok.Setter;import java.util.List;/** * @author 李 * @version 1.0 * MapperBean:将我们的Mapper信息,进行封装 */@Setter@Getter@ToStringpublic class MapperBean { private String interfaceName;//接口名 //接口下的所有方法 public List functions;}
8.任务阶段6
阶段6任务:在MyConfiguration中读取xxMapper.xml,能够创建MapperBean对象
(1)修改 MyConfiguration.java,添加 readMapper() 方法
/** * 读取xxMapper.xml,创建MapperBean对象 * @param path xml的路径+文件名,从类的加载路径开始计算,若xml文件放在resource目录下,直接传入文件名即可 * @return 返回MapperBean对象 */public MapperBean readMapper(String path) { MapperBean mapperBean = new MapperBean(); try { //获取到mapper.xml文件对应的InputStream InputStream stream = loader.getResourceAsStream(path); SAXReader reader = new SAXReader(); //获取到xml文件对应的document Document document = reader.read(stream); //得到xml的根节点 Element root = document.getRootElement(); //获取到 namespace String namespace = root.attributeValue("namespace").trim(); //设置mapperBean的属性interfaceName mapperBean.setInterfaceName(namespace); //遍历获取root的子节点-生成 Function Iterator rootIterator = root.elementIterator(); //保存接口下的所有方法信息 List list = new ArrayList<>(); while (rootIterator.hasNext()) { //取出一个子元素 /** * */ Element e = (Element) rootIterator.next(); Function function = new Function(); String sqlType = e.getName().trim(); String funcName = e.attributeValue("id").trim(); //这里的resultType是返回类型的全路径-全类名 String resultType = e.attributeValue("resultType").trim(); String sql = e.getText().trim(); //将信息封装到 function对象中 function.setSql(sql); function.setFuncName(funcName); function.setSqlType(sqlType); //这里的function.resultType应该为Object类型 //因此使用反射生成对象,再放入function中 Object instance = Class.forName(resultType).newInstance(); function.setResultType(instance); //将封装好的function对象放到list中 list.add(function); } mapperBean.setFunctions(list); } catch (Exception e) { e.printStackTrace(); } return mapperBean;}
(2)测试
@Testpublic void readMapper() { MyConfiguration myConfiguration = new MyConfiguration(); MapperBean mapperBean = myConfiguration.readMapper("MonsterMapper.xml"); System.out.println("mapperBean=" + mapperBean);}
测试结果:
mapperBean=MapperBean(interfaceName=com.li.mapper.MonsterMapper, functions=[Function(sqlType=select, funcName=getMonsterById, sql=select * from monster where id = ?, resultType=Monster(id=null, age=null, name=null, email=null, birthday=null, salary=0.0, gender=null), parameterType=null)])
9.任务阶段7
阶段7任务:实现动态代理Mapper的方法-动态代理生成Mapper对象,调用MyExecutor方法
(1)MyMapperProxy.java
package com.li.limybatis.sqlsession;import com.li.limybatis.config.Function;import com.li.limybatis.config.MapperBean;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.util.List;/** * @author 李 * @version 1.0 * MyMapperProxy:动态代理生成 Mapper对象,调用 MyExecutor方法 */public class MyMapperProxy implements InvocationHandler { private MySqlSession mySqlSession; private String mapperFile; private MyConfiguration myConfiguration; //构造器 public MyMapperProxy(MySqlSession mySqlSession, MyConfiguration myConfiguration, Class clazz) { this.mySqlSession = mySqlSession; this.myConfiguration = myConfiguration; this.mapperFile = clazz.getSimpleName() + ".xml"; } //当执行Mapper接口的代理对象方法时,会执行到invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { MapperBean mapperBean = myConfiguration.readMapper(this.mapperFile); //判断是否是xml文件对应的接口 if (!method.getDeclaringClass().getName().equals(mapperBean.getInterfaceName())) { //通过method拿到执行的方法所在的接口的名称,与MapperBean存放的接口名比较 return null; } //取出MapperBean的functions List functions = mapperBean.getFunctions(); //判断当前mapperBean解析对应的XML文件后,有方法 if (null != functions && 0 != functions.size()) { for (Function function : functions) { //如果当前要执行的方法和function.getFuncName()一样 //说明我们可以从当前遍历的function对象中,取出相应的信息sql,并执行方法 if (method.getName().equals(function.getFuncName())) { //如果当前function要执行的SqlType是select,就去执行selectOne /* * 说明: * 1.如果要执行的方法是select,就对应执行selectOne * 因为我们在MySqlSession只写了一个方法(selectOne) * 2.实际上原生的MySqlSession中应该有很多的方法,只是这里简化了, * 实际上应该根据不同的匹配情况调用不同的方法,并且还需要进行参数解析处理, * 还有比较复杂的字符串处理,拼接sql,处理返回类型等工作 * 3.因为这里主要想实现mybatis生成mapper动态代理对象,调用方法的机制,所以简化 */ if ("select".equalsIgnoreCase(function.getSqlType())) { return mySqlSession .selectOne(function.getSql(), String.valueOf(args[0])); } } } } return null; }}
(2)修改MySqlSession.java,添加方法,返回动态代理对象
/** * 1.回 mapper的动态代理对象 * 2.这里的 clazz到时传入的类似 MonsterMapper.class * 3.返回的就是 MonsterMapper 接口的代理对象 * 4.当执行接口方法时(通过代理对象调用), * 根据动态代理机制会执行到MyMapperProxy的invoke()方法 * @param clazz * @param * @return */public T getMapper(Class clazz) { //返回动态代理对象 return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new MyMapperProxy(this, myConfiguration, clazz));}
(3)创建 MySessionFactory.java
package com.li.limybatis.sqlsession;/** * @author 李 * @version 1.0 * MySessionFactory-会话工厂-返回会话SqlSession */public class MySessionFactory { public static MySqlSession openSession() { return new MySqlSession(); }}
(4)测试
@Testpublic void openSession() { MySqlSession mySqlSession = MySessionFactory.openSession(); MonsterMapper mapper = mySqlSession.getMapper(MonsterMapper.class); System.out.println("mapper的运行类型=" + mapper.getClass()); Monster monster = mapper.getMonsterById(1); System.out.println("monster--" + monster);}
-
天天快资讯丨Android 应用接入 Firebase Crashlytics 进行崩溃分析上报
前言所在公司的项目中有一款应用应客户要求,需要接入FirebaseCrashlytics,在此提前练手,也做个总结。...
来源: -
热议:Java 中 hashCode 和 equals 方法是什么?它们和 == 各有什么区别?
在Java中,hashCode和equals方法都是Object类的方法。它们的作用分别如下:hashCode方法返回对象的哈希...
来源: day03-自己实现Mybatis底层机制-02
如何设计高并发项目
天天快资讯丨Android 应用接入 Firebase Crashlytics 进行崩溃分析上报
热议:Java 中 hashCode 和 equals 方法是什么?它们和 == 各有什么区别?
热门:沃尔沃XC90 T8充电版:经过最新升级后仍是首选SUV
全球新消息丨网友用AI生成《黑豹2》电影白人版海报 激怒正义人士
面向对象进阶第二天
环球视点!# 009 - 检验 (2)
热讯:邝飚
天天滚动:长度仅23.5mm:尼康尼克尔Z 26mm f/2.8饼干镜头上架
iPhone更香?调查显示近半数安卓用户考虑换苹果
最后一个武侠杂志 《今古传奇·武侠版》停刊:闭关修炼
今日快看!力压西游记、红楼梦 豆瓣9.8分:《大明王朝1566》封神国产剧
【天天快播报】python-函数
焦点热文:58.抽象数据类型
青海首次实现330千伏同塔双回线路中相导线带电消缺
男子工作期间上厕所摔伤:被判工伤
周杰伦发文谈论AI 称AI取代不了音乐创作的美感
今日快讯:86岁老人鸡骨头卡入支气管16年:部分骨头被气管黏膜包住
带货主播李佳琦进浙江一大学招美女主播:教室爆满 女生尖叫
学生点外卖评3星被商家威胁:不删除差评 让学校把你开除
linux中redis下载安装部署启动
环球视讯!21、现有网络模型的使用以及修改
环球看热讯:(数据库系统概论|王珊)第七章数据库设计-第二节:需求分析
世界速读:周鸿祎:ChatGPT迟早会产生自主意识 为人类带来毁灭危机
我国新一代载人登月飞船模型首次展出:将建造月球科研站
每日热议!委员建议:允许重大节日燃放烟花爆竹 应科学限放
吃透8图1模板,人人可以做架构
免费开源的邮件服务器搭建
天天热门:蚁群算法
每日热闻!Prometheus安装部署(主体)
【世界速看料】保时捷新能源车高架冒烟 司机:开得好好的就着了 差点被烧死
环球讯息:罗技Trophy G驾驶舱发布:兼容所有方向盘、踏板、主机和PC
百事通!网友称5千元买洗地机用2小时就坏掉:售后无门
天天速讯:十铨发布新款PCIe 5.0固态硬盘:顺序读取12000MB/s、配石墨烯散热片
当前速看:祸从天降!东北冰溜子从5楼坠落砸伤女子:北方人一定要注意
惠州普通话水平考试准考证查询
Joomla未授权访问漏洞(CVE-2023-23752)
环球头条:Go复合数据类型数组和切片
世界热点!springCloud Alibaba服务的注册与发现之eureka搭建
当前简讯:业内第三种烘干技术!石头宣布分子筛洗烘一体机H1
全国多地现“三星连珠”天象:金星、木星、弯月连成一条线
世界快讯:石头分子筛洗烘一体机H1发布:打破洗烘行业技术天花板
百度新车标外观专利获授权 造型罕见
世界观天下!小米新专利获授权:一卡多号 可节省功耗
what are ESC、BEC and UBEC ?
环球微动态丨不通过ArcGIS写Personal Geodatabase(esri mdb)
最新消息:我们喜爱的 10 种免费 SQL Server 资源
世界新消息丨ChatGPT对于普通人有什么机会和影响?
世界热消息:8成特效中国制作!《流浪地球2》豆瓣涨至8.3 超100万人评分
当前动态:38秒旋风榨汁 小熊无线多功能榨汁机34.9元大促
3000元档超香二代骁龙8旗舰!努比亚Z50 16GB+256GB狂飙版来了
《暗黑》平替?《火炬之光:无限》国服官宣5月公测
头条焦点:首个游戏版ChatGPT 网易《逆水寒》手游预计上半年推出:自研AI得分超过人类
tcl电冰箱
消息!北向资金本周净卖出41.25亿元
观天下!分布式事务和Spanner分布式数据库
8000+字,就说一个字Volatile
环球关注:ChatGPT迅速学会下棋精髓 把人类给整不会了 网友:这谁预判得了?
世界快报:长城拼了!哈弗H6 DHT-PHEV限时优惠1.5万元:仅14.48万起
全球短讯!iPhone 15标准版上了灵动岛和USB-C接口:但跟Pro版差距还是太大
《狂飙》高启兰在日本火爆出圈 网友:《柯南》妃英理本理
全球今亮点!数字孪生|可视化图表之分组柱状图
世界今日讯!测试角色在项目各阶段的项目管理tips
当前速读:【JVM】JDK7后intern方法总结
世界热讯:centos7多网口配置同网段IP解决方案
焦点快播:【Vue】vue3 元素在某区域内缩放拖拽
灵活就业交医保太亏了怎么说?交医保太亏了具体指的是什么
苹果水下操控iPhone屏幕专利获批:或万元起售的Ultra机型独享
当前信息:魅族20电池寿命稳了:1600天连续充放容量仍大于80%
【新视野】日系车再受质疑!铃木维特拉遭车主集体投诉:刹车变硬踩不动
全球快讯:女子下班途中被狗撞伤被判工伤 法院:非本人主要责任
LGV 引理
【报资讯】如何实现把多个git仓库合并为一个,并保留提交记录?
AI创作享有版权吗?
世界视讯!卖的比“老头环”快!《霍格沃茨之遗》销量破1200万
今天是世界讨厌香菜日 不爱吃竟是“天注定”:跟基因有关
测试版用户终于能“反悔”了:Win11新功能允许退回正式版系统
今日报丨果然是“应试” IIHS碰撞测试难度提高:年度获奖车型数量腰斩
海绵宝宝是一种原始的什么动物?红色海绵球是干什么用的?
正者无敌三个太太的结局是什么?正者无敌演员表介绍
宫锁连城为什么下架了?宫锁连城的大结局是什么?
安全帽能代替头盔吗?安全帽颜色的级别区分
光盘怎么进行拷贝?光盘拷贝到u盘需要多少钱?
word安全模式是怎么回事?word安全模式怎么解除?
苹果怎么查询激活时间?苹果怎么传输数据到新的手机上?
闪存卡损坏是什么原因?闪存卡损坏怎样修复?
当前速看:易基因|DNA甲基化研究的测序数据挖掘思路:干货分享
速看:Centos7单机部署Etcd
Springcloud~openfeign开启hystrix基于线程池熔断的传值问题
环球热点!产品经理
【网关开发】9.Openresty 自定义流量分流策略支持灰度(金丝雀)等发布业务场景
每日热议!刘洋一杆领跑资格考试36洞 四人并列第二
天天热议:曾凭五菱宏光MINI EV火爆出圈 小米汽车营销负责人周钘离职
全球限量1962台!徕卡推出D-Lux7 “007”限量版相机:售价达16800元
全球最资讯丨《嗜血印》魅魔DLC完善更新 新增魅魔纹和性感尾巴
全球热点!抄底手慢无:南国生椰拿铁33.9元起32杯(赠冰川杯)
热推荐:不满足于对话!微软希望ChatGPT控制机器为人服务
网络时间同步设备(时钟同步)产品的功能及技术参数
每日简讯:MegEngine 使用小技巧:使用 Netron 实现模型可视化