百度SEO

百度SEO

Products

当前位置:首页 > 百度SEO >

MyBatis精简版是什么?

96SEO 2026-08-03 22:29 3


整体概述

精简版 MyBatis 手写实现复刻 MyBatis 主要执行流程,抛弃复杂细节。把 MyBatis 拆分成三层:

  1. SqlSessionFactoryBuilder建造者,解析 xml 配置文件;说起来,
  2. SqlSessionFactory工厂。用来创建 SqlSession;不过,
  3. SqlSession执行层。封装 JD娱乐,执行 SQL 而且把查询结果转为 Java 对象。

底层还是原生 JD娱乐,只是做了封装。怎么说呢,我们自上而下逐段解析。

MyBatis精简版是什么?

一、整体文件结构

resources
├─ mybatis-config-datasource.xml // 全局配置
├─ School_Mapper.xml
└─ User_Mapper.xml
java
└─ org.itstack.demo.design
├─ SqlSession.java // 会话接口
├─ DefaultSqlSession.java // 会话实现类
├─ SqlSessionFactory.java // 工厂接口
├─ DefaultSqlSessionFactory.java
├─ SqlSessionFactoryBuilder.java // 解析xml,建立工厂
├─ Configuration.java // 全局配置类
└─ XNode.java // 封装每一条select标签里的数据

整体调用链路:

  • SqlSessionFactoryBuilderDefaultSqlSessionFactoryDefaultSqlSession
  • 辅助类:ConfigurationXNode

.Configuration.java

public class Configuration {
public Map dataSource;public Connection connection;public Map mapperElement;public void setDataSource { this.dataSource = dataSource;老实说,}
public void setConnection { this.connection = connection;}
public void setMapperElement { this.mapperElement = mapperElement;}
}
  • 作用:
  • 生命周期:SqlSessionFactoryBuilder.build时被创建;之后DefaultSqlSessionFactory全程持有。
  • 成员变量说明:
  • dataSource:
  • connection:
  • mapperElement:

方法解析

  • setDataSource: 把解析出来的数据库配置存入 Configuration。
  • setConnection: 设置已创建好的 JD娱乐 链接。
  • setMapperElement: 存入所有已解析完成的 SQL.

.XNode.java

public class XNode {
private String namespace;private String id;其实,private String parameterType;怎么说呢,private String resultType;不过,private String sql;private Map parameter;/* getter/setter omitted */
public String getSql { return sql;}
public String getResultType { return resultType;}
}
  • 每条 select 标签对应一个 XNode 实例,用来封装所有信息。),)。
  • ,话说回来, 创建时机:在 `SqlSessionFactoryBuilder.mapperElement` 循环解析 `

方法解析

  • "getSql" 方法将预处理后的 SQL 提供给 `DefaultSqlSession`,避免重复替换占位符。
  • "getResultType" 方法返回返回实体类全限定名,实现反射创建对象。

.SqlSessionFactory 接口 与 DefaultSqlSessionFactory 实现类

工厂接口 SqlSessionFactory.java

实现类 DefaultS qlSess ionF actory.j ava

  • "工厂只负责生产 SqlSessions";
  • 默认同一个 Connection 在多次 open 的情况下共享,所以在生产环境应使用连接池替代。

    . Sql Session 接口 + Default Sql Session 实现

    Sql Session 接口

    public interface SqlSess ion{ T> T selectOne;T> T selectOne;T> List selectList;其实,T> List selectList;话说回来,void close;说起来,}

    Default Sql Session 实现

    public class DefaultS qlSess ion implements S qlSes sion{ private Conne ctio n connection;private Map<> mapp erEle ment;public Defaul tS qlSess ion{ this.connection = conn;this.mapp erEle ment = mapp erEle ment;老实说,} ... }
    • "外观模式": 把底层 JD娱乐 的繁杂细节隐藏起来让业务代码只关注查询逻辑";
    • "主要功能": 执行 SQL + ORM 映射";话说回来,
    • "线程安全": 每次查询都新建 session。因为它持有 Connection";

      方法逐个详细拆解

      1. 构造方法: 接收工厂传递过来的连接和已准备好的 SQL 集合;
      2. selectOne: 根据 namespace.id 从 map 获取 XNode -> 准备 PreparedStatement -> 执行 -> 用 resultSet2Obj 转成对象列表并返回第一个元素;
      3. selectList: 同上,但直接返回完整列表;
      4. private resultSet2Obj: 利用 ResultSetMetaData 获取列名。 用反射匹配 setter 并赋值,实现自动 ORM;
      5. close: 回收 JD娱乐 Connection。老实说,

      . Sql Session Factory Builder

      public class S qlSes sionFac torB ui ld{ public DefaultSq lSess io Fact ory bu i ld{...} private Configurati on parseConfigurati on{...} ... }
      • build 为程序入口。从 Reader 开始读 XML。怎么说呢,
      • parseConfiguration 将 XML 中的数据拆分为 dataSourceconnection,mapperElement 并填充到 Configuration。
      • mapperElement 是主要。它遍历每个 Mapper.xml,把 ${} 占位符替换成 ? 并封装为 XNode 放进 map。

      使用者痛点与方法

      痛点 原因 如何改进
      手写大量 XML 与 Java 对应关系 开发者需要自己维护大量 使用脚本生成或模板化工具自动生成 Mapper
      参数占位符手动替换易出错 正则替换过程繁琐且可能漏掉某些情况 引入更强大的语法分析器或 DSL
      单一 Connection 导致并发瓶颈 默认实现没有连接池支持 集成 HikariCP 或 Apache D娱乐P
      缺少事务控制 没有统一事务管理方法 在 Factory 层添加事务开启/提交/回滚接口
      难以 插件/拦截器 没有拦截器链设计 引入可插拔拦截器机制

      完整调用流程

      html Reader reader = Resources.getResourceAsReader;DefaultSq lSess ioFact ory factory = new S qlSes sionFac torB ui ld.build;Sq lSes ion sqlSes sio n = factory.openSess ioN;User u ser = sqlSes sio n.selectOne;sqlSes sio n.close;

      用到的设计模式

      1. 建造者模式 — SqlSessionFactoryBuilder 专门负责一次性建立 Configuration。
      2. 工厂模式 — SqlSessionFactory 用于产生命令对象 DefaultSq lSess ion
      3. 外观模式 — DefaultSq lSess ion 封装底层 JD娱乐,让业务侧调用简单明了。
      4. 反射机制 — resultSet2Obj 将 ResultSet 自动映射为 POJO。

      二、后续可以测试验证一下

      .MySQL 执行建表语句

      sql CREATE DATABASE IF NOT EXISTS itstackdemodesign;USE itstackdemodesign;

      CREATE TABLE user ( id BIGINT NOT NULL AUTOINCREMENT,name VARCHAR,age INT,address VARCHAR,entryTime DATETIME,remark VARCHAR。createTime DATETIME,updateTime DATETIME,status INT DEFAULT '',dateTime VARCHAR,PRIMARY KEY,INDEX idxname ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

      INSERT INTO user VALUES。'无',NOW,NOW,NULL,'');

      CREATE TABLE school ( id BIGINT NOT NULL AUTO_INCREMENT,name VARCHAR。address VARCHAR,createTime DATETIME,updateTime DATETIME,PRIMARY KEY ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

      INSERT INTO school VALUES。NOW),NOW),

      创建 PO 实体类

      User.java

      java public class User { private Long id;private String name;private Integer age;private Date createTime;private Date updateTime;老实说,/* getters / setters omitted */ }

      School.java

      Dao 接口

      kotlin interface IUserDao { User queryUserInfoById;} interface ISchoolDao { School querySchoolInfoById;老实说,}

      配置文件与 Mapper 示例

      mybatis‑config‑datasource.xml

      xml environment default="development"> environment id="development"> transactionManager type="JD娱乐"/> dataSource type="POOLED"> property name="driver" value="com.mysql.cj.jdbc.Driver"/> property name="url" value=""/> property name="username" value=""/> property name=""value=""/> mapper resource="/mapper/User_Mapper.xml"/> mapper resource="/mapper/School_Mapper.xml"/> /resources/mysql/

      UserMapper.xml / SchoolMapper.xml – 如前所示。按理说,

      测试类 ApiTest.java

      java public class ApiTest { static Logger logger = Logger.getLogger;

       static void testQueryUserById{
      Reader reader = Resources.getResourceAsReader;try{
      Sq lSes ioFact ory builder = new Sq lSes ioFac torB ui ld;Sq lSes ioFact ory factory = builder.build;Sq lSes ion sqlSesion = factory.openSs e ssion;try{
      User user=sqlSesion.selectOne;logger.info);}finally{
      sqlSesion.close;reader.close;}
      }catch{e.printStackTrace;}
      }
      static void testQuerySchoolById{
      Reader reader ... same as above ...
      School school ... same as above ...
      logger.info);}
      public static void main{
      testQueryUserById;testQuerySchoolById;}
      

      }

      输出示例

      log INFO org.itstack.demo.design.ApiTest - 查询单个使用者结果:{"age":20,"createTime":"2019-09-01","id":1,"name":"水水","updateTime":"2019-09-01"} INFO org.itstack.demo.design.ApiTest - 查询学校结果:{"address":"北京市海淀区颐和园路5号"。"createTime":"2019-09-01","id":1,"name":"北京大学","updateTime":"2019-09-01"}


      三、后期可进一步完善的方向

      1️⃣ 完善