Skip to content

MyBatis 核心配置详解

配置、环境、数据源、类型处理器、插件


mybatis-config.xml 结构

xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 1. 属性配置 -->
    <properties resource="db.properties"/>
    
    <!-- 2. 设置 -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <!-- 3. 类型别名 -->
    <typeAliases>
        <typeAlias type="com.example.entity.User" alias="User"/>
        <package name="com.example.entity"/>
    </typeAliases>
    
    <!-- 4. 类型处理器 -->
    <typeHandlers>
        <typeHandler handler="com.example.handler.LocalDateHandler"/>
    </typeHandlers>
    
    <!-- 5. 对象工厂 -->
    <objectFactory type=""/>
    
    <!-- 6. 插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
    </plugins>
    
    <!-- 7. 环境配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 8. Mapper 配置 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
        <mapper class="com.example.mapper.UserMapper"/>
        <package name="com.example.mapper"/>
    </mappers>
</configuration>

properties 属性配置

外部配置文件 (db.properties)

properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_db?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=password

引用方式

xml
<properties resource="db.properties"/>

<dataSource>
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
</dataSource>

settings 设置

重要配置项

xml
<settings>
    <!-- 开启驼峰命名自动映射:user_id → userId -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    
    <!-- 开启延迟加载 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    
    <!-- 积极加载(按需加载) -->
    <setting name="aggressiveLazyLoading" value="false"/>
    
    <!-- 日志实现 -->
    <setting name="logImpl" value="SLF4J"/>
    
    <!-- 开启二级缓存(默认 true) -->
    <setting name="cacheEnabled" value="true"/>
    
    <!-- JDBC 类型为 null 时使用 OTHER -->
    <setting name="jdbcTypeForNull" value="NULL"/>
    
    <!-- 自动生成主键(selectKey) -->
    <setting name="useGeneratedKeys" value="true"/>
    
    <!-- 指定触发延迟加载的方法 -->
    <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

typeAliases 类型别名

单个定义

xml
<typeAliases>
    <typeAlias type="com.example.entity.User" alias="User"/>
    <typeAlias type="com.example.entity.Order" alias="Order"/>
</typeAliases>

批量定义(包扫描)

xml
<typeAliases>
    <package name="com.example.entity"/>
</typeAliases>

使用 @Alias 注解

java
@Alias("User")
public class User {
    private Long id;
    private String name;
}

内置类型别名

别名Java 类型
stringString
integer / intInteger / int
longLong
doubleDouble
floatFloat
booleanBoolean
dateDate
decimal / bigdecimalBigDecimal
mapMap
hashmapHashMap
list / arraylistList / ArrayList

typeHandlers 类型处理器

内置类型处理器

处理器对应 Java 类型JDBC 类型
StringTypeHandlerStringVARCHAR
IntegerTypeHandlerIntegerINTEGER
LongTypeHandlerLongBIGINT
BooleanTypeHandlerBooleanBIT
DateTypeHandlerDateTIMESTAMP
LocalDateTimeHandlerLocalDateTimeTIMESTAMP

自定义类型处理器

java
@MappedTypes(LocalDate.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class LocalDateTypeHandler extends BaseTypeHandler<LocalDate> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, 
            LocalDate parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toString());
    }

    @Override
    public LocalDate getNullableResult(ResultSet rs, String columnName) 
            throws SQLException {
        String date = rs.getString(columnName);
        return date == null ? null : LocalDate.parse(date);
    }

    @Override
    public LocalDate getNullableResult(ResultSet rs, int columnIndex) 
            throws SQLException {
        String date = rs.getString(columnIndex);
        return date == null ? null : LocalDate.parse(date);
    }

    @Override
    public LocalDate getNullableResult(CallableStatement cs, int columnIndex) 
            throws SQLException {
        String date = cs.getString(columnIndex);
        return date == null ? null : LocalDate.parse(date);
    }
}

注册方式

xml
<typeHandlers>
    <typeHandler handler="com.example.handler.LocalDateTypeHandler"/>
    <package name="com.example.handler"/>
</typeHandlers>

environments 环境配置

环境定义

xml
<environments default="development">
    <!-- 开发环境 -->
    <environment id="development">
        <transactionManager type="JDBC">
            <property name="closeConnection" value="false"/>
        </transactionManager>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
            <!-- 连接池配置 -->
            <property name="poolMaximumActiveConnections" value="10"/>
            <property name="poolMaximumIdleConnections" value="5"/>
            <property name="poolMaximumCheckoutTime" value="20000"/>
            <property name="poolTimeToWait" value="20000"/>
        </dataSource>
    </environment>
    
    <!-- 生产环境 -->
    <environment id="production">
        <transactionManager type="MANAGED"/>
        <dataSource type="JNDI">
            <property name="data_source" value="java:comp/env/jdbc/mybatis"/>
        </dataSource>
    </environment>
</environments>

事务管理器类型

类型说明
JDBC直接使用 JDBC 提交/回滚
MANAGED容器管理事务(Spring/JEE)
自定义实现 TransactionFactory

数据源类型

类型说明
UNPOOLED每次请求创建新连接
POOLED连接池(推荐)
JNDIJNDI 数据源

mappers 映射器注册

方式一:XML 资源路径

xml
<mappers>
    <mapper resource="mapper/UserMapper.xml"/>
    <mapper resource="mapper/OrderMapper.xml"/>
</mappers>

方式二:类注册

xml
<mappers>
    <mapper class="com.example.mapper.UserMapper"/>
    <mapper class="com.example.mapper.OrderMapper"/>
</mappers>

方式三:包扫描

xml
<mappers>
    <package name="com.example.mapper"/>
</mappers>

方式四:URL 注册

xml
<mappers>
    <mapper url="file:///D:/mybatis/mapper/UserMapper.xml"/>
</mappers>

插件机制

插件接口

java
@Intercepts({
    @Signature(type = Executor.class, method = "query", 
              args = {MappedStatement.class, Object.class, 
                      RowBounds.class, ResultHandler.class}),
    @Signature(type = Executor.class, method = "update", 
              args = {MappedStatement.class, Object.class})
})
public class ExamplePlugin implements Interceptor {
    
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 执行前处理
        System.out.println("执行前...");
        
        // 执行目标方法
        Object result = invocation.proceed();
        
        // 执行后处理
        System.out.println("执行后...");
        
        return result;
    }
}

注册插件

xml
<plugins>
    <plugin interceptor="com.example.plugin.ExamplePlugin"/>
</plugins>

相关页面

  • **Java\MyBatis\MyBatis-完全指南** - 返回总览
  • **Java\MyBatis\MyBatis-Mapper映射** - SQL 映射详解
  • **Java\MyBatis\MyBatis-关联查询** - 复杂关系查询

#标签 #mybatis #配置 #settings #properties #typeHandler

Knowledge4J — Java 知识库