公司系统集成了mybatisplus,其中给封装好了很多方法,很多人包括我平常只知道怎么去使用却很少关注其实现原理,今天闲着没事(偷偷摸鱼)的时候点开了mybatisplus的源码,找到了其中的一个方法。
在这里插入图片描述
可以看到我们这个selectById的方法拓展了AbstractMethod抽象类返回了一个MappedStatement类型的对象,今天我们就来了解一下这个MappedStatement是个什么玩意儿:

  1. MappedStatement是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等,它位于mybatis包的org.apache.ibatis.mapping目录下,是一个final类型也就是说实例化之后就不允许改变
  2. mapper.xml文件中一个select\insert\update\delete标签对应一个MappedStatement对象, select\insert\update\delete标签的id即是MappedStatement的id
  3. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
  4. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程.
    MappedStatement源码定义如下
private String resource;//mapper配置文件名,如:UserMapper.xml
  private Configuration configuration;//全局配置
  private String id;//节点的id属性加命名空间,如:com.lucky.mybatis.dao.UserMapper.selectByExample
  private Integer fetchSize;
  private Integer timeout;//超时时间
  private StatementType statementType;//操作SQL的对象的类型
  private ResultSetType resultSetType;//结果类型
  private SqlSource sqlSource;//sql语句
  private Cache cache;//缓存
  private ParameterMap parameterMap;
  private List<ResultMap> resultMaps;
  private boolean flushCacheRequired;
  private boolean useCache;//是否使用缓存,默认为true
  private boolean resultOrdered;//结果是否排序
  private SqlCommandType sqlCommandType;//sql语句的类型,如select、update、delete、insert
  private KeyGenerator keyGenerator;
  private String[] keyProperties;
  private String[] keyColumns;
  private boolean hasNestedResultMaps;
  private String databaseId;//数据库ID
  private Log statementLog;
  private LanguageDriver lang;
  private String[] resultSets;

其中StatementType指操作SQL对象的类型,是个枚举类型,值分别为:

STATEMENT(直接操作SQL,不进行预编译),

PREPARED(预处理参数,进行预编译,获取数据),

CALLABLE(执行存储过程)

ResultSetType指返回结果集的类型,也是个枚举类型,值分别为:

FORWARD_ONLY:结果集的游标只能向下滚动

SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时当前结果集不变

SCROLL_SENSITIVE:结果集客自由滚动,数据库变化时当前结果集同步改变;

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐