手写框架系列----Mybatis-----基本和源码长得差不多。写完再用真正的Mybatis改造,讲解Mybatis高级应用和源码剖析

本文详细介绍了如何手写Mybatis框架,从基本配置到自定义解析配置文件、创建会话对象,再到动态代理优化,以提高持久层接口的灵活性。作者通过实例展示了如何避免代码冗余,仅通过接口操作数据库,提升开发效率。
源码(码云):https://gitee.com/yin_zhipeng/implement_mybatis_of_myself.git
测试使用的数据库如下(sql文件已在源码中提供)

在这里插入图片描述

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for account
-- ----------------------------
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account`  (
  `id` char(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `money` int(20) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO `account` VALUES ('1', 'A', 100);
INSERT INTO `account` VALUES ('2', 'B', 100);

SET FOREIGN_KEY_CHECKS = 1;

一、手写Mybatis

1. 概念和基本分析

Mybatis是持久层框架的一种,对原生JDBC进行封装,并实现sql与逻辑的分离
  1. JDBC的问题和解决思路
    在这里插入图片描述
  2. 自定义Mybatis的思路
    在这里插入图片描述
    在这里插入图片描述
关键在于如何合理规定用户提供的xml配置文件,有了配置文件就好说了,直接解析,然后反射,拿到反射的东西,再使用JDBC完成操作
  1. sqlMapConfig.xml:存放数据库配置信息,和mapper.xml的全路径
  1. 这个文件随意一点就好,因为是基本配置完成一次,就不需要动了
  2. 提供数据库配置信息和mapper.xml全路径就好
  1. mapper.xml
  1. 这个文件就需要深思熟虑了,我们必须关心,那么多mapper.xml如何保证每一条sql语句不冲突,当执行动态sql时,如何封装用户传过来的条件参数。如何规定结果集封装的类型。
  2. 关于保证每一条sql不冲突的解决办法:
  1. 我们希望,每个mapper.xml文件的配置具有统一性,比如查询所有数据,我们希望都叫做< select id=“selectList”>.那么名字都一样如何准确定位这些sql呢?
  2. 所以我们决定在根标签定义唯一标识,它是整个mapper文件的id。起名为namespace
  1. 关于结果集封装的解决方案:我们要通过反射等技术,进行封装,就必须知道要反射什么类。所以需要结果集的sql,只需要指定resultType=“全限定路径”。我们就可以完成反射
  2. 关于使用用户传来的条件参数,我们依然通过全限定路径,然后根据属性名进行封装。使用形式就是#{属性名}
  1. 例子如下
<!--我们规定Mapper配置文件,根标签用mapper,并且需要提供一个此配置文件的唯一标识,namespace。
    有了namespace,我们mapper标签中配置的内容就可以重复,而不用每个Mapper配置文件,都得起不一样的名字-->
<mapper namespace="bank">
    <!--通过select标签封装查询sql语句,同样每一条sql,都需要有唯一标识,我们就通过namespace.id的形式标识吧。
        - 最终我们解析的时候就统一用statementId来封装
        - 同样的我们也得标识,最终查询出来的结果集如何封装,通过resultType指定-->
    <select id="selectList" resultType="com.yzpnb.entity.Account">
        select * from account
    </select>
    <!--而对于动态参数,我们也需要封装,通过paramterType指定。并且我们人为规定,用#{属性名}的形式来使用
        select * from account where id = ? ==转变为==> select * from account where id = #{id}-->
    <select id="selectOne" resultType="com.yzpnb.entity.Account" paramterType="com.yzpnb.entity.Account">
        select * from account where id = #{id}
    </select>
</mapper>

2. 使用端提供xml

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值