全文配置文件详解
0、XML映射配置文件
- 注意: 配置文件中的标签的顺序非常重要. 必须严格按照上述顺序!
1、properties 属性
- 作用:指定外部配置文件的位置
2、配置 settings
2.1 全局设置概述
调整 settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为。
设置参数 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 该配置影响的所有映射器中配置的缓存的全局开关。 | true false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 | true false | false |
aggressiveLazyLoading | 当启用时,带有延迟加载属性的对象的加载与否完全取决于对任意延迟属性的调用;反之,每种属性将会按需加载。 | true false | true |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 | true false | False |
- queryUserById
- user_name userName
2.2 设置是否开启自动驼峰命名规则映射
2.2.1 什么是驼峰命名规则?
- 骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。
2.2.2 为什么要开启自动驼峰命名规则映射?
- 因为 User对象的属性userName 和 tb_user表 的字段 user_name不一致, 所以导致 用户名的为null
- 因为 使用别名解决 User类的属性 userName 和 tb_user表的 列名 user_name不一致比较麻烦, 如果多个字段都不一致, 都是使用别名, 维护困难, 开发困难, 所以 可以考虑 开启自动驼峰命名规则映射.
2.2.3 怎么解决? 开启自动驼峰命名规则映射
<settings>
<!--开启自动驼峰命名规则-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
解决属性名和列名不一致:
- 1.使用别名可以解决
- 2.开启驼峰标识也可以解决
3 typeAliases 类型别名
3.1 why
- 类型别名是为 Java 类型命名的一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
3.2 how
mybatis-config.xml
<typeAliases>
<!--起别名-->
<typeAlias type="cn.hanjiaxiaozhi.pojo.User" alias="User"/>
</typeAliases>
- UserMapper.xml 可已经 cn.hanjiaxiaozhi.domain.User 替换成 User, 如下
<select id="queryUserById" parameterType="java.lang.Long" resultType="User">
<!--这里写具体的sql语句, #{}是占位符, 编译时会被替换成?, 然后注入真实参数-->
select * from tb_user where id=#{id}
</select>
<!--查询所有用户-->
<select id="queryUserList" resultType="User">
select * from tb_user
</select>
问题: 如果有很多javabean,这样起别名太麻烦了?
-
解决方案: 指定包, 这样会将每个类的名称作为别名,如下
-
mybatis-config.xml
<typeAliases>
<!--起别名-->
<!--<typeAlias type="cn.hanjiaxiaozhi.domain.User" alias="User"/>-->
<!--指定包-->
<package name="cn.hanjiaxiaozhi.pojo"/>
</typeAliases>
- 已经为普通的 Java 类型内建了许多相应的类型别名。它们都是大小写不敏感的,需要注意的是由于重载原始类型的名称所做的特殊处理。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
4、environments
- 概述: 可以配置多个环境
<environments default="test">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
- 因为 进行框架整合时,会交给spring, 所以 作为了解就可以了
5、映射器(mappers)☆☆☆☆☆
5.1 方式一 使用项目资源路径
<!--关联映射文件-->
<mappers>
<!--方式一: 在resource目录下查找-->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
- 缺点: 如果有多个mapper文件, 需要一个一个指定?
- 简化思路: 能够通过类的全路径来指定?
5.2 方式二: 通过类的全路径来指定
- 要求:
- 1.
目录名和包名一致;
- 2.
文件名和接口名一致.
- 1.
<!--3 指定所有的mapper文件-->
<mappers>
<!--方式一: 在resource目录下查找-->
<!--<mapper resource="mapper/UserMapper.xml"/>-->
<!--方式二: 通过类的全路径名称-->
<mapper class="cn.hanjiaxiaozhi.mapper.UserMapper"/>
</mappers>
- 再次执行查询, 报异常
Invalid bound statement(not found)
- 如何解决? 在pom.xml中增加
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
- 问题1:如果有多个Mapper,需要一个个加载!
- 问题2:Mapper.xml文件名 与 Java文件名一致,不好。
5.3 方式三: 配置扫描包
<!--关联映射文件-->
<mappers>
<!--方式三: 扫描包-->
<package name="cn.hanjiaxiaozhi.mapper"/>
</mappers>
- 要求:
- 1.
目录名和包名一致;
- 2.
文件名和接口名一致.
- 1.