首页 > 其他分享 >自定义mybatis框架

自定义mybatis框架

时间:2022-12-14 14:45:25浏览次数:58  
标签:mapper 自定义 框架 mappers 获取 mybatis new 我们 配置文件

自定义mybatis框架

自定义mybatis框架整体思路如下:
首先我们需要获取一个输入流 然后解析我们的xml主配置文件 这里面主要涉及到数据库的连接信息和我们的mapper配置文件信息
数据库连接信息封装到我们的configuration类即可 然后我们还需要在该类中存放我们的mapper信息

private Map<String,Mapper> mappers = new HashMap<String,Mapper>();

001假如是mapper配置文件 我们是这样处理解析mapper配置文件
<mapper resource="com/po/mapper/UserMapper.xml"/>
其中 key值是namespace+"."+标签的id;
value值是
Mapper mapper = new Mapper();
mapper.setQueryString(queryString);//具体的sql
mapper.setResultType(resultType);//实体类的全限定类名
因为我们执行sql语句之后 需要得到sql语句查询结果对应的实体类 所以这个实体类就是mapper里的resultType

002假如是注解配置我们是这样处理
首先我们需要新建一个select注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Select {
//配置SQL语句的
String value();
}
如果我们从主配置文件中没有获取到resource属性 那说明没有mapper配置文件 那说明我们是配置了注解模式开发 所以我们需要获取class属性 得到接口的全限定类名
<!-- 002使用映射器接口实现类的完全限定类名 -->
<mapper class="com.po.pf.repository.UserMapper"/>
得到全限定类名后 我们通过反射 遍历每个方法 获取每个方法头上的注解的标签 并获取到值
//取出注解的value属性值
Select selectAnno = method.getAnnotation(Select.class);
String queryString = selectAnno.value();
mapper.setQueryString(queryString);

String key = className+"."+methodName;

得到上述信息之后 把主配置文件和mapper配置文件的数据存在我们的configuration类中
然后我们利用建造者模式创建SqlSessionFactoryBuilder对象 我们把输入流交给构建者 构建者调用工具类帮我们获取configuration 然后返给我们一个factory对象 工程对象
public SqlSessionFactory build(InputStream config){
Configuration cfg = XMLConfigBuilder.loadConfiguration(config);
return new DefaultSqlSessionFactory(cfg);
}
传入一个输入流对象 内部通过解析获取configuration 然后再创建sqlsessionFactory工厂
sqlsessionFactory工厂对象帮我们提供了一个打开session方法 然后我们需要在session里面处理我们的业务 比如执行sql这样
但是现在有个问题 比如我并不知道我传过来的确切的mapper类是什么 然后我也不知道他里面具体有什么方法 那我就无法得知里面的内容 所以就没办法调用
所以此时需要引入动态代理 我们只需要传入class就可以帮助我们获取这个类里面的方法 然后调用invoke帮我们去执行sql语句
所以sqlsession类里有一个getMapper的动态代理方法
public <T> T getMapper(Class<T> daoInterfaceClass) {
return (T) Proxy.newProxyInstance(daoInterfaceClass.getClassLoader(),
new Class[]{daoInterfaceClass},new MapperProxy(cfg.getMappers(),connection));
}
然后我们的MpperProxy帮助我们去执行这些sql语句
package com.po.pf.mybatis;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Map;
public class MapperProxy implements InvocationHandler {
//map的key是全限定类名+方法名
private Map<String,Mapper> mappers;
private Connection conn;

public MapperProxy(Map<String,Mapper> mappers,Connection conn){
this.mappers = mappers;
this.conn = conn;
}
//用于对方法进行增强的,我们的增强其实就是调用selectList方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//1.获取方法名
String methodName = method.getName();
//2.获取方法所在类的名称
String className = method.getDeclaringClass().getName();
//3.组合key
String key = className+"."+methodName;
//4.获取mappers中的Mapper对象
Mapper mapper = mappers.get(key);
//5.判断是否有mapper
if(mapper == null){
throw new IllegalArgumentException("传入的参数有误");
}
//6.调用工具类执行查询所有
return new Executor().selectList(mapper,conn);
}
}

到这里我们的工具基本完成任务

标签:mapper,自定义,框架,mappers,获取,mybatis,new,我们,配置文件
From: https://www.cnblogs.com/popopopopo/p/16982116.html

相关文章

  • mybatis的mapper映射文件
    mybatis的mapper映射文件MyBatis的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的XML文件就显得相对简单。如果拿它跟具有相同功能的JDBC代码......
  • 新增自定义前缀
    新增自定义前缀1.设置->自定义项2.选择发布者3.新建4.填写信息项,保存即可......
  • ArkUI框架,更懂程序员的UI信息语法
    ArkUI框架简化代码的“秘密”在传统的开发过程中,总有个问题在困扰我:如何实现前端view与后端数据的同步更改?例如:在某个视频类app的页面,如果我想要实现视频的点击播放功能,需要......
  • Go语言十大主流微服务框架
    1.Istio(31.7K)项目简介:Istio是由Google、IBM和Lyft开源的微服务管理、保护和监控框架。使用istio可以很简单的创建具有负载均衡、服务间认证、监控等功能的服务网络,而不需要......
  • Go语言使用场景 | go语言与其它开源语言比较 | Go WEB框架选型
    一、Go语言使用场景1.关于go语言2007年,受够了C++煎熬的Google首席软件工程师RobPike纠集RobertGriesemer和KenThompson两位牛人,决定创造一种新语言来取代C++,这就是Go......
  • myBatis的全局配置文件
    myBatis的全局配置文件mybatis封装需要的三要素数据源执行语句操作者SqlSessionFactoryBuilder第一步解析xml文件configuration(配置)001运行环境environmentdataSource......
  • 超全!Python图形界面框架PyQt5使用指南!
    使用Python开发图形界面的软件其实并不多,相对于GUI界面,可能Web方式的应用更受人欢迎。但对于像我一样对其他编程语言比如C#或WPF并不熟悉的人来说,未必不是一个好的工具。......
  • WPF使用WindowChrome自定义标题栏
    第一步:基本实现添加Window的Style定义,并设置WindowChrome.WindowChrome属性;设置WindowChrome标题栏:CaptionHeight——主要用于拖动有效区;GlassFrameThickness——影......
  • 写过vue自定义指令吗,原理是什么?.m
    背景看了一些自定义指令的文章,但是探究其原理的文章却不多见,所以我决定水一篇。如何自定义指令?其实关于这个问题官方文档上已经有了很好的示例的,我们先来温故一下。除......
  • mybatis入门案例
    创建模块,导入坐标:<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></prop......