1 测试代码

1.1 MyBatisUtil

package com.xu.util;

import cn.hutool.core.util.StrUtil;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.io.ResolverUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.yaml.snakeyaml.Yaml;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

/**
 * @author hyacinth
 */
public class MyBatisUtil {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            // 1. 加载 application.yml
            InputStream configStream = Resources.getResourceAsStream("application.yml");
            Map<String, Object> yaml = new Yaml().load(configStream);
            // 读取配置
            Map<String, Object> spring = (Map<String, Object>) yaml.get("spring");
            Map<String, Object> datasource = (Map<String, Object>) spring.get("datasource");
            // 数据库配置
            String url = (String) datasource.get("url");
            String username = (String) datasource.get("username");
            String password = (String) datasource.get("password");
            // 2. 配置数据源(使用Hikari与SpringBoot一致)
            HikariDataSource ds = new HikariDataSource();
            ds.setJdbcUrl(url);
            ds.setUsername(username);
            ds.setPassword(password);
            // 3. MyBatis环境
            Environment env = new Environment("dev", new JdbcTransactionFactory(), ds);
            Configuration configuration = new Configuration(env);
            // MyBatis配置
            Map<String, Object> mybatis = (Map<String, Object>) yaml.get("mybatis");
            if (mybatis != null && mybatis.containsKey("configuration")) {
                Map<String, Object> conf = (Map<String, Object>) mybatis.get("configuration");
                if ("org.apache.ibatis.logging.stdout.StdOutImpl".equals(conf.get("log-impl"))) {
                    configuration.setLogImpl(StdOutImpl.class);
                }
                if (conf.containsKey("arg-name-based-constructor-auto-mapping")) {
                    configuration.setArgNameBasedConstructorAutoMapping((Boolean) conf.get("arg-name-based-constructor-auto-mapping"));
                }
                if (conf.containsKey("cache-enabled")) {
                    configuration.setCacheEnabled((Boolean) conf.get("cache-enabled"));
                }
                if (conf.containsKey("lazy-loading-enabled")) {
                    configuration.setLazyLoadingEnabled((Boolean) conf.get("lazy-loading-enabled"));
                }
                if (conf.containsKey("call-setters-on-nulls")) {
                    configuration.setCallSettersOnNulls((Boolean) conf.get("call-setters-on-nulls"));
                }
                if (conf.containsKey("map-underscore-to-camel-case")) {
                    configuration.setMapUnderscoreToCamelCase((Boolean) conf.get("map-underscore-to-camel-case"));
                }
                if (conf.containsKey("default-statement-timeout")) {
                    configuration.setDefaultStatementTimeout((Integer) conf.get("default-statement-timeout"));
                }
            }
            // 自动扫描MyBatis的XML
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            URL mapper = loader.getResource("mapper");
            if (mapper != null) {
                String path = mapper.getPath();
                File folder = new File(path);
                for (java.io.File file : Objects.requireNonNull(folder.listFiles())) {
                    if (file.getName().endsWith(".xml")) {
                        String resource = "mapper/" + file.getName();
                        InputStream in = Resources.getResourceAsStream(resource);
                        XMLMapperBuilder builder = new XMLMapperBuilder(in, configuration, resource, configuration.getSqlFragments());
                        builder.parse();
                    }
                }
            }
            // 自动扫描MyBatis的XML Java接口
            if (mybatis == null || !mybatis.containsKey("type-aliases-package")) {
                throw new RuntimeException("配置文件缺少mybatis.type-aliases-package");
            }
            ResolverUtil<Class<?>> resolver = new ResolverUtil<>();
            String packages = (String) mybatis.get("type-aliases-package");
            if (StrUtil.contains(packages, "*")) {
                packages = packages.split("\\*")[0];
                packages = packages.endsWith(".") ? packages.substring(0, packages.length() - 1) : packages;
            }
            resolver.find(new ResolverUtil.IsA(Object.class), packages);
            Set<Class<? extends Class<?>>> classes = resolver.getClasses();
            for (Class<?> cla : classes) {
                if (cla.isInterface()) {
                    if (!configuration.getMapperRegistry().hasMapper(cla)) {
                        configuration.addMapper(cla);
                    }
                }
            }
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取SqlSession(不自动提交)
     *
     * @return SqlSession
     */
    public static SqlSession openSession() {
        return sqlSessionFactory.openSession();
    }

    /**
     * 获取SqlSession(自动提交)
     *
     * @return SqlSession
     */
    public static SqlSession openSessionAutoCommit() {
        return sqlSessionFactory.openSession(true);
    }

}

1.2 XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xu.oracle.mbom.mapper.UtilMapper">

    <update id="createTable" parameterType="String">
        CREATE TABLE ${dst} AS SELECT * FROM ${src} WHERE 1 != 1
    </update>

</mapper>

1.3 Mapper

package com.xu.oracle.mbom.mapper;

import com.xu.oracle.mbom.entity.Util;
import com.xu.wrapper.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

/**
 * 表通用工具类
 *
 * @author hyacinth
 * @since 2025年9月18日16点28分
 */
@Mapper
public interface UtilMapper extends BaseMapper<Util> {

    /**
     * 创建表
     *
     * @param des 新表
     * @param src 旧表
     * @return 结果
     */
    int createTable(String des, String src);

}

1.4 Test

package com.xu.test;

import com.xu.oracle.mbom.mapper.UtilMapper;
import com.xu.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;

/**
 * @author hyacinth
 */
public class Test {

    public static void main(String[] args) {
        try (SqlSession session = MyBatisUtil.openSession()) {
            UtilMapper mapper = session.getMapper(UtilMapper.class);
            mapper.createTable("1", "1");
        }
    }
}
com.xu.test.Test
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Class not found: org.jboss.vfs.VFS
JBoss 6 VFS API is not available in this environment.
Class not found: org.jboss.vfs.VirtualFile
VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
Using VFS adapter org.apache.ibatis.io.DefaultVFS
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu
Reader entry: conf
Reader entry: oracle
Reader entry: SpringOracleApplication.class
Reader entry: test
Reader entry: util
Reader entry: wrapper
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/conf
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/conf
Reader entry: RedisConfig.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/conf
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/conf/RedisConfig.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/conf/RedisConfig.class
Reader entry: ����   D ?
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle
Reader entry: db
Reader entry: mbom
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db
Reader entry: DBConstant.class
Reader entry: DBObject.class
Reader entry: DeleteObject.class
Reader entry: InsertObject.class
Reader entry: ParamObject.class
Reader entry: SelectObject.class
Reader entry: UpdateObject.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/DBConstant.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/DBConstant.class
Reader entry: ����   D [
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/DBObject.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/DBObject.class
Reader entry: ����   D )
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/DeleteObject.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/DeleteObject.class
Reader entry: ����   D +
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/InsertObject.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/InsertObject.class
Reader entry: ����   D C
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/ParamObject.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/ParamObject.class
Reader entry: ����   D I
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/SelectObject.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/SelectObject.class
Reader entry: ����   D 3
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/UpdateObject.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/db/UpdateObject.class
Reader entry: ����   D 0
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom
Reader entry: entity
Reader entry: mapper
Reader entry: service
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/entity
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/entity
Reader entry: Util.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/entity
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/entity/Util.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/entity/Util.class
Reader entry: ����   D $
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/mapper
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/mapper
Reader entry: UtilMapper.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/mapper
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/mapper/UtilMapper.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/mapper/UtilMapper.class
Reader entry: ����   D   $com/xu/oracle/mbom/mapper/UtilMapper  java/lang/Object   com/xu/wrapper/mapper/BaseMapper createTable '(Ljava/lang/String;Ljava/lang/String;)I MethodParameters des src test 6(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List; comp partid 	Signature m(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List<Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;>; RuntimeVisibleAnnotations &Lorg/apache/ibatis/annotations/MapKey; value "RuntimeVisibleParameterAnnotations %Lorg/apache/ibatis/annotations/Param; VLjava/lang/Object;Lcom/xu/wrapper/mapper/BaseMapper<Lcom/xu/oracle/mbom/entity/Util;>; 
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service
Reader entry: impl
Reader entry: UtilService.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service/impl
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service/impl
Reader entry: UtilServiceImpl.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service/impl
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service/impl/UtilServiceImpl.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service/impl/UtilServiceImpl.class
Reader entry: ����   D 
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service/UtilService.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/oracle/mbom/service/UtilService.class
Reader entry: ����   D   &com/xu/oracle/mbom/service/UtilService  java/lang/Object  com/xu/wrapper/service/IService 	Signature ULjava/lang/Object;Lcom/xu/wrapper/service/IService<Lcom/xu/oracle/mbom/entity/Util;>; 
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/SpringOracleApplication.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/SpringOracleApplication.class
Reader entry: ����   D L
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/test
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/test
Reader entry: Test.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/test
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/test/Test.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/test/Test.class
Reader entry: ����   D L
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util
Reader entry: DataUtil.class
Reader entry: MyBatisUtil.class
Reader entry: WebServiceBean.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util/DataUtil.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util/DataUtil.class
Reader entry: ����   DFind JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util/MyBatisUtil.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util/MyBatisUtil.class
Reader entry: ����   Dn
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util/WebServiceBean.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/util/WebServiceBean.class
Reader entry: ����   D U
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper
Reader entry: function
Reader entry: lambda
Reader entry: mapper
Reader entry: service
Reader entry: util
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/function
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/function
Reader entry: SFunction.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/function
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/function/SFunction.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/function/SFunction.class
Reader entry: ����   D   !com/xu/wrapper/function/SFunction  java/lang/Object  java/io/Serializable apply &(Ljava/lang/Object;)Ljava/lang/Object; MethodParameters t 	Signature(TT;)TR; R<T:Ljava/lang/Object;R:Ljava/lang/Object;>Ljava/lang/Object;Ljava/io/Serializable; 
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda
Reader entry: AbstractWrapper.class
Reader entry: LambdaQueryChainWrapper.class
Reader entry: LambdaQueryWrapper.class
Reader entry: LambdaUpdateChainWrapper.class
Reader entry: LambdaUpdateWrapper.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/AbstractWrapper.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/AbstractWrapper.class
Reader entry: ����   DFind JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/LambdaQueryChainWrapper.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/LambdaQueryChainWrapper.class
Reader entry: ����   D 1
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/LambdaQueryWrapper.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/LambdaQueryWrapper.class
Reader entry: ����   D }
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/LambdaUpdateChainWrapper.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/LambdaUpdateChainWrapper.class
Reader entry: ����   D &
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/LambdaUpdateWrapper.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/lambda/LambdaUpdateWrapper.class
Reader entry: ����   DFind JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/mapper
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/mapper
Reader entry: BaseMapper.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/mapper
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/mapper/BaseMapper.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/mapper/BaseMapper.class
Reader entry: ����   D <   com/xu/wrapper/mapper/BaseMapper  java/lang/Object insert (Ljava/lang/Object;)I MethodParameters bean 	Signature (TT;)I insertBatch (Ljava/util/Collection;)I beans (Ljava/util/Collection<TT;>;)I 
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service
Reader entry: impl
Reader entry: IService.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service/impl
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service/impl
Reader entry: ServiceImpl.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service/impl
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service/impl/ServiceImpl.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service/impl/ServiceImpl.class
Reader entry: ����   D/
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service/IService.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/service/IService.class
Reader entry: ����   D 4  com/xu/wrapper/service/IService  java/lang/Object save (Ljava/lang/Object;)Z MethodParameters bean 	Signature (TT;)Z 	saveBatch (Ljava/util/Collection;)Z beans (Ljava/util/Collection<TT;>;)Z 
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/util
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/util
Reader entry: LambdaUtils.class
Listing file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/util
Find JAR URL: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/util/LambdaUtils.class
Not a JAR: file:/D:/SourceCode/JavaLearn/spring-oracle/target/classes/com/xu/wrapper/util/LambdaUtils.class
Reader entry: ����   DChecking to see if class com.xu.conf.RedisConfig matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.db.DBConstant matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.db.DBObject matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.db.DeleteObject matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.db.InsertObject matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.db.ParamObject matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.db.SelectObject matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.db.UpdateObject matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.mbom.entity.Util matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.mbom.mapper.UtilMapper matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.mbom.service.impl.UtilServiceImpl matches criteria [is assignable to Object]
Checking to see if class com.xu.oracle.mbom.service.UtilService matches criteria [is assignable to Object]
Checking to see if class com.xu.SpringOracleApplication matches criteria [is assignable to Object]
Checking to see if class com.xu.test.Test matches criteria [is assignable to Object]
Checking to see if class com.xu.util.DataUtil matches criteria [is assignable to Object]
Checking to see if class com.xu.util.MyBatisUtil matches criteria [is assignable to Object]
Checking to see if class com.xu.util.WebServiceBean matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.function.SFunction matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.lambda.AbstractWrapper matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.lambda.LambdaQueryChainWrapper matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.lambda.LambdaQueryWrapper matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.lambda.LambdaUpdateChainWrapper matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.lambda.LambdaUpdateWrapper matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.mapper.BaseMapper matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.service.impl.ServiceImpl matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.service.IService matches criteria [is assignable to Object]
Checking to see if class com.xu.wrapper.util.LambdaUtils matches criteria [is assignable to Object]
Opening JDBC Connection
11:16:42.873 [main] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Starting...
11:16:43.885 [main] INFO com.zaxxer.hikari.pool.HikariPool -- HikariPool-1 - Added connection oracle.jdbc.driver.T4CConnection@4b23c30a
11:16:43.886 [main] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Start completed.
Setting autocommit to false on JDBC Connection [HikariProxyConnection@544966217 wrapping oracle.jdbc.driver.T4CConnection@4b23c30a]

在这里插入图片描述

2 MyBatis 核心组件

2.1 Configuration 配置管理

Configuration configuration = new Configuration(env);
  • Configuration 是 MyBatis 的核心配置类,负责管理所有的配置信息
  • 包括数据库环境、类型别名、映射器注册、缓存设置等

2.2 Environment 环境配置

Environment env = new Environment("dev", new JdbcTransactionFactory(), ds);
  • 定义了 MyBatis 运行环境,包括事务工厂和数据源
  • 支持多个环境配置,便于开发、测试、生产环境切换

2.3 SqlSessionFactory 工厂模式

sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
  • 工厂模式创建 SqlSessionFactory 实例
  • 用于创建 SqlSession 对象,是线程安全的,通常应用中只需要一个实例

3 MyBatis 初始化流程

3.1 数据源配置

HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(url);
ds.setUsername(username);
ds.setPassword(password);
  • 配置数据库连接池(此处使用 HikariCP)
  • MyBatis 本身不提供连接池,依赖外部数据源实现

3.2 XML 映射文件解析

XMLMapperBuilder builder = new XMLMapperBuilder(in, configuration, resource, configuration.getSqlFragments());
builder.parse();
  • 解析 Mapper XML 文件,将 SQL 语句和映射关系注册到 Configuration
  • 支持动态 SQL、结果映射、缓存配置等功能

3.3 Mapper 接口扫描注册

resolver.find(new ResolverUtil.IsA(Object.class), packages);
// ...
configuration.addMapper(cla);
  • 扫描指定包下的 Mapper 接口
  • 通过 Java 动态代理为接口生成实现类
  • 将接口方法与 XML 中的 SQL 语句进行绑定

4 MyBatis 运行时机制

4.1 SqlSession 会话管理

public static SqlSession openSession() {
    return sqlSessionFactory.openSession();
}
  • SqlSession 提供了操作数据库的所有方法
  • 包含执行 SQL、获取 Mapper、管理事务等功能
  • 是线程不安全的,每次数据库操作都需要创建新实例

4.2 Mapper 代理机制

// 使用示例(伪代码)
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectById(1);
  • MyBatis 通过 JDK 动态代理为 Mapper 接口生成实现
  • 根据方法签名自动定位对应的 SQL 语句
  • 实现了接口编程,屏蔽了 JDBC 细节

5 MyBatis 核心特性

5.1 结果映射

  • 自动将查询结果映射到 Java 对象
  • 支持复杂的结果映射(嵌套、关联查询等)
  • 支持驼峰命名转换(mapUnderscoreToCamelCase

5.2 动态 SQL

  • 通过 XML 标签实现条件判断、循环等逻辑
  • 支持 <if><choose><foreach> 等标签
  • 大大简化了复杂 SQL 的编写

5.3 缓存机制

configuration.setCacheEnabled((Boolean) conf.get("cache-enabled"));
  • 一级缓存(SqlSession 级别)
  • 二级缓存(Mapper 级别)
  • 可配置不同的缓存实现

5.4 插件机制

  • 支持拦截器扩展功能
  • 可拦截 Executor、StatementHandler、ParameterHandler、ResultSetHandler 四大核心接口
  • 实现分页、监控、日志等通用功能

MyBatis 通过这种设计实现了 SQL 与代码的分离,既保留了 SQL 的灵活性,又提供了 ORM 的便利性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐