【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:编写一个引入MyMybatis框架的正常项目

上一篇文章中,我们学习了使用mybatis框架连接mysql。在这篇文章中,我们将聚焦于我们的调用方,即相应的实际项目,其中包含了对mymybatis框架的引用。以一个常见而又典型的例子来说明这一点——制作一款学生管理系统()。这个所谓的“项目”显然无法像之前那样,依靠创建jdbc连接并且一条一条地编写SQL语句来解决问题,因为任何一项正常的开发流程都不应该如此生硬。

我们需要根据实际情况,创造性地制定并设置一份含有相关内容的文档文件(也被称为“配置文件”)。其中,包含了各种数据库的具体参数信息。接下来,我们只需专注于编写具体的功能性代码以及正确传递所需的参数,并在这个基础上编写适当的SQL语句即可,与我们平常使用mybatis框架的场景无异,即和上一篇文章无太大的差别。

首先我们需要创建一个正常的maven项目。这里我们就叫做:my-mybatis-demo

在这里插入图片描述

正常的项目都会像我们这样引入一个jar包在pom文件中。

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.masiyi</groupId><artifactId>my-mybatis</artifactId><version>1.0-SNAPSHOT</version></parent><groupId>com.masiyi</groupId><artifactId>my-mybatis-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.masiyi</groupId><artifactId>my-mybatis-core</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

这里面我们先暂且取名叫做my-mybatis-core,最基础的我们要有一个对应表数据结构的一个实体类。就是我们在上一篇中的user表。这里我们使用驼峰命名法。

package com.masiyi.entity;import lombok.Data;@Data
public class User {private Integer id;private String name;private Integer age;}

这里的@Data是lombok中的注解,待会我们会在我们框架中引入,我们先不管。

之后我们需要有一个接口去定义我们的方法以实现SQL的编写。这里我们就叫userdao,里面定义了两个方法,一个是findAll()查询全部,一个是findById(Integer id)根据id查询。返回值则全是 List<User>

package com.masiyi.dao;import com.masiyi.entity.User;import java.util.List;public interface UserDao {/*** 查询全部* @return*/List<User> findAll();/*** 根据id查询* @param id* @return*/List<User> findById(Integer id);}

用过mybatis框架的同学肯定知道每一个dao接口肯定是有一个xml文件去对应的。而xml文件里面就是写我们sql的地方,这里面我们取名叫做UserMapper.xml。其中我们可以自定义一个类似mybatis中的标签,叫什么都无所谓,但是方别大家与mybatis相比较,我们还是使用mybatis的命名方式取名叫mapper namespace="com.masiyi.dao.UserDao"这里就是对应着UserDao接口的类全路径。

<mapper namespace="com.masiyi.dao.UserDao"><select id="findAll" resultType="com.masiyi.entity.User">select * from user</select><select id="findById" resultType="com.masiyi.entity.User" parameterType="java.lang.Integer">select * from user where id = #{id}</select></mapper>

这里面的 <select>标签也是可以自定义比如叫myselect都行,最后我们在自定义框架中解析就行了,里面也和mybatis一样使用一个id属性来对应着里面的方法,最后写一个resultType返回值和parameterType传进来的参数值。

在对应的select标签中我们写上我们的sql,就像上面我们的代码里面的sql一样就行了。

除了写sql的xml文件,我们还需要一个写我们数据库信息的配置文件。这里我们就叫他myMybatisConfig.xml

<configuration><!--1.配置数据库信息--><dataSource><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/test_ob"></property><property name="username" value="rootmsy"></property><property name="password" value="root"></property></dataSource><!--2.引入映射配置文件--><mappers><mapper resource="mapper/UserMapper.xml"></mapper><mapper resource="mapper/UserMapperCopy.xml"></mapper></mappers></configuration>

配置数据库信息,里面我们主要写的也是和mybatis一模一样的:驱动类,url地址,用户名,密码.注意这里的名字和里面的标签也可以随便写,我们也使用name和value值做一个区分。到时候我们自己再写框架的时候,取对应的数据就行了,这里只是做一个示范,我们暂时就叫我们上面的名字。

引入映射配置文件,这里我们把我们上面装sql的xml文件给拿过来,假如我们的框架有很多的mapper文件,我都将他们引入进来,注意这里都是写在resource目录下面。就像我们现在的项目架构一样:

在这里插入图片描述

最后我们可以编写一个测试文件,来测试我们的自己写的框架。

package com.masiyi;import com.masiyi.dao.UserDao;
import com.masiyi.entity.Configuration;
import com.masiyi.entity.User;
import com.masiyi.executor.SimpleSqlSession;
import com.masiyi.io.Resources;
import com.masiyi.parse.ConfigParse;
import com.masiyi.util.MyMybatisUtil;import java.io.InputStream;
import java.util.List;/*** @Author masiyi* @Date 2023/11/10* @PackageName:com.masiyi* @ClassName: MybatisTest* @Description: TODO* @Version 1.0*/
public class MybatisTest {public static void main(String[] args) {InputStream resourceAsSteam = Resources.getResourceAsStream("myMybatisConfig.xml");Configuration configuration = new ConfigParse().parse(resourceAsSteam);SimpleSqlSession simpleSqlSession = new SimpleSqlSession(configuration);UserDao userDao = simpleSqlSession.newProxyClass(UserDao.class);userDao.findAll().forEach(System.out::println);// 释放资源simpleSqlSession.close();}}

这里是使用MyMybatis框架进行数据库操作,给大家做一个解释。

首先,通过Resources.getResourceAsStream(“myMybatisConfig.xml”)方法获取了一个名为myMybatisConfig.xml的配置文件的输入流。这个配置文件包含了MyMybatis框架的相关配置信息,比如数据库连接信息、映射文件等。

  InputStream resourceAsSteam = Resources.getResourceAsStream("myMybatisConfig.xml");

接下来,通过ConfigParse().parse(resourceAsSteam)方法将配置文件的输入流解析成一个Configuration对象。Configuration对象包含了框架的配置信息,比如数据库连接信息、映射文件等。

  Configuration configuration = new ConfigParse().parse(resourceAsSteam);

然后,创建了一个SimpleSqlSession对象,将上一步解析得到的Configuration对象传入。SimpleSqlSession是MyMybatis框架中的核心类,它负责管理数据库连接和执行SQL语句。

  SimpleSqlSession simpleSqlSession = new SimpleSqlSession(configuration);

接着,通过simpleSqlSession.newProxyClass(UserDao.class)方法创建了一个UserDao接口的代理类。代理类是MyMybatis框架根据接口定义和映射文件自动生成的,它封装了数据库操作的具体实现。

 UserDao userDao = simpleSqlSession.newProxyClass(UserDao.class);

最后,通过调用userDao.findAll()方法执行数据库查询操作,并使用forEach(System.out::println)打印查询结果。

 userDao.findAll().forEach(System.out::println);

最后,调用simpleSqlSession.close()方法释放资源,关闭数据库连接。

  simpleSqlSession.close();

编写几个重要的文件完成之后,我们项目的情况结构大体就是这样:

在这里插入图片描述

今天这篇文章我们就先写到这里。下一篇文章我们开始根据测试类里面的方法去构建我们的自定义框架MyMybatis,最后给大家看一下我们这个框架实现的效果:

在这里插入图片描述

findById() 方法

在这里插入图片描述

数据库里面的数据:

在这里插入图片描述

可以看到和我们上一篇文章里面达到的效果是一样的。如果说大家对这篇文章有兴趣的话,大家可以先点一波关注,最后我们在下一篇文章与大家再见。

在这里插入图片描述

另外如果对Elastic Search感兴趣的话,推荐一下我的专栏,这篇专栏介绍了Elasticsearch的Restful API的入门指南。学习如何使用API进行索引、搜索和分析,包括创建索引、定义映射、添加文档、执行查询等。通过实例和代码片段,快速上手Elasticsearch的Restful API,构建强大的搜索功能。感谢大家支持:

Elastic Search的RestFul API入门

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署清华ChatGLM-6B(Linux版)

引言 前段时间,清华公布了中英双语对话模型 ChatGLM-6B,具有60亿的参数,初具问答和对话功能。最!最!最重要的是它能够支持私有化部署,大部分实验室的服务器基本上都能跑起来。因为条件特殊,实验室网络不通,那么如何进行离线部署呢? 「部署环境」:CUDA Version 11.0,…

Maven简介及环境搭建和基本使用(Java开发中的实用工具)

一、概述 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它 用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、 测试、打包和发布等工作。 Maven的相关概念 pom.xml文件&#xff1a;里面可以配置相关信息&#xff0c;指导ma…

【SpringBoot开发】之商城项目案例(沙箱支付)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

MySQL数据库索引优化实战

目录 一、前言 二、准备工作 2.1 用户表&#xff08;TB_USER) 2.2 商品表&#xff08;TB_SKU) 2.3 订单表&#xff08;TB_ORDER&#xff09; 三、实例分析 3.1 索引提升查询性能 3.2 多表查询 3.3 索引失效 四、总结 一、前言 在数据库的应用中&#xff0c;性能优化…

类加载机制之双亲委派模型、作用、源码、SPI打破双亲委派模型

双亲委派模型 双亲委派工作机制双亲委派的作用双亲委派的实现源码SPI打破双亲委派 应用程序是由三种类加载器相互配合&#xff0c;从而实现类加载&#xff0c;除此之外还可以加入自己定义的类的加载器。 类加载器之间的层次关系&#xff0c;称为双亲委派模型&#xff08;Parent…

2024最全面且有知识深度的web3开发工具、web3学习项目资源平台

在Web3技术迅速发展的时代&#xff0c;寻找一个综合且深入的Web3开发工具和学习项目资源平台变得至关重要。今天&#xff0c;我将向大家介绍一个非常有价值的网站&#xff0c;它就是https://web3x.world 。 Web3X是一个全面而深入的Web3开发者社区&#xff0c;为开发者们提供了…

【深度学习】各领域常用的损失函数汇总(2024最新版)

目录 1、L1 损失、平均绝对误差&#xff08;L1 Loss、Mean Absolute Error&#xff0c;MAE&#xff09; 2、L2 损失、均方误差&#xff08;L2 Loss、Mean Squared Error&#xff0c;MSE&#xff09; 3、交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 4、混合损失&…

webpack的深入学习与实战(持续更新)

一、何为Webpack Webpack是 一个开源的JavaScript模块打包工具&#xff0c;其最核心的功能是解决模块之间的依赖&#xff0c;把各个模块按照特定的规则和顺序组织在一起&#xff0c;最终合并为一个JS文件或多个。 二、带宽的换算 目前我们的云服务器带宽为5M 三 、bundle 体…

【算法挨揍日记】day34——647. 回文子串、5. 最长回文子串

647. 回文子串 647. 回文子串 题目描述&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&am…

202365读书笔记|《温暖和百感交集的旅程》——时间帮助着一个人的一生在几千字的篇幅里栩栩如生

202365读书笔记|《温暖和百感交集的旅程》——时间帮助着一个人的一生在几千字的篇幅里栩栩如生 我能否相信自己温暖和百感交集的旅程前言和后记 《温暖和百感交集的旅程》作者余华&#xff0c;之前读完的一本书&#xff0c;已经不太记得内容了&#xff0c;看着笔记整理的这篇书…

【进程间通信】

什么是进程通信 进程通信&#xff08; InterProcess Communication&#xff0c;IPC&#xff09;就是指进程之间的信息的传播和交换。 进程是分配系统资源的单位&#xff0c;包括内存地址空间&#xff0c;为了保证安全&#xff0c;一个进程不能直接访问另一个进程的地址空间&a…

CMake入门教程【核心篇】属性管理set_property和get_property

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1.概述2.设置属性 - …

FPGA设计时序约束十五、Set_Bus_Skew

目录 一、序言 二、Set Bus Skew 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 报告分析 三、工程示例 3.1 工程代码 3.2 时序报告 四、参考资料 一、序言 在时序约束中&#xff0c;对时钟的约束除了set clock latency,set clock uncertainty,set input jitter外&…

51、全连接 - 特征的全局融合

Resnet50 中的核心算法,除了卷积、池化、bn、relu之外,在最后一层还有一个全连接。 下图是 Resnet50 网络结构结尾的部分,最后一层 Gemm(通用矩阵乘法)实现的就是全连接操作。而矩阵乘法我们之前介绍过,传送门在:矩阵乘。 卷积也好,矩阵乘法也好,其目的都是为了完成神…

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…

2024.1.2 Redis 数据类型 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields 简介

目录 引言 Stream 类型 Geospatial 类型 HyperLogLog 类型 Bitmaps 类型 Bitfields 类型 引言 Redis 最关键&#xff08;应用广泛、频繁使用&#xff09;的五个数据类型 StringListHashSetZSet 下文介绍的数据类型一般适合在特定的场景中使用&#xff01; Stream 类型 St…

Redis命令---Hash(哈希)篇 (超全)

目录 1.Redis Hmset 命令 - 同时将多个 field-value (域-值)对设置到哈希表 key 中。简介语法可用版本: > 2.0.0返回值: 如果命令执行成功&#xff0c;返回 OK 。 示例 2.Redis Hmget 命令 - 获取所有给定字段的值简介语法可用版本: > 2.0.0返回值: 一个包含多个给定字段…

LangChain与昇腾

LangChain这个词今年已经听烂了&#xff0c;今天基于昇腾的角度总结一下&#xff1a; Why LangChain &#xff1f; 场景&#xff1a;构建一个LLM应用 在构建一个新项目时&#xff0c;可能会遇到许多API接口、数据格式和工具。要去研究每一个工具、接口很麻烦。 假设要构建一…

k8s二进制部署2

部署 Worker Node 组件 //在所有 node 节点上操作 #创建kubernetes工作目录 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} #上传 node.zip 到 /opt 目录中&#xff0c;解压 node.zip 压缩包&#xff0c;获得kubelet.sh、proxy.sh cd /opt/ unzip node.zip chmod x kubelet.…

3分钟了解syscall系统调用|详细易懂的流程

文章目录 syscall1.简介2.详细解释3.具体举例4.比喻解释5.作用6.优点7.总结 syscall和int 0x80有什么不同&#xff1f;1. 上下文切换效率2. 指令执行流程3. 兼容性总结 syscall 具体流程1. 用户空间准备2. 执行syscall指令3. 切换到内核态4. 内核模式下执行系统调用5. 返回用户…