MyBatis原理剖析(二)

上一章节我们聊了聊JDBC的缺点以及mybatis的基本框架,本章我们从mapper配置文件入手来解析mybatis

我们知道在mybatis中由于数据库连接的配置文件不经常更改,而sql的配置文件则总是要去更改因此对于不同类型的配置文件采用了隔离的机制,对于系统配置文件用**sqlMapConfig**来进行配置对于sql语句的配置文件则采用mapper配置文件进行配置。

mapper配置文件:

对于mapper配置文件来说是用来存储sql语句的,那么所有的sql语句都放在一个mapper配置文件中吗?答案肯定是否定的。对于mapper来说往往是一个service业务有着自己的mapper配置文件

如上图所示,product业务有着自己的mapper,user业务也有着自己的mapper。这样使得mapper之间相互隔离每个mapper专注于一个业务进行服务。那么这些mapper内部是如何配置的呢?下面我们看看userMapper的代码。

XML 复制代码
<mapper namespace="com.example.mapper.UserMapper">
  <!-- 查询用户 -->
  <select id="selectUserById" parameterType="Long" resultType="xx.xx.xx.User">
    SELECT * FROM users WHERE id = #{id}
  </select>

  <!-- 插入用户 -->
  <insert id="insertUser" parameterType="User">
    INSERT INTO users (username, email, age)
    VALUES (#{username}, #{email}, #{age})

   </insert>

</mapper>

我们可以看到最外层是一个mapper标签,这个mapper标签的主要作用就是区分不同的mapper文件,mapper标签含有一个namespace的属性,不同的mapper中的namespace的值不同这样就实现了相互隔离的机制。我们继续看内部含有了一个select标签和一个insert标签这两个标签每一个都将会被映射为一个mappedStatement对象用来对应每一个sql语句,继续看这两个标签内部我们发现都含有id,这个id就是给当前sql起了一个名字为了能够准确的定位到当前sql。并且select标签和insert标签都标志着sql不同的执行类型。同时我们之前说到过mybatis解决了JDBC执行sql后返回结果需要手动封装的问题,在上述select标签内部的resultType这个属性则是指明返回的数据类型,通过resultType所指向的类全路径使得返回数据能够映射到指定的返回类型中去。同时在jdbc中是用?来表示占位符,但是在mybatis则是通过#{}来进行占位符,通过parameterType来说明参数的映射类型是什么样的。parameterType和resultType本质都是通过反射来将数据进行映射出来的。

总的来说:并不是所有的sql语句都写到一个mapper配置文件中去,而是将不同的sql根据业务放在不同的mapper中去,同时每个mapper有着自己的命名空间实现mapper之间的隔离,mapper中的sql语句都是由一个标签进行包裹用来映射为一个mappedStatement对象,每个标签都有着自己的id。并且通过标签的parameterType属性和resultType属性分别用来标志反射映射的类型。

sqlMapConfig配置文件:

对于**sqlMapConfig** 配置文件来说则是用来配置sql的连接的,同时在这个配置文件内部还含有mapper配置文件的地址,也就是说只要加载**sqlMapConfig就能够读取到所有的mapper文件**

也是使用反射的机制将配置文件中的属性一个个映射到类属性中

XML 复制代码
<configuration>
  <!-- 环境配置 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
      </dataSource>
    </environment>
  </environments>

  <!-- 注册Mapper -->
  <mappers>
    <mapper resource="mapper/UserMapper.xml"/> <!-- 注册Mapper文件 -->
  </mappers>
</configuration>

对于**sqlMapConfig**配置文件和mapper配置文件则是分别映射到Configuration和MappedStatement对象中后续将会介绍这两个对象的属性。

相关推荐
码兄科技13 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研14 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe1814 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_14 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff15 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯15 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地16 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我1234516 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
云和恩墨16 小时前
数据库一体机简史:从ODA到zData X,命名之中的玄机
数据库·vr
万亿少女的梦16816 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue