MyBatis中的配置文件详解
作者:啊Q老师
前言
在 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配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!