说明
MyBatis版本:3.5.1
相关历史文章(阅读本文之前,您可能需要先看下之前的系列)
Spring Boot MyBatis最全教程:你值得拥有
MyBatis能脱离Spring吗一图纵览MyBatis的工作原理从源码看MyBatis,竟如此简单MyBatis的Mapper是什么`垃圾`
前言
运筹帷幄之中,决胜千里之外,是该做个了结了,把你的家伙掏出来,上刺刀。
上一篇已经能够使用SqlSession进行查询返回结果了。这一篇我们就是加入瑞士军刀Mapper。
一、分析
在SqlSession会提供getMapper的方法,在DefaultSqlSession会使用Proxy实例化一个MapperProxy代理,而MapperProxy代理会获取SqlSession,在这里进行Sql的操作,然后结果。
二、编码
2.1 MapperProxy
MapperProxy是mapper最终执行的核心:
package com.kfit.mybatis.session.impl; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Collection; import com.kfit.mybatis.session.SqlSession; public class MapperProxy implements InvocationHandler{ private SqlSession sqlSession; public MapperProxy(SqlSession sqlSession) { this.sqlSession = sqlSession; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String statement = method.getDeclaringClass().getName()+"."+method.getName(); //isAssignableFrom方法是判断是否为某个类的父类 if(Collection.class.isAssignableFrom(method.getReturnType())) { //返回值是集合的话,那么是调用selectList return sqlSession.selectList(statement,null==args?null:args[0]); }else { return sqlSession.selectOne(statement,null==args?null:args[0]); } } }
说明:
(1)由于MapperProxy是一个代理类,所以需要实现接口InvocationHandler的Invoke方法。
(2)在Invoke方法中直接使用SqlSession进行执行,那么主要的核心就是要判断具体执行什么方法,这里现在通过返回值是否是集合来判断是否是执行selectOne还是SelectList。
2.2 SqlSession
在SqlSession中添加getMapper方法:
public interface SqlSession { <T> T selectOne(String statement, Object parameter); <E> List<E> selectList(String statement); <E> List<E> selectList(String statement, Object parameter); <T> T getMapper(Class<T> type); }
在DefaultSqlSession中进行实现getMapper方法:
@SuppressWarnings("unchecked") public <T> T getMapper(Class<T> type) { T newProxyInstance = (T) Proxy.newProxyInstance(type.getClassLoader(),new Class[]{type},new MapperProxy(this)); return newProxyInstance; }
2.3 测试下
好了写段代码测试下吧:
public static void main(String[] args) { String resource = "mybatis-config.xml"; InputStream inputStream = App.class.getClassLoader().getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); System.out.println(sqlSessionFactory); System.out.println(sqlSessionFactory.getConfiguration().getJdbcProperties().getUrl()); SqlSession sqlSession = sqlSessionFactory.openSession(); Demo demo = null; List<Demo> demos = null; //使用Mapper DemoMapper demoMapper = sqlSession.getMapper(DemoMapper.class); demo = demoMapper.getById(1); System.out.println(demo); demos = demoMapper.getAll(); System.out.println(demos); }
运行看下结果:
Demo [id=1,name=张三1]
[Demo [id=1, name=张三1], Demo [id=9, name=张三], Demo [id=10, name=张三], Demo [id=11, name=张三], Demo [id=12, name=张三], Demo [id=13, name=张三]]
很明显执行的结果和直接使用SqlSession调用的结果是一样的。
好了有关手写MyBatis的文章就先到此告一段落了,通过手写mybatis,想必大家对于MyBatis的认知又高了一个等级了。
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip ...
手写mybatis框架源码 不借助其他任何框架,从最底层开始着手,用最简单的代码,将mybatis的底层框架,手写出来,让你对mybatis有一个更加深刻和直观的理解 详见:...
赠送jar包:mybatis-spring-2.0.0.jar; 赠送原API文档:mybatis-spring-2.0.0-javadoc.jar; 赠送源代码:mybatis-spring-2.0.0-sources.jar; 赠送Maven依赖信息文件:mybatis-spring-2.0.0.pom; 包含翻译后的API...
赠送jar包:mybatis-generator-core-1.3.7.jar; 赠送原API文档:mybatis-generator-core-1.3.7-javadoc.jar; 赠送源代码:mybatis-generator-core-1.3.7-sources.jar; 赠送Maven依赖信息文件:mybatis-generator-...
赠送jar包:mybatis-spring-2.0.6.jar; 赠送原API文档:mybatis-spring-2.0.6-javadoc.jar; 赠送源代码:mybatis-spring-2.0.6-sources.jar; 赠送Maven依赖信息文件:mybatis-spring-2.0.6.pom; 包含翻译后的API...
本工程为 MyBatis-Plus 的官方示例,项目结构如下: mybatis-plus-sample-quickstart: 快速开始示例 mybatis-plus-sample-quickstart-springmvc: 快速开始示例(Spring MVC版本) mybatis-plus-sample-reduce-...
赠送jar包:mybatis-3.5.9.jar; 赠送原API文档:mybatis-3.5.9-javadoc.jar; 赠送源代码:mybatis-3.5.9-sources.jar; 赠送Maven依赖信息文件:mybatis-3.5.9.pom; 包含翻译后的API文档:mybatis-3.5.9-javadoc-...
赠送jar包:mybatis-spring-2.0.5.jar; 赠送原API文档:mybatis-spring-2.0.5-javadoc.jar; 赠送源代码:mybatis-spring-2.0.5-sources.jar; 赠送Maven依赖信息文件:mybatis-spring-2.0.5.pom; 包含翻译后的API...
赠送jar包:mybatis-spring-1.3.2.jar; 赠送原API文档:mybatis-spring-1.3.2-javadoc.jar; 赠送源代码:mybatis-spring-1.3.2-sources.jar; 赠送Maven依赖信息文件:mybatis-spring-1.3.2.pom; 包含翻译后的API...
eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd eclipse中使用xml自动提示功能所需文件:mybatis-3-mapper.dtd
Mybatis-ehcache 1.2.1 是一个集成Mybatis和Ehcache的缓存模块,用于提高Mybatis框架的查询效率。Ehcache是一个广泛使用的Java缓存解决方案,它能够有效地存储和检索数据,减少数据库的负载,提高应用程序性能。在...
开发工具 框架JAR mybatis-3.4.2开发工具 框架JAR mybatis-3.4.2开发工具 框架JAR mybatis-3.4.2开发工具 框架JAR mybatis-3.4.2开发工具 框架JAR mybatis-3.4.2开发工具 框架JAR mybatis-3.4.2开发工具 框架JAR ...
赠送jar包:mybatis-3.5.5.jar 赠送原API文档:mybatis-3.5.5-javadoc.jar 赠送源代码:mybatis-3.5.5-sources.jar 包含翻译后的API文档:mybatis-3.5.5-javadoc-API文档-中文(简体)版.zip 对应Maven信息:...
赠送jar包:mybatis-3.5.3.jar; 赠送原API文档:mybatis-3.5.3-javadoc.jar; 赠送源代码:mybatis-3.5.3-sources.jar; 赠送Maven依赖信息文件:mybatis-3.5.3.pom; 包含翻译后的API文档:mybatis-3.5.3-javadoc-...
- 后端技术:Spring + SpringMVC + MyBatis(SSM) - 前端框架:LayUI 技术栈 - 数据库:MySQL - 开发工具:IDEA - 数据连接池:Druid - Web容器:Apache Tomcat - 项目管理工具:Maven - 版本控制工具:Git - 后端...
赠送jar包:mybatis-3.4.6.jar; 赠送原API文档:mybatis-3.4.6-javadoc.jar; 赠送源代码:mybatis-3.4.6-sources.jar; 赠送Maven依赖信息文件:mybatis-3.4.6.pom; 包含翻译后的API文档:mybatis-3.4.6-javadoc-...
在IT行业中,Spring、SpringMVC和MyBatis是三个非常重要的开源框架,它们在企业级Java应用开发中占据了核心地位。本系列面试题聚焦于这三个框架,旨在帮助求职者和开发者深入理解并掌握其核心概念和技术。以下是针对...
技术框架 后端 核心框架:SpringBoot 2.0.4.RELEASE 持久层框架:Mybatis, Mybatis-plus 数据库:Mysql 5.7.23 缓存:Redis 登录校验:Jwt-token Spring Security 单体应用:可自行Nginx负载均衡 前端 JS框架:Vue...
mybatis-plus-extension.jar 各个版本,免费下载。 mybatis-plus 的扩展插件。,各个版本,免费下载。 mybatis 增强工具包的扩展插件,各个版本,免费下载。 下载不了,可关注我,评论区联系我。
赠送jar包:mybatis-3.5.7.jar; 赠送原API文档:mybatis-3.5.7-javadoc.jar; 赠送源代码:mybatis-3.5.7-sources.jar; 赠送Maven依赖信息文件:mybatis-3.5.7.pom; 包含翻译后的API文档:mybatis-3.5.7-javadoc-...