【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入门

在这里插入图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-08 20:38:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-08 20:38:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-08 20:38:01       82 阅读
  4. Python语言-面向对象

    2024-01-08 20:38:01       91 阅读

热门阅读

  1. 使用structured concurrency简化异步并发调用

    2024-01-08 20:38:01       72 阅读
  2. Wargames与bash知识10

    2024-01-08 20:38:01       54 阅读
  3. kotlin take 和 drop

    2024-01-08 20:38:01       67 阅读
  4. Copilot在Pycharm的应用和示例

    2024-01-08 20:38:01       54 阅读
  5. python常见解包方式

    2024-01-08 20:38:01       52 阅读
  6. 参数校验注解使用- validator

    2024-01-08 20:38:01       73 阅读
  7. 预训练模型的分类,以及代表模型介绍

    2024-01-08 20:38:01       57 阅读
  8. 如何使用 CMake 来构建一个包含子目录的 C++ 项目

    2024-01-08 20:38:01       58 阅读
  9. C++多态

    C++多态

    2024-01-08 20:38:01      47 阅读
  10. Docker 容器数据卷

    2024-01-08 20:38:01       63 阅读