手把手带你写一个 MiniSpring
郭屹
前 Sun Microsystems Java 研发工程师,开源软件 MiniSpring、MiniTomcat 开发者
6170 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
手把手带你写一个 MiniSpring
15
15
1.0x
00:00/00:00
登录|注册

15|mBatis:如何将SQL语句配置化?

你好,我是郭屹。今天我们继续手写 MiniSpring。这节课我们要模仿 MyBatis,将 SQL 语句配置化。
上一节课,在已有的 JDBC Template 基础之上,我们按照专门的事情交给专门的部件来做的思路,对它做了进一步地拆解,抽取出了数据源 DataSource 这个部件,然后我们把 SQL 语句参数的处理独立成了一个 ArgumentPreparedStatementSetter,之后对于返回结果,我们提供了两个东西,一个 RowMapper 和一个 RowMapperResultSetExtractor,把一条数据库记录和一个记录集转换成对象和对象列表,便利了上层应用程序。最后为了提高性能,我们还引入了一个简单的数据库连接池。
现在执行的 SQL 语句本身还是硬编码在程序中的,所以这节课,我们就模仿 MyBatis,把 SQL 语句放到程序外面的配置文件中。

MyBatis 简介

我们先来简单了解一下 MyBatis。
官方说法:MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何模仿MyBatis实现自己的mBatis。通过配置文件将SQL语句放在外部配置文件中,使用一个结构对应配置文件中的SQL语句的定义。仿照MyBatis,使用一个SqlSessionFactory来处理,并默认实现一个DefaultSqlSessionFactory来负责。在使用Sql Session访问数据时,通过工厂创建一个Sql Session,再执行SQL命令。这个设计留下了灵活性,意味着每一次真正执行某条SQL语句的时候可以替换JdbcTemplate,使动态数据源成为可能。文章通过示例代码深入浅出地介绍了mBatis的配置化特点和实现原理,对于想要深入了解持久化框架的读者具有很高的参考价值。 总结来看,本文通过仿照MyBatis实现了mBatis,将SQL语句进行了配置化。通过一个SqlSessionFactory解析配置文件,以一个id来代表使用的SQL语句。应用程序使用的时候,给SqlSession传入一个SQL的id号就可以执行。然而,这个是极简版本,远远没有实现MyBatis丰富的功能。比如现在只有select语句,没有update;比如SqlSession对外只有一个selectOne接口,非常单薄;比如没有SQL数据集缓存,每次都要重新执行;比如没有读写分离的配置。如何在这个极简版本的基础上进行扩展,就需要读者动动脑筋,好好思考一下了。在一步步构建框架的过程中,主要学习的是搭建框架的思路,拆解部件,让专门的部件去处理专门的事情,让自己的框架具有扩展性。读者可以通过完整源代码参见,进一步思考如何扩展到update语句,以及实现读写分离的配置。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniSpring》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • peter
    请教老师两个问题啊: Q1:Mapper配置的几个问题 在“Mapper配置”部分,有一个xml文件的说明: <mapper namespace="com.test.entity.User"> <select id="getUserInfo" parameterType="java.lang.Integer" resultType="com.test.entity.User"> 下面是文字说明:“这个配置中,也同样有基本的一些元素:SQL 类型、SQL 的 id”, 请问:namespace有什么用?文字说明中的“SQL 类型”对应哪个部分?是对应namespace吗? namespace与resultType相同,是必须相同吗?还是可以不相同? Q2:没有请求时候访问数据库。 SpringBoot项目,controller中自动注入service,service中自动注入Mapper。请求来了之后,由controller处理,controller调用自动注入的service,service再调用自动注入的Mapper,这是典型的ssm流程。 但是,现在有一个需求:软件启动后,需要访问数据库,此时并没有请求。我现在的实现方法是:controller的构造函数中使用JDBC访问数据库,是成功的。 问题:软件启动后,controller的构造函数执行了,说明controller被实例化了,此时service会自动注入吗? (项目是两年前做的,当时一开始是尝试还用ssm来访问数据库,但好像失败了;印象中好像是service为null,就是说没有自动注入。)

    作者回复: namespace区分不同的mapper,以免重名。sql类型是指select,update这些。 建议不要用controller访问数据库,层次不清。

    2023-04-16归属地:北京
  • 云从
    老师这节课在xml 中配置sqlSessionFactory时,使用了init-method,如果我没看漏的话 ,前面代码我们应该没有处理这个属性 需要在XmlBeanDefinitionReader 处理一下
    2023-10-16归属地:四川
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部