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

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

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

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

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

java 复制代码
<?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表。这里我们使用驼峰命名法。

java 复制代码
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>

java 复制代码
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接口的类全路径。

java 复制代码
<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

java 复制代码
<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目录下面。就像我们现在的项目架构一样:

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

java 复制代码
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框架的相关配置信息,比如数据库连接信息、映射文件等。

java 复制代码
  InputStream resourceAsSteam = Resources.getResourceAsStream("myMybatisConfig.xml");

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

java 复制代码
  Configuration configuration = new ConfigParse().parse(resourceAsSteam);

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

java 复制代码
  SimpleSqlSession simpleSqlSession = new SimpleSqlSession(configuration);

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

java 复制代码
 UserDao userDao = simpleSqlSession.newProxyClass(UserDao.class);

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

java 复制代码
 userDao.findAll().forEach(System.out::println);

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

java 复制代码
  simpleSqlSession.close();

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

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

findById() 方法

数据库里面的数据:

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

相关推荐
好奇的菜鸟4 分钟前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
Alive~o.013 分钟前
Go语言进阶&依赖管理
开发语言·后端·golang
许苑向上19 分钟前
Dubbo集成SpringBoot实现远程服务调用
spring boot·后端·dubbo
郑祎亦1 小时前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
本当迷ya1 小时前
💖2025年不会Stream流被同事排挤了┭┮﹏┭┮(强烈建议实操)
后端·程序员
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
paopaokaka_luck3 小时前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
捂月4 小时前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
瓜牛_gn4 小时前
依赖注入注解
java·后端·spring
Estar.Lee4 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip