文章目录
1.配置解析
1.1、核心配置文件
-
mybatis-config.xml
-
MyBatis的配置文件会影响mybatis行为的设置和属性信息
-
configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
1.2、environments(环境配置)
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
<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”)。
1.事务管理器的配置(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”)默认的是JDBC:
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。例如:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
2.数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
- 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。
有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”),默认的是POOLED
1.3、属性(properties)
我们可以通过properties属性来实现引用配置文件
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
编写一个配置文件db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
password=123456
在核心配置文件mybatis-config.xml中映入
<properties resource="db.properties">
<!--在这里面可以补充些数据-->
<property name="name" value="root"/>
</properties>
- 可以直接映入外部文件
- 也可以在引入的时候增加数据
- 如果引入时添加的和外部文件是同一个字段,优先使用.xml里面配置的
- 在核心配置文件中,编写配置要按照顺序编写,像properties外部配置要放在最前面
1.4、类型别名(typeAliases)
- 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
<!-- 可以给实体类取别名-->
<typeAliases>
<typeAlias alias="User" type="pojo.User"/>
</typeAliases>
在后面resulttype里面就可以直接用User来代替pojo.User
- 也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
扫描实体类的包,它的默认别名就是包里面类的类名,首字母小写
<typeAliases>
<package name="pojo"/>
</typeAliases>
则User的别名就是user
用扫描包的话,如果想更改别名为user02,就得使用注解
@Alias("user02")
public class User {
...
}
- 常见的 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 |
1.5、设置(settings)
Mybatis重要的调整设置,会改变MyBatis的运行时行为
设置名(以下只是部分设置) | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 |
true | false | false |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
1.6映射器(mappers)
MapperRegistry:注册绑定我们的Mapper文件
方式一:
<!-- 每一个mapper.xml都需要在mybatis核心配置文件中注册-->
<mappers>
<mapper resource="dao/UserMapper01.xml"/>
</mappers>
方式二:使用class文件绑定注册
<mappers>
<mapper class="dao.UserMapper01"/>
</mappers>
注意:
- 接口和其对应的Mapper配置文件必须同名
- 接口和其对应的Mapper配置文件必须在同一个包下
方式三:使用扫描包进行绑定
<mappers>
<package name="dao"/>
</mappers>
1.7作用域(Scope)和生命周期
生命周期,作用域都是至关重要的。因为错误的使用会导致严重的并发问题。
SqlSessionFactoryBuilder:
- 一旦创建了SqlSessionFactory,就不需要它了
- 可以当成局部变量
SqlSessionFactory:
- 可以看作成是:数据库连接池
- SqlSessionFactory一旦创建就应该在运行期间一直存在,不能丢弃它或者重新创建另一个实例
- 因此SqlSessionFactory的最佳作用域是应用作用域
- 最简单的就是使用单例模式或者静态单例模式
SqlSession:
- 连接到连接池的一个请求
- SqlSession的实例不是线程安全的,因此不能被共享,所以它的最佳作用域是请求或方法作用域
- 用完需要赶紧关闭,否则资源会被占用
2.解决属性名字段名不一致的问题(ResultMap)
数据库中的字段名和实体类中的属性名不一致
如实体类中是password,数据库中是pwd,则查询的时候会出现
密码查不出来,解决方案如下:
- 第一种:起别名
<select id="getUserById" parameterType="int" resultType="pojo.User">
select id,username,pwd as password from mybatis.user where id = #{id}
</select>
- 第二种:使用ResultMap
<!-- 结果集映射-->
<resultMap id="UserMap" type="User">
<!-- column表示数据库的字段,property实体类中的属性-->
<result column="pwd" property="password"></result>
</resultMap>
<select id="getUserById" parameterType="int" resultMap="UserMap">
select id,username,pwd from mybatis.user where id = #{id}
</select>
resultMap
元素是 MyBatis 中最重要最强大的元素。- ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
ResultMap
的优秀之处——你完全可以不用显式地配置它们。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84174.html