一次Mybaits查询的源码分析_天天报道
很好奇Mybaits是怎么将xml和mapper对应起来的,用一段比较简单的demo去debug追踪一下源码看看
先用xml配置的方式,看懂了再去看注解的方式是怎么实现的
【资料图】
获取MapperMybaits是如何从xml中加载到mapper的
在xml中有mapper
标签,应该是从这里加载到配置
示例代码
public static void main(String[] args) { // 第一阶段:MyBatis的初始化阶段 String resource = "mybatis-config.xml"; // 得到配置文件的输入流 InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } // 得到SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 第二阶段:数据读写阶段 try (SqlSession session = sqlSessionFactory.openSession()) { // 找到接口对应的实现 UserMapper userMapper = session.getMapper(UserMapper.class); // 组建查询参数 User userParam = new User(); userParam.setSchoolName("Sunny School"); // 调用接口展开数据库操作 List userList = userMapper.queryUserBySchoolName(userParam); // 打印查询结果 for (User user : userList) { System.out.println("name : " + user.getName() + " ; email : " + user.getEmail()); } } }
从UserMapper userMapper = session.getMapper(UserMapper.class);
此处开始debug,看看是怎么获取到mapper的
一路点进来发现是从一个Map中去获取mapper对象
private final Map
那么是从什么时候填充knownMappers
的呢
这个对象的方法不只有获取mapper,还有添加mapper,找一个添加方法继续断底点
找到是找到了,但是不知道什么时候调用的,可以通过IDEA的调用栈
最后发现了,是加载xml的时候,去解析mapper
标签里的值,然后再通过类加载器去加载资源,最后加载到knownMappers
中,还有去解析xml中的sql的过程
这样子xml就和mapper就对应起来了,虽然知道了mapper和xml的对应关系,但是不知道怎么通过调用mapper里的方法,去找到对应的sql
在对List
debug时,没有进入到mapper方法中,而是会进入到一个代理类中
刚刚在getMapper()
中给UserMapper
创建了代理,那么大概知道是mapper和xml是怎么关联的了,当调用mapper时,会被MapperProxy
代理,去执行查询方法时,通过上边的knownMappers
获取到mapper对应的xml,这样代理类就知道要调用的方法和对应的sql的哪里
最终时通过mapperMethod.execute(sqlSession, args);
去执行查询的,点进去一看发现对各种sql类型做了处理
select的查询原来通过返回值来选择不同的处理
很好奇这些属性是怎么判断的,找到对应的类继续断点
原来是在execute
之前去赋值,而且这个方法会把调用方法对应的xml中的方法找到
通过获取到方法的返回值,然后再去做对比,我这个方法返回的是list
,就命中了returnMany
,在继续断点,找到了真正执行的方法
这里就已经将关联的xml信息带过来了
继续看会看到缓存相关的代码,如果命中了缓存就直接返回了,我这里没有就继续开了一个线程往下执行,delegate
是一个Executor
最后的查询到了这里,就是调用mysql的包了,在statement
中,已经把sql、参数和连接配置什么的都封装好了
查询完后把结果返回到statement
,但是返回的内容很多,查询结果记录在这里
查询总结:
在进行数据库查询前,先查询缓存;没有名中,则数据库查询之后的结果也放入缓存中SQL 语句的执行经过了层层转化,依次经过了 MappedStatement 对象、Statement对象和 PreparedStatement对象,最后才交给mysql执行最终数据库查询得到的结果交给 ResultHandler对象处理返回结果将结果映射到实体类上这段代码有点绕,调用链很长
首先是这里先创建输出的实体类,就是resultMap里定义的对象
创建好实体后,把实体传输给下一个方法,填充实体
将实体字段和结果集里的字段对应起来,然后根据字段去获取对应的值,然后把值设置到实体里,通过循环遍历全部字段
这样走一圈回来,一个对象就映射好了,再经过循环,就把全部的对象都拿到了,最后再将这些对象封装到multipleResults
集合里,这个集合就是返回值了
映射总结:
获取并创建实体类将实体类的字段和结果集的字段一一对应,然后再填充实体的值最后返回实体集合总结以上就是Mybaits读取xml,然后查询的过程了,整个过程还是很复杂的,很多层封装和跳转,但是大大的提高了我们开发的效率
然后再把总结发一下
获取配置总结:
得到配置文件然后转换成输入流将输入流传给SqlSessionFactoryBuilder
创建SqlSessionFactory
扫描xml文件并加载,然后将xml和mapper的对应关系填充好查询总结:
在进行数据库查询前,先查询缓存;没有名中,则数据库查询之后的结果也放入缓存中SQL 语句的执行经过了层层转化,依次经过了 MappedStatement 对象、Statement对象和 PreparedStatement对象,最后才交给mysql执行最终数据库查询得到的结果交给 ResultHandler对象处理映射总结:
获取并创建实体类将实体类的字段和结果集的字段一一对应,然后再填充实体的值最后返回实体集合-
一次Mybaits查询的源码分析_天天报道
博客园 2023-06-17
-
重点聚焦!矶钓竿和海竿有啥区别_矶钓竿和海竿的区别
互联网 2023-06-17
-
梅西宁愿度假也不来是吧?印尼球迷:希望阿根廷输球 让梅西后悔
直播吧 2023-06-17
-
焦点要闻:舞剧《门》在闽南大戏院上演 顶配阵容演绎精彩社会图景
厦门晚报 2023-06-17
-
天天热点!今晚到明天白天,盆地天气阴云为主,局地有阵雨或雷雨
川观新闻 2023-06-17
-
祝贺!陈雨菲击败韩国天才少女晋级决赛,成“Big4”最后夺冠希望
顶端新闻 2023-06-17
-
浙江高校校长毕业致辞:“内卷”狭隘,要读书破万“卷”
百度新闻 2023-06-17
-
环球百事通!磷酸氢二铵商品报价动态(2023-06-17)
生意社 2023-06-17
-
7月,时间煮雨,说好不分离,3星座痴情难舍,携手相伴余生-环球快看
搜狐 2023-06-17
-
英前首相约翰逊"再就业" 成《每日邮报》专栏作家
中国新闻网 2023-06-17
-
一次Mybaits查询的源码分析_天天报道
博客园 2023-06-17
-
重点聚焦!矶钓竿和海竿有啥区别_矶钓竿和海竿的区别
互联网 2023-06-17
-
梅西宁愿度假也不来是吧?印尼球迷:希望阿根廷输球 让梅西后悔
直播吧 2023-06-17
-
焦点要闻:舞剧《门》在闽南大戏院上演 顶配阵容演绎精彩社会图景
厦门晚报 2023-06-17
-
天天热点!今晚到明天白天,盆地天气阴云为主,局地有阵雨或雷雨
川观新闻 2023-06-17
-
祝贺!陈雨菲击败韩国天才少女晋级决赛,成“Big4”最后夺冠希望
顶端新闻 2023-06-17
-
浙江高校校长毕业致辞:“内卷”狭隘,要读书破万“卷”
百度新闻 2023-06-17
-
环球百事通!磷酸氢二铵商品报价动态(2023-06-17)
生意社 2023-06-17
-
7月,时间煮雨,说好不分离,3星座痴情难舍,携手相伴余生-环球快看
搜狐 2023-06-17
-
英前首相约翰逊"再就业" 成《每日邮报》专栏作家
中国新闻网 2023-06-17
-
全球观焦点:分心驾驶致5人身亡 家属质疑10个气囊全未弹开 丰田销售:后方撞击不能触发
快科技 2023-06-17
-
宜昌市卫生和计划生育委员会
互联网 2023-06-17
-
一件啤酒是几瓶_一件啤酒是多少瓶-天天热推荐
元宇宙网 2023-06-17
-
崴脚、流产、腹泻、流鼻血……这5种病容易“习惯性”复发 全球新资讯
生命时报 2023-06-17
-
AI绘画第十五期
哔哩哔哩 2023-06-17
-
重点聚焦!江苏阜宁:23年搭台招商 “朋友圈”越拓越广
人民网-江苏频道 2023-06-17
-
当前速读:四川路桥自研首个可实现产业化智能建造产品:拌合站集控式AI生产系统即将推广应用
云财经 2023-06-17
-
亲爱的自己袁慧中结局_亲爱的自己简介|当前简讯
万能网 2023-06-17
-
美让俄乌冲突失去底线,核武交锋要开启?关键时刻一国愿陪俄核战 当前关注
前卫新视角 2023-06-17
-
6月16日基金净值:国投瑞银进宝灵活配置混合最新净值3.1765,涨0.5% 焦点热议
证券之星 2023-06-17
-
世界视点!房屋登记办法还能适用吗 房屋登记办法是否废止
城市网 2023-06-17
-
李子怎么保存能放时间长一点 李子怎样才能保存的时间长一点-焦点快报
互联网 2023-06-17
-
环球快资讯丨天津交通违章查询方法_天津交通违章查询指南
互联网 2023-06-17
-
6月16日基金净值:银河产业动力混合最新净值0.9045,涨2.28%
证券之星 2023-06-17
-
照片怎么200kb以下_照片1m等于多少kb
互联网 2023-06-17
-
电脑怎么激活windows7_windows7怎么激活
互联网 2023-06-17
-
平安普惠贷款逾期了还不起会怎么样_贷款逾期会怎样
互联网 2023-06-16
-
天天通讯!如果个人想创业或者说挣大钱,需要天使投资,我知道的情况是现在不缺钱,而是缺…
观察网 2023-06-16
-
【新华财经调查】国内外酒店加速“掘金”下沉市场 推动住宿业升级换代-世界聚看点
新华财经 2023-06-16
-
世界百事通!他才是赢家,就连赵立春都束手无策
小虎子说娱乐 2023-06-16