MyBatis快速入门(下)

news2024/12/13 2:38:23

MyBatis快速入门(下)

  • 六、MyBatis-缓存机制
    • 1、一级缓存(Local Cache)
    • 2、二级缓存(Global Cache)
      • 二级缓存标签属性介绍
      • 缓存相关设置
    • 3、第三方缓存
      • Mybatis整合ehcache示例
  • 七、MyBatis-逆向工程
    • 1、targetRuntime 值简述
    • 2、简单示例(MyBatis3Simple 版)
    • 3、示例(MyBatis3版)
  • 八、MyBatis-分页插件
    • 1、使用方法


官方文档


六、MyBatis-缓存机制

1、一级缓存(Local Cache)

一级缓存SqlSession级别的缓存,默认开启,生命周期与 SqlSession 的生命周期相同。一级缓存会缓存 SQL 查询的结果,在同一个 SqlSession 内多次执行相同的查询时,MyBatis 会直接从一级缓存中读取数据,而不是重新执行 SQL 查询。

一级缓存失效情况:

  • SqlSession不同
  • SqlSession相同,查询条件不同
  • SqlSession相同,两次查询之间执行了增、删、改操作
  • SqlSession相同,在调用 clearCache() 方法或 SqlSession 关闭,一级缓存会被清除
SqlSession session = sqlSessionFactory.openSession();
User user1 = session.selectOne("com.example.UserMapper.selectUser", 1); // 查询缓存
User user2 = session.selectOne("com.example.UserMapper.selectUser", 1); // 缓存命中

  • 示例
    /**
     * 测试一级缓存: 根据 员工id查询员工信息
     */
    @Test
    public void testLocalCache() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        CacheMapper cacheMapper = sqlSession.getMapper(CacheMapper.class);
        Emp emp1 = cacheMapper.getEmpById(6);
        System.out.println("emp1查询结果:" + emp1);
        Emp emp2 = cacheMapper.getEmpById(6);
        System.out.println("emp2查询结果:" + emp2);
        sqlSession.clearCache();
        Emp emp3 = cacheMapper.getEmpById(6);
        System.out.println("emp3查询结果:" + emp3);
    }

在这里插入图片描述

2、二级缓存(Global Cache)

  • 二级缓存 的作用范围是一个 SqlSessionFactory,通过同一个 SqlSessionFactory 创建的所有 SqlSession 对象可以共享二级缓存
  • 二级缓存的实现需要在配置文件中启用,并且每个 Mapper 都需要配置缓存。
  • 二级缓存不会存储 SqlSession 的内部数据,只会缓存 SQL 查询的结果。
  • 默认情况下二级缓存是禁用
  • 二级缓存跨 SqlSession 有效,不同的 SqlSession 可以共享缓存内容。

二级缓存开启的条件:

  • mybatis-config.xml 中启用全局缓存,默认开启(true),无需配置
    在这里插入图片描述
  • mapper接口的xml映射文件 中加上<cache/>,设置使用二级缓存。
    在这里插入图片描述
  • 二级缓存必须在SqlSession关闭或提交之后,才会生效
  • POJO实体类必须实现序列化接口
    在这里插入图片描述
  • 示例
    /**
     * 测试二级缓存: 根据 员工id 查询员工信息
     */
    @Test
    public void testGlobalCache() {
        //因为二级缓存 的作用范围是一个 SqlSessionFactory,
        //通过同一个 SqlSessionFactory 创建的所有 SqlSession 对象可以共享二级缓存。
        //【因此此处测试二级缓存时不要使用 SqlSessionUtils工具类,
        //因为该工具类每次都会创建一个新的 sqlSessionFactory】
        SqlSession sqlSession1 = null;
        SqlSession sqlSession2 = null;
        try {
            //获取配置文件
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            //获取 sqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            //获取 sqlSession
            sqlSession1 = sqlSessionFactory.openSession(true);
            CacheMapper cacheMapper1 = sqlSession1.getMapper(CacheMapper.class);
            Emp emp1 = cacheMapper1.getEmpById(6);
            System.out.println("emp1查询结果:" + emp1);
            sqlSession1.close();
            sqlSession2 = sqlSessionFactory.openSession(true);
            CacheMapper cacheMapper2 = sqlSession2.getMapper(CacheMapper.class);
            Emp emp2 = cacheMapper2.getEmpById(6);
            System.out.println("emp2查询结果:" + emp2);
            sqlSession2.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

二级缓存失效情况:

  • 两次查询之间执行了增、删、改操作

二级缓存标签属性介绍

在这里插入图片描述
在这里插入图片描述

<cache type="LRU"/>

在这里插入图片描述

<cache eviction="FIFO"/>

在这里插入图片描述

<cache flushInterval="60000"/> <!-- 每隔 60 秒刷新缓存 -->

在这里插入图片描述

<cache size="100"/> <!-- 最大缓存容量为 100 个对象 -->

在这里插入图片描述

<cache readOnly="true"/>

在这里插入图片描述

<cache blocking="true"/>
  • 综合示例
<cache
    type="LRU"
    eviction="FIFO"
    flushInterval="30000"
    size="200"
    readOnly="false"
    blocking="true"
/>
  • 含义:
  • 使用 LRU 缓存策略。
  • 按先进先出(FIFO)规则移除超出的缓存项。
  • 30 秒刷新缓存。
  • 最大缓存容量为 200 个对象。
  • 缓存为读写模式。
  • 启用阻塞缓存,防止并发加载相同数据。

缓存相关设置

cacheEnabled

  • 配置二级缓存的开关(默认true:开启)
    <setting name="cacheEnabled" value="true"/>

select标签的useCache属性

  • 指定某个select查询是否使用二级缓存
  • useCache="false":查询结果不会存入二级缓存,但会存入一级缓存
  • 默认值(useCache="true"),查询结果存入一级缓存二级缓存(如果启用了二级服务器)。

select标签的flushCache属性

  • flushCache="true":执行查询时,会清空一级缓存二级缓存(如果启用了二级服务器),确保从数据库获取最新数据。
  • 默认值(flushCache="false"):缓存数据不会被清空,查询时可能返回缓存数据。
  • 增删改默认true,查询默认false

sqlSession.clearCache()示例

  • 只是用来清除一级缓存

某一作用域内(一级缓存二级缓存)执行了增、删、改操作后,该作用域下所有select中的缓存都会被clear


3、第三方缓存

使用第三方缓存(如 Redis、EhCache、Caffeine),可以提供更高的性能、灵活的失效策略和分布式支持,解决MyBatis默认缓存在高并发和扩展性上的不足。同时,第三方缓存还支持持久化、丰富的监控工具和多样化的配置,适合复杂生产环境。

Ehcache 是一种广泛使用的 java 分布式缓存,用于通用缓存, Java EE 和轻量级容器。MyBatis Ehcache 适配器 - 参考文档

Ehcache 集成建立在 Ehcache 之上,没有任何 Ehcache 第三方应用程序。 如果您需要插件,请参考 Ehcache 官方文档 。

要在应用程序中使用 Ehcache,请下载 zip 包 ,解压缩它并将 jar 添加到 Classpath 中。
如果您使用的是 Maven,则只需将以下依赖项添加到您的依赖项中pom.xml

Mybatis整合ehcache示例

步骤 1: pom.xml 中引入第三方缓存依赖

<!--mybatis-ehcache 整合依赖包-->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>
<!--slf4j日志门面的一个具体实现
存在 SLF4 时,作为建议日志的 log4j 将会失效,此时我们需要借助 SLF4
的具体实现 logback 来打印日志
-->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

步骤 2: 创建 EhcacheCache 的配置文件ehcache.xml

<?xml version="1.0" encoding="UTF-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <!--磁盘保存路径-->
    <diskStore path="D:\workspace\ehcache"/>
    <!--
    maxEntriesLocalHeap="1"
        这个属性指定了缓存中在内存堆中的最大条目数。
        这里设为 1,表示缓存的条目数非常少,可能是用来存储少量的热数据。
        一般来说,如果数据量很大,这个值会设置得更高。
        
    maxEntriesLocalDisk="10000000"
        这个属性指定了缓存中在磁盘上的最大条目数。
        设置为 10000000 表示缓存的条目数可以非常大,当内存不足时,缓存数据会转移到磁盘。

    eternal="false"
        如果设置为 true,则缓存条目会永不过期。此处设置为 false,意味着缓存条目会有有效期。

    overflowToDisk="true"
        当缓存的内存空间不足时,启用此选项,数据会溢出到磁盘中,以避免缓存溢出错误。

    timeToIdleSeconds="120"
        该属性定义了缓存项在空闲状态下的存活时间。空闲指的是自上次访问以来没有进行任何操作的时间。
        如果超过 120 秒没有访问该缓存项,它会被移除。
    
    timeToLiveSeconds="120"
        该属性定义了缓存项的最大生存时间。即使缓存项在这段时间内被频繁访问,它也会在 120 秒后过期并被移除。
    
    diskExpiryThreadIntervalSeconds="120"
        这是一个后台线程定时清理过期缓存数据的时间间隔。设置为 120 秒,意味着每隔 120 秒后台线程会检查一次过期数据。
    
    memoryStoreEvictionPolicy="LRU"
        该属性指定了内存中缓存项被驱逐时的策略。LRU(Least Recently Used)表示最久未使用的条目会被优先移除。
    -->
    <defaultCache
            maxEntriesLocalHeap="1"
            maxEntriesLocalDisk="10000000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>


步骤 3: 设置二级缓存类型,指定使用第三方缓存
在这里插入图片描述


<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

步骤 4: 加入logback日志logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 定义日志输出的位置 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出的格式
                 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主题内容、换行-->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
        </encoder>
    </appender>

    <!--设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR-->
    <!--指定任何一个日志级别都只打印当前级别和后面级别的日志-->
    <root level="DEBUG">
        <!--指定打印日志的appender,这里通过"STDOUT"引用了前面配置的appender-->
        <appender-ref ref="STDOUT"/>
    </root>
    <!--根据特殊需求指定局部日志级别-->
    <logger name="com.ningxia.crowd.mapper" level="DEBUG"/>

</configuration>

测试

/**
 * 测试二级缓存: 根据 员工id 查询员工信息
 */
@Test
public void testGlobalCache() {
    //因为二级缓存 的作用范围是一个 SqlSessionFactory,
    //通过同一个 SqlSessionFactory 创建的所有 SqlSession 对象可以共享二级缓存。
    //【因此此处测试二级缓存时不要使用 SqlSessionUtils工具类,
    //因为该工具类每次都会创建一个新的 sqlSessionFactory】
    SqlSession sqlSession1 = null;
    SqlSession sqlSession2 = null;
    try {
        //获取配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //获取 sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获取 sqlSession
        sqlSession1 = sqlSessionFactory.openSession(true);
        CacheMapper cacheMapper1 = sqlSession1.getMapper(CacheMapper.class);
        Emp emp1 = cacheMapper1.getEmpById(6);
        System.out.println("emp1查询结果:" + emp1);
        sqlSession1.close();
        sqlSession2 = sqlSessionFactory.openSession(true);
        CacheMapper cacheMapper2 = sqlSession2.getMapper(CacheMapper.class);
        Emp emp2 = cacheMapper2.getEmpById(6);
        System.out.println("emp2查询结果:" + emp2);
        sqlSession2.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

在这里插入图片描述

七、MyBatis-逆向工程

MyBatis的逆向工程(Reverse Engineering)是指从数据库表结构自动生成相应的Java类、XML映射文件以及数据库操作代码(例如Mapper接口和SQL映射)。这大大简化了开发流程,尤其是在数据库设计已经完成的情况下。

官方文档地址
官方工程地址

1、targetRuntime 值简述

MyBatis Generator(MBG)中,targetRuntime用于指定生成的代码的风格和适配的MyBatis版本。不同的targetRuntime值会生成不同风格的代码,以适应不同的使用场景和版本需求。

    targetRuntime的常见值:
    
        MyBatis3
            生成兼容 MyBatis 3.x 的代码。
            这是最常用的目标,支持 MyBatis 的基础功能,生成 Example 类、SQL 语句和常规的 Mapper 接口。
            适用于大多数 MyBatis 3.x 项目。
            使用场景:当使用 MyBatis 3.x 时,这是最常见的选择。


        MyBatis3Simple
            生成更加简化的代码,省略了 Example 类和其他复杂功能。
            适用于需要最基本的 CRUD 操作,不需要额外的 Example 或 Criteria 等功能的场景。
            使用场景:当项目不需要复杂查询或额外的功能时,可以选择该选项,以减少生成的代码量。


        Ibatis2
            生成适配 MyBatis 2.x 版本的代码。
            在 MyBatis 2.x 中,很多功能与 MyBatis 3.x 有差异,因此该选项主要是为了兼容旧版本的 MyBatis 项目。
            使用场景:如果你正在维护一个使用 MyBatis 2.x 的旧项目,可以选择这个目标来生成代码。


        MyBatis3DynamicSQL
            生成使用 MyBatis3 风格的动态 SQL 的代码。
            该选项支持通过 MyBatis 提供的动态 SQL 功能(如 Example 类、Criteria 和动态 SQL 构建器)生成更加灵活和复杂的 SQL 查询。
            使用场景:如果你需要动态生成复杂的 SQL 语句,并使用 MyBatis 3.x 的动态 SQL 构建功能,选择该选项。

2、简单示例(MyBatis3Simple 版)

pom.xml 中添加依赖和插件

<?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>

    <groupId>com.ningxia.mybatis</groupId>
    <artifactId>mybatis_MBG</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--mybatis核心文件-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!-- MyBatis Generator 逆向工程的核心依赖 -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--MySQL连接池-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.4</version>
        </dependency>
        <!--MySQL驱动链接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
    </dependencies>
    <!--maven 在构建过程中的相关配置-->
    <build>
        <plugins>
            <!--具体插件,逆向工程的操作是以构建过程中插件形式出现的-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.0</version>
            </plugin>
        </plugins>
    </build>
</project>

创建逆向工程的配置文件 generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!--
        targetRuntime的常见值:
            MyBatis3
                生成兼容 MyBatis 3.x 的代码。
                这是最常用的目标,支持 MyBatis 的基础功能,生成 Example 类、SQL 语句和常规的 Mapper 接口。
                适用于大多数 MyBatis 3.x 项目。
                使用场景:当使用 MyBatis 3.x 时,这是最常见的选择。

            MyBatis3Simple
                生成更加简化的代码,省略了 Example 类和其他复杂功能。
                适用于需要最基本的 CRUD 操作,不需要额外的 Example 或 Criteria 等功能的场景。
                使用场景:当项目不需要复杂查询或额外的功能时,可以选择该选项,以减少生成的代码量。

            Ibatis2
                生成适配 MyBatis 2.x 版本的代码。
                在 MyBatis 2.x 中,很多功能与 MyBatis 3.x 有差异,因此该选项主要是为了兼容旧版本的 MyBatis 项目。
                使用场景:如果你正在维护一个使用 MyBatis 2.x 的旧项目,可以选择这个目标来生成代码。

            MyBatis3DynamicSQL
                生成使用 MyBatis3 风格的动态 SQL 的代码。
                该选项支持通过 MyBatis 提供的动态 SQL 功能(如 Example 类、Criteria 和动态 SQL 构建器)生成更加灵活和复杂的 SQL 查询。
                使用场景:如果你需要动态生成复杂的 SQL 语句,并使用 MyBatis 3.x 的动态 SQL 构建功能,选择该选项。

    -->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">

        <!-- 数据库连接配置 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password="886688">
        </jdbcConnection>

        <!-- JavaModel生成配置 -->
        <javaModelGenerator targetPackage="com.ningxia.mybatis.model" targetProject=".\src\main\java">
            <!--使用子包,表示上面"com.ningxia.mybatis.model"每个.前后一层目录-->
            <property name="enableSubPackages" value="true"/>
            <!--去掉字符串前后空格-->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- SQL映射文件生成配置 -->
        <sqlMapGenerator targetPackage="com.ningxia.mybatis.mapper" targetProject=".\src\main\resources">
            <!--使用子包,表示上面"com.ningxia.mybatis.mapper"每个.前后一层目录-->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>


        <!-- Java客户端接口(mapper接口)生成配置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.ningxia.mybatis.mapper"
                             targetProject=".\src\main\java">
            <!--使用子包,表示上面"com.ningxia.mybatis.mapper"每个.前后一层目录-->
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1024aee8fd0143d7a8cd1520ebae4062.png)

        <!-- 指定生成的表
         tableName 值为 * 表示对应所有表,此时就不用写 domainObjectName;
         domainObjectName:指定生成出来的实体类的名称
         -->
        <table tableName="t_emp" domainObjectName="Emp"/>
        <table tableName="t_dept" domainObjectName="Dept"/>
    </context>
</generatorConfiguration>


双击构建逆向工程

在这里插入图片描述

在这里插入图片描述

3、示例(MyBatis3版)

pom.xml 中添加依赖和插件

<?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>

    <groupId>com.ningxia.mybatis</groupId>
    <artifactId>mybatis_MBG</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--mybatis核心文件-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--Log4j2日志 以下是Log4j2 完整的日志记录实现所必需的-->
        <!--log4j-core 是实际处理日志输出的核心实现-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.17.1</version>
        </dependency>
        <!--log4j-api 只是定义了日志记录的接口-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.17.1</version>
        </dependency>
        <!--junit测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
        <!-- MyBatis Generator 逆向工程的核心依赖 -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--MySQL驱动链接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
        <!--MySQL连接池-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.4</version>
        </dependency>
    </dependencies>
    <!--maven 在构建过程中的相关配置-->
    <build>
        <plugins>
            <!--具体插件,逆向工程的操作是以构建过程中插件形式出现的-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.0</version>
            </plugin>
        </plugins>
    </build>
</project>

创建逆向工程的配置文件 generatorConfig.xml,双击构建逆向工程

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!--
        targetRuntime的常见值:
            MyBatis3
                生成兼容 MyBatis 3.x 的代码。
                这是最常用的目标,支持 MyBatis 的基础功能,生成 Example 类、SQL 语句和常规的 Mapper 接口。
                适用于大多数 MyBatis 3.x 项目。
                使用场景:当使用 MyBatis 3.x 时,这是最常见的选择。

            MyBatis3Simple
                生成更加简化的代码,省略了 Example 类和其他复杂功能。
                适用于需要最基本的 CRUD 操作,不需要额外的 Example 或 Criteria 等功能的场景。
                使用场景:当项目不需要复杂查询或额外的功能时,可以选择该选项,以减少生成的代码量。

            Ibatis2
                生成适配 MyBatis 2.x 版本的代码。
                在 MyBatis 2.x 中,很多功能与 MyBatis 3.x 有差异,因此该选项主要是为了兼容旧版本的 MyBatis 项目。
                使用场景:如果你正在维护一个使用 MyBatis 2.x 的旧项目,可以选择这个目标来生成代码。

            MyBatis3DynamicSQL
                生成使用 MyBatis3 风格的动态 SQL 的代码。
                该选项支持通过 MyBatis 提供的动态 SQL 功能(如 Example 类、Criteria 和动态 SQL 构建器)生成更加灵活和复杂的 SQL 查询。
                使用场景:如果你需要动态生成复杂的 SQL 语句,并使用 MyBatis 3.x 的动态 SQL 构建功能,选择该选项。

    -->
    <context id="DB2Tables" targetRuntime="MyBatis3">

        <!-- 数据库连接配置 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!-- JavaModel生成配置 -->
        <javaModelGenerator targetPackage="com.ningxia.mybatis.model" targetProject=".\src\main\java">
            <!--使用子包,表示上面"com.ningxia.mybatis.model"每个.前后一层目录-->
            <property name="enableSubPackages" value="true"/>
            <!--去掉字符串前后空格-->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- SQL映射文件生成配置 -->
        <sqlMapGenerator targetPackage="com.ningxia.mybatis.mapper" targetProject=".\src\main\resources">
            <!--使用子包,表示上面"com.ningxia.mybatis.mapper"每个.前后一层目录-->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>


        <!-- Java客户端接口(mapper接口)生成配置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.ningxia.mybatis.mapper"
                             targetProject=".\src\main\java">
            <!--使用子包,表示上面"com.ningxia.mybatis.mapper"每个.前后一层目录-->
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 指定生成的表
         tableName 值为 * 表示对应所有表,此时就不用写 domainObjectName;
         domainObjectName:指定生成出来的实体类的名称
         -->
        <table tableName="t_emp" domainObjectName="Emp"/>
        <table tableName="t_dept" domainObjectName="Dept"/>
    </context>
</generatorConfiguration>

测试方法

package com.ningxia.mybatis;

import com.ningxia.mybatis.mapper.EmpMapper;
import com.ningxia.mybatis.model.Emp;
import com.ningxia.mybatis.model.EmpExample;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MBGTest {


    /**
     * (targetRuntime="MyBatis3"版)逆向工程测试
     */
    @Test
    public void testMBG() {
        SqlSession sqlSession = null;
        try {
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
            sqlSession = build.openSession(true);
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            //1.查询所有数据
//            List<Emp> emps = mapper.selectByExample(null);
//            emps.forEach(System.out::println);
            //2.条件查询 :
            //          (1)查询员工名字中带 'n'并且性别为'男'的所有员工信息
//            EmpExample example = new EmpExample();
//            example.createCriteria().andEmpNameLike("%n%").andSexEqualTo("男");
//            List<Emp> empList = mapper.selectByExample(example);
//            empList.forEach(System.out::println);
            //          (2)查询部门id=1并且员工名字中带 'n'或 'j'的所有员工信息
            EmpExample example = new EmpExample();
            example.createCriteria().andDidEqualTo(1).andEmpNameLike("%n%");
            example.or().andSexEqualTo("男");
            List<Emp> empList = mapper.selectByExample(example);
            empList.forEach(System.out::println);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、MyBatis-分页插件

1、使用方法

pom.xml 中添加依赖

 <!--mybatis 分页插件-->
 <dependency>
     <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper</artifactId>
     <version>5.3.1</version>
 </dependency>

在核心配置文件mybatis-config.xml中配置分页插件(注意位置顺序)

<!--分页插件-->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageHelper"/>
</plugins>

测试方法

在查询之前开启分页功能PageHelper.startPage(int pageNum, int pageSize);

package com.ningxia.mybatis;

import com.github.pagehelper.PageHelper;
import com.ningxia.mybatis.mapper.EmpMapper;
import com.ningxia.mybatis.model.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class PageHelperTest {


    /**
     * mybatis分页测试
     * <p>
     * limit
     * index:当前页的起始索引   index = (pageNum-1)*pageSize
     * pageSize:每页条目数
     * pageNum:当前页码
     * <p>
     * 步骤:
     * 使用mybatis分页插件实现分页功能
     * 在查询之前开启分页功能:PageHelper.startPage(int pageNum, int pageSize);
     */
    @Test
    public void testPageHelper() {
        SqlSession sqlSession = null;
        try {
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
            sqlSession = build.openSession(true);
            EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
            //1.查询所有数据
            //开启分页功能:PageHelper.startPage(int pageNum, int pageSize);
            PageHelper.startPage(1, 2);
            List<Emp> emps = mapper.selectByExample(null);
            emps.forEach(System.out::println);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

在这里插入图片描述

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

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

相关文章

华为TaurusDB与GaussDB:信创改造的“降本提效”之路

近年来&#xff0c;信创&#xff08;信息技术应用创新&#xff09;已成为中国国央企数字化转型的关键词。伴随这一浪潮&#xff0c;众多企业面临一个迫切问题&#xff1a;如何在兼顾性能与成本的前提下&#xff0c;完成核心系统的迁移改造&#xff1f;华为TaurusDB和GaussDB的加…

【Linux】文本处理三剑客:grep、sed 和 awk

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【前端】理解 JavaScript 对象属性访问的复杂性

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;理论基础&#xff1a;JavaScript 对象属性的访问模式1. 点符号访问&#xff08;Dot Notation&#xff09;2. 方括号访问&#xff08;Bracket Notation&#xff09;点符号…

【工具变量】上市公司企业研发不确定性数据(2013-2023年)

一、测算方式&#xff1a;参考顶刊《中国工业经济》孙薇&#xff08;2023&#xff09;老师的做法&#xff0c;本文从专利的申请与授权的视角出发&#xff0c;以企业当年申请的发明专利中最终未被授权的比例度量研发不确定性 &#xff08;uc&#xff09;。这是因为&#xff0c;相…

easyExcel单一下拉框和级联下拉框

文章目录&#xff1a; 单一下拉框级联下拉框 具体实现&#xff1a; 单一下拉框 public class BoolWriteHandler implements SheetWriteHandler {private List<String> dropDown;private List<Integer> indexList;public BoolWriteHandler(List<Integer> i…

【C++】指针与智慧的邂逅:C++内存管理的诗意

文章目录 RAII 智能指针auto_ptrunique_ptr shared_ptr模拟实现定制删除器循环引用 和 weak_ptr RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种广泛应用于 C 等编程语言中的编程范式&#xff0c;它的核心思想是&#xff1a;资源的获取和释放…

【优选算法 位运算】位运算算法入门详解:常见位运算总结

判定字符是否唯一 题目解析 算法原理 解法一 &#xff1a;哈希数组 从前往后扫描字符串&#xff0c;把扫描到的字符先进行判断&#xff0c;如果对应的 val 0 &#xff0c;则放入哈希表中&#xff0c;否则返回 false&#xff0c;知道扫描完整个字符&#xff1b;时间…

深入理解Linux进程管理机制

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言 进程是现代操作系统中一个不可或缺的概念&#xff0c;其主要目的在于管理资源、实现并发、提高系统效率&#xff0c;并确保系统的稳定性和安全性。 进程的定义 进程&#xff08;Process&#xff09; 是计算机操作系统中…

R 语言科研绘图第 4 期 --- 折线图-置信区间

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…

使用 LabVIEW 与 PLC 通信的方式

要将 PLC 与 LabVIEW 或其他 NI 产品进行通信&#xff0c;首先需要明确 PLC 支持的通信协议和接口类型。NI 提供了多种方案&#xff0c;包括 OPC 服务器、Modbus、Ethernet/IP 和其他工业通信协议。下面将详细介绍这些方法&#xff0c;并进行比较分析&#xff0c;帮助你选择最适…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …

专题二十五_动态规划_两个数组的 dp (含字符串数组)_算法专题详细总结

目录 动态规划_两个数组的 dp &#xff08;含字符串数组&#xff09; 1. 最⻓公共⼦序列&#xff08;medium&#xff09; 解析&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a;​编辑 4. 填表顺序&#xff1a;​编辑 5. 返回值…

12,攻防世界simple_php

simple_php 题目来源:Cyberpeace-n3k0 题目描述: 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 进入靶场 这段PHP代码是一个简单的web应用示例&#xff0c;让我们逐步分析这段代码&#xff1a; show_source(__FILE__);&#xff1a;这行代码会显示当前文件的…

NIO - selector简单介绍

一 前言 selector作为NIO当中三大组件之一&#xff0c;是处理NIO非阻塞模式下的核心组件&#xff0c;它允许一个单个线程管理多个通道。 NIO下的阻塞模式 因为对于阻塞模式下的NIO模式&#xff0c;存在很大的问题&#xff0c;即使在单线程下&#xff0c;对应的服务端也会一直进…

二、部署docker

二、安装与部署 2.1 安装环境概述 Docker划分为CE和EE&#xff0c;CE为社区版&#xff08;免费&#xff0c;支持周期三个月&#xff09;&#xff0c;EE为企业版&#xff08;强调安全&#xff0c;付费使用&#xff09;。 Docker CE每月发布一个Edge版本&#xff08;17.03&…

Camp4-L2:LMDeploy 量化部署进阶实践

书生浦语大模型实战营第四期&#xff1a;LMDeploy 量化部署进阶实践 教程链接&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/LMDeploy视频链接&#xff1a;https://www.bilibili.com/video/BV18aUHY3EEG/?vd_sourceb96c7e6e6d1a48e73edafa36a36f1697…

Qt之第三方库QCustomPlot使用(二)

Qt开发 系列文章 - qcustomplot&#xff08;二&#xff09; 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类‌ 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…

python数据分析之爬虫基础:selenium详细讲解

目录 1、selenium介绍 2、selenium的作用&#xff1a; 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 &#xff08;1…

LearnOpenGL学习(模型加载 -- Assimp,网格,模型)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 Assimp 3D建模工具如Blender、3DS Max在导出模型文件时&#xff0c;会自动生成所有的顶点坐标、顶点法线和纹理坐标。 .obj 格式只包含了模型数据和材质信息&#xff08;颜色、贴图等&#xff09; Assi…