SpringBoot 自定义加载 MyBatis XML
·
SpringBoot 自定义加载 MyBatis XML
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: ���� D �
Find 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: ���� D �
Find 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: ���� D �
Find 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: ���� D �
Checking 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 的便利性。
更多推荐
所有评论(0)