MyBatis中的配置文件详解

 更新时间:2023年10月25日 15:26:52   作者:啊Q老师  
在 MyBatis 中,配置文件分为 全局配置文件(核心配置文件)和映射配置文件,本文给大家介绍MyBatis中的配置文件相关知识,感兴趣的朋友一起看看吧

前言

在 MyBatis 中,配置文件分为 全局配置文件(核心配置文件)映射配置文件 。通过这两个配置文件,MyBatis 可以根据需要动态地生成 SQL 语句并执行,同时将结果集转换成 Java 对象,使得在 Java 程序中操作数据库变得更加方便和灵活。

全局配置文件

全局配置文件(Core Configuration File),是 MyBatis 的核心配置文件,通常命名为 mybatis-config.xml 。这个文件包含 MyBatis 运行时所需的核心配置信息,如数据库连接信息、事务管理器、别名、映射文件等。

全局配置文件通常的结构

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
– environment(环境变量)
---- transactionManager(事务管理器)
---- dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

常见全局配置标签

标签说明
configuration配置文件的根标签。包含其他所有的配置标签
properties设置外部配置且可动态替换的标签。一般用于读取外部的 properties 属性文件
settings配置 MyBatis 运行时行为的标签。一般情况下使用默认值即可
typeAliases设置别名的标签。可以简化类型名称的书写,如可以用一个别名代替一个类全名
typeHandlers指定处理 Java 类型的 TypeHandler 的标签。通过配置 typeHandlers,可以在全局范围内注册自定义的 TypeHandler,使得在所有的 SQL 语句中都可以使用该 TypeHandler 来处理特定的 Java 类型
objectFactory指定对象工厂的标签。通过配置 objectFactory ,可以在全局范围内指定一个自定义的对象工厂,用于创建所有映射器文件中需要的对象实例
plugins注册插件的标签。通过配置 plugins ,可以在全局范围内注册自定义的插件,使得插件可以拦截目标方法,并在目标方法执行前后添加额外的逻辑,如日志记录、权限校验、缓存控制等
environments配置环境的标签。如开发环境、测试环境和生产环境等。每个环境(environment)可以设置一个事务管理器(Transaction Manager)和一个数据源(DataSource)
databaseIdProvider指定数据库标识提供者的标签。MyBatis 可以根据不同的数据库厂商执行不同的 SQL 语句
mappers指定映射文件路径的标签。MyBatis 会加载这些文件并将其应用于相应的数据库操作

settings 标签中的属性

属性说明
cacheEnabled默认值为 true ,全局开关所有映射器配置文件中已配置的任何缓存
lazyLoadingEnabled默认值为 false ,延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态
aggressiveLazyLoading默认值为 false ,当开启时,任何方法的调用都会加载该对象的所有延迟加载属性。反之,每个延迟加载属性将会按需加载
multipleResultSetsEnabled默认值为 true ,是否允许单个语句返回多结果集(需要数据库驱动支持)
useColumnLabel默认值为 true ,使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档
useGeneratedKeys默认值为 false ,允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)
autoMappingBehavior默认值为 PARTIAL ,指定 MyBatis 应如何自动映射列到字段或属性。NONE 表示关闭自动映射;PARTIAL 表示只会自动映射没有定义嵌套结果映射的字段;FULL 表示会自动映射任何复杂的结果集(无论是否嵌套)
autoMappingUnknownColumnBehavior默认值为 none(不处理),指定发现自动映射目标未知列(或未知属性类型)的行为
defaultExecutorType默认值为 simple ,配置默认的执行器。SIMPLE 是普通执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新
defaultStatementTimeout默认值为 null ,设置超时时间,它决定数据库驱动等待数据库响应的秒数
defaultFetchSize默认值为 null ,为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖
defaultResultSetType默认值为 null ,指定语句默认的滚动策略
safeRowBoundsEnabled默认值为 false ,是否允许在嵌套语句中使用分页(RowBounds)。如果允许使用设置为 false
safeResultHandlerEnabled默认值为 true ,是否允许在嵌套语句中使用结果处理器(ResultHandler)。如果允许使用设置为 false
mapUnderscoreToCamelCase默认值为 false ,是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn
localCacheScope默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT ,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询
jdbcTypeForNull当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,如 NULL、VARCHAR 或 OTHER
lazyLoadTriggerMethods指定对象的哪些方法触发一次延迟加载
defaultScriptingLanguage指定动态 SQL 生成使用的默认脚本语言
defaultEnumTypeHandler指定 Enum 使用的默认 TypeHandler
callSettersOnNulls默认值为 false ,指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的
returnInstanceForEmptyRow默认值为 false ,当返回行的所有列都是空时,MyBatis 默认返回 null 。 当开启这个设置时,MyBatis会返回一个空实例。 注意:它也适用于嵌套的结果集(如集合或关联)
logPrefix指定 MyBatis 增加到日志名称的前缀
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找
proxyFactory指定 Mybatis 创建可延迟加载对象所用到的代理工具
vfsImpl指定 VFS 的实现
useActualParamName默认值为 true ,允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,项目中必须采用 Java 8 编译并加上 -parameters 选项
configurationFactory指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为 static Configuration getConfiguration() 的方法
shrinkWhitespacesInSql默认值为 false ,从 SQL 中删除多余的空格字符。注意:这也会影响 SQL 中的文字字符串
defaultSqlProviderType指定一个拥有 provider 方法的 sql provider 类 。 这个类适用于指定 sql provider 注解上的 type(或 value) 属性(当这些属性在注解中被忽略时),如 @SelectProvider
nullableOnForEach默认值为 false ,为 foreach 标签的 nullable 属性指定默认值
argNameBasedConstructorAutoMapping默认值为 false ,当应用构造器自动映射时,参数名称被用来搜索要映射的列,而不再依赖列的顺序

简单示例:
在Java持久层框架:MyBatis介绍文章的案例基础上

1.typeAliases 标签:设置别名的标签。可以简化类型名称的书写,如可以用一个别名代替一个类全名

首先,在 mybatis.xml 配置文件中配置以下内容

<!-- typeAliases:设置别名,简化类型名称的书写。用一个别名代替一个类全名 -->
<typeAliases>
    <!-- 即 user 名称可以替代 cn.edu.MyBatisDemo.model.User 类全名 -->

    <!-- 设置单个别名的方式 -->
    <!-- <typeAlias type="cn.edu.MyBatisDemo.model.User" alias="user" /> -->

    <!-- 设置多个别名的方式,别名默认为类名(首字母为小写) -->
    <!-- 可以使用 @Alias() 注解在实体类的上方设置自定义的别名 -->
    <package name="cn.edu.MyBatisDemo.model" />
</typeAliases>

接着,在其他配置文件(如 UserMapper.xml )中使用到 cn.edu.MyBatisDemo.model.User 的类全名都可以写成 user 名称

最后,测试结果
结果如图:

2.mappers 标签:指定映射文件路径的标签。MyBatis 会加载这些文件并将其应用于相应的数据库操作

首先,在 mybatis.xml 配置文件中配置以下内容

<!-- POJO对象与数据表的映射配置 -->
<mappers>
    <!-- 1.类路径 -->
    <!-- <mapper resource="cn/edu/MyBatisDemo/model/UserMapper.xml" /> -->

    <!-- 2.包全名(注:映射文件与接口必须在同一个包和相同的文件名)-->
    <package name="cn.edu.MyBatisDemo.mapper" />
</mappers>

接着,查看映射文件与接口是否在同一个包里和相同的文件名

最后,测试结果
结果如图:

映射配置文件

映射配置文件(Mapping Configuration File),用于定义 SQL 语句和结果集的映射关系。每个映射配置文件都对应于数据库中的一个表或一个存储过程。映射配置文件通常会以 .xml 格式保存,并且命名方式通常是 [实体名] Map.xml 或者 [表名] Map.xml 。

常见映射配置标签

标签说明
mapper映射文件的根元素,包含了其他的映射定义
cache开启缓存以及配置属性来定制缓存的行为
cache-ref引用另一个命名空间的缓存配置,允许在多个命名空间之间共享缓存配置
resultMap定义一个结果集的映射关系,用于将数据库中的结果集转换成 Java 对象
select定义一个 SQL 查询语句,用于从数据库中获取数据
insert定义一个 SQL 插入语句,用于向数据库中插入数据
update定义一个 SQL 更新语句,用于更新数据库中的数据
delete定义一个 SQL 删除语句,用于从数据库中删除数据

简单示例:
在上面的案例基础上,再实现用户的增删改功能

首先,在接口 UserMapper 上声明增删改的方法

public void insert(User user); // 新增用户
public void update(User user); // 修改用户信息
public void delete(int id); // 删除指定用户

接着,在 UserMapper.xml 映射文件中添加对应的标签来实现

<!-- 通过 useGeneratedKeys 和 keyProperty 属性获取 MySQL 自增的主键 id 值 -->
<!-- useGeneratedKeys:开启添加记录后返回其 id 值 -->
<!-- keyProperty:设置返回的值放到对象指定的属性值上 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO `user` (`name`,`password`,`date`,`state`) VALUES (#{name},#{password},#{date},#{state})
</insert>

<update id="update" >
    UPDATE `user` SET `name`=#{name},`password`=#{password},`date`=#{date},`state`=#{state} WHERE `id`=#{id}
</update>

<delete id="delete" >
    DELETE FROM `user` WHERE `id`=#{id}
</delete>

最后,测试结果

package cn.edu.MyBatisDemo.test;
import cn.edu.MyBatisDemo.mapper.UserMapper;
import cn.edu.MyBatisDemo.model.User;
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.Date;
public class MyBatisTest {
    @Test
    public void test() throws IOException {
        //1.根据配置文件创建数据库连接会话的工厂类
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        //获取工厂类
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.通过工厂类获取数据库连接的会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.通过 sqlSession 操作数据库
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            //新增用户信息
            User insertUser = new User("诸葛亮","ccc",new Date(),1); // 在实体类中添加对应的参数构造方法
            userMapper.insert(insertUser);
            //获取新增用户的 id 值
            int id = insertUser.getId();
            //查看指定用户
            User selectUser = userMapper.selectUserById(id);
            System.out.println(selectUser);
            /**
             *  //修改指定用户
             *  User updateUser = new User("曹操","ccc",new Date(),1);
             *  updateUser.setId(20230815);
             *  userMapper.update(updateUser);
             *
             *  //删除指定用户
             *  userMapper.delete(20230815);
             */
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
}
结

结果如图:

参数数量
在案例的 selectUserById 方法中,只传递一个 id 值作为参数(单个参数),在 UserMapper.xml 映射文件中通过 #{id} 来接收。通常情况下,使用相同名字输入在 #{} 内,也可以使用任意字符串输入在 #{} 内。

但是,在多个参数的情况下,MyBatis 会把参数封装成 Map 对象,#{} 内将从 Map 对象中获取对应值,其获取方式分为三种:

书写格式1:参数1—param1,参数2—param2 …

书写格式2:参数1—arg0,参数2—arg1 …

书写格式3:在接口方法的参数上使用 @Param() 注解指定名字

另外,也可以将多个参数封装成 POJO 对象,通过 #{ POJO 对象属性} 形式获取传递的值

参数类型
接口方法上的参数类型集合数组时,同样 MyBatis 也是将参数封装成 Map 对象,然后分别通过 #{collection}#{array} 方式获取参数值。另外,List 集合可以通过 #{list} 方式获取。
书写格式1:参数1—#{collection[0]},参数2—#{collection[1]} …
书写格式2:参数1—#{array[0]},参数2—#{array[1]} …
书写格式3:参数1—#{list[0]},参数2—#{list[1]} …

参数符号
在映射文件中,获取参数所使用的参数符号分为两种:#{}${}
#{}:PreparedStatement 对象来执行的 SQL 语句(预编译,基本情况下使用该参数符号)
${}:Statement 对象来执行的 SQL 语句 (拼接成 SQL 语句,存在注入攻击风险。一般用于传入数据库对象,如表名、order by 排序字段)

select 标签属性
resultType 属性
1.当返回结果为 List 集合类型时,resultType 属性值为类全名或设置的别名

2.当返回结果为 Map 集合类型时,resultType 属性值为已设定的别名 map

resultMap 属性
1.自定义数据库字段与对象属性的对应名字

2.实现关联查询

到此这篇关于MyBatis:配置文件的文章就介绍到这了,更多相关MyBatis配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现高效的枚举元素集合示例

    java实现高效的枚举元素集合示例

    Set是Java集合类的重要组成部分,它用来存储不能重复的对象。枚举类型也要求其枚举元素各不相同。看起来枚举类型和集合是很相似的。然而枚举类型中的元素不能随意的增加、删除,作为集合而言,枚举类型非常不实用。EnumSet是专门为enum实现的集合类,本实例将演示其用法
    2014-03-03
  • SpringBoot集成MyBatis对管理员的查询操作

    SpringBoot集成MyBatis对管理员的查询操作

    本文主要介绍了SpringBoot集成MyBatis对管理员的查询操作,实现增删改查中的查询操作,对所有的普通管理员进行查询操作,感兴趣的可以了解一下
    2023-11-11
  • 基于CopyOnWriteArrayList并发容器(实例讲解)

    基于CopyOnWriteArrayList并发容器(实例讲解)

    下面小编就为大家带来一篇基于CopyOnWriteArrayList并发容器(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • java之lombok的构建者模式Builder中的泛型写法说明

    java之lombok的构建者模式Builder中的泛型写法说明

    这篇文章主要介绍了java之lombok的构建者模式Builder中的泛型写法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Intellij IDEA 2020.3 配置教程详解

    Intellij IDEA 2020.3 配置教程详解

    这篇文章主要介绍了Intellij IDEA 2020.3 配置教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java实现一个简单的定时器代码解析

    Java实现一个简单的定时器代码解析

    这篇文章主要介绍了Java实现一个简单的定时器代码解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java之使用POI教你玩转Excel导入与导出

    Java之使用POI教你玩转Excel导入与导出

    这篇文章主要介绍了Java之使用POI教你玩转Excel导入与导出,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • java:程序包org.apache.ibatis.annotations不存在报错解决

    java:程序包org.apache.ibatis.annotations不存在报错解决

    这篇文章主要给大家介绍了关于java:程序包org.apache.ibatis.annotations不存在报错的解决方法,这个错误是我在直接导入springboot项目的时候报错的,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • JavaWeb Servlet生命周期细枝末节处深究

    JavaWeb Servlet生命周期细枝末节处深究

    Servlet指在服务器端执行的一段Java代码,可以接收用户的请求和返回给用户响应结果,下面这篇文章主要给大家介绍了关于JavaWeb.servlet生命周期的相关资料,需要的朋友可以参考下
    2022-10-10
  • 带你快速入门掌握Spring的那些注解使用

    带你快速入门掌握Spring的那些注解使用

    注解是个好东西,注解是Java语法,被Java编译器检查,可以减少配置错误,这篇文章主要给大家介绍了关于Spring的那些注解使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02

最新评论