Mybatis-03-配置
配置
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
配置文档的顶层结构:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
环境配置(environments)
MyBatis 可以配置成适应多种环境,这样有助于将 SQL 映射应用于多种数据库之中, 现实情况下有很多都需要这么做。
例如:开发、测试和生产环境需要有不同的配置
要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
Mybatis 默认的事务管理器就是JDBC ,连接池:POOLED
每个数据库对应一个 SqlSessionFactory 实例
指定创建哪种环境,将 一个资源
或 配置的环境ID
作为可选的参数传递给 SqlSessionFactoryBuilder。
为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法:
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"development");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,properties);
environments 元素定义了如何配置环境。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
注意一些关键点:
- 默认使用的环境 ID(比如:default="development")。
- 每个 environment 元素定义的环境 ID(比如:id="development")。
- 事务管理器的配置(比如:type="JDBC")。
- 数据源的配置(比如:type="POOLED")。
默认环境和环境 ID 顾名思义。 环境可以随意命名,但必须保证默认的环境 ID 要匹配其中一个环境 ID。
事务管理器(transactionManager)
暂无
数据源(dataSource)
暂无
属性(properties)
这些属性可以在外部进行配置,并可以进行动态替换。
既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置(db.properties)
- 可以直接引入外部文件
- 可以在其中增加一些属性配置
- 如果两个文件有同一个人字段,优先使用外部配置文件的!
编写一个数据库配置文件 db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?userSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
在核心配置文件中引入 优先读取配置文件
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
typeAliases(类型别名)
2.1、什么是别名
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
设置别名前
<select id="getUsers" resultType="com.qn.pojo.User">
select *
from mybatis.user
</select>
设置别名后
<select id="getUsers" resultType="user">
select *
from mybatis.user
</select>
2.2、配置别名
可以单独配置一个实体类的别名,也可以直接配置扫描一个包下全部的实体类;
指定一个包
,MyBatis会使用 实体类的首字母小写
的非限定类名来作为它的别名
;
直接在实体类上添加注释 @Alias("user")
。
也可以使用首字母大小的方式,mybatis 内部机制会自己进行检索。
-
指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
<typeAliases> <package name="com.qn.pojo"/> </typeAliases>
-
指定一个实体类的别名
<typeAliases> <typeAlias type="com.qn.pojo.User" alias="user"/> </typeAliases>
-
使用
@Alias()
注解配置实体类别名@Alias("user") public class User { private int id; private String name; private String pwd; }
设置(settings)
注意:设置名 大小写
要一致,不能出现多余的空格
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 |
true | false | false |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
实例:
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
6、其他配置
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- mybatis-generator-core
- mybatis-plus
- 通用mapper
typeHandlers(类型处理器)
暂无
objectFactory(对象工厂)
暂无
映射器 (mappers)
1、方式一
<mappers>
<mapper resource="com/qn/dao/UserMapper.xml"/>
</mappers>
2、方式二 使用 calss文件绑定注册
<mappers>
<mapper class="com.qn.dao.UserMapper"/>
</mappers>
注意点
-
接口和配置文件必须同名!
-
接口和它的mapper配置文件必须在同一个包下!
3、方式三 使用扫描包
<mappers>
<package name="com.qn.dao"/>
</mappers>
注意点
- 接口和配置文件必须同名!
- 接口和它的mapper配置文件必须在同一个包下!
生命周期
生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder
- 一旦创建了 SqlSessionFactory,就不再需要它了
- 局部变量
SqlSessionFactory
-
类比:数据库连接池
-
一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
-
因此 SqlSessionFactory 的最佳作用域是应用作用域。
-
最简单的就是使用单例模式或者静态单例模式。
SqlSession
- 连接到数据库的一个请求
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
- 用完之后需要赶紧关闭,否则会占用资源
这里面的每一个Mapper,就代表一个具体的业务!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)