mybatis的核心配置解析

mybatis-config.xml系统核心配置解析

MyBatis的配置文件包含了会深深影响Mybatis的设置和属性信息
能配置的·内容下:

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

注意元素节点的顺序,顺序不对会出错

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>

配置Mybatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认的运行环境(通过default指定)

子元素节点:environment
子元素节点:数据源(dataSource)
dataSource元素使用标准的JDBC数据源接口来配置JDBC连接对象的资源
数据源是必须配置的。
由三种内建的数据源类型

type="[UNPOOLED|POOLED|JNDI]"

unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
**pooled:**这种数据源的实现利用“池”的概念将JDBC连接对象组织起来,这是一种使得并发Web应用快速响应请求的流行处理方式。
jndi:这个数据员的实现是为了能在如spring或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文引用
数据源也有很多第三方的实现:比如:dbcp,c3p0,druid等等。

子元素节点:transactionManager【事务管理器】

<transactionManager type="[JDBC|MANAGED]"/>

这两种事务管理器类型都不需要设置任何的属性

mappers元素

mappers
映射器:定义映射SQL语句的文件

	既然Mybatis的行为其他元素已经配置完了,我们现在就要定义SQL映射语句了,首先告诉mybatis去哪里找到这些语句。Java在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉mybatis到哪里去找映射文件你可以使用相对类路径的资源引用,或完全限定资源定位符或包名和类名等,映射器是Mybatis中最核心的组件之一。
	在Mybatis3之前,只支持xml映射器,即:所有的SQL语句都必须在xml文件中配置。
	而Mybatis3开始,还支持接口映射器,这种映射器的方式允许以Java对代码的方式注解定义SQL语句,非常简洁,

引入资源方式

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!--
使用映射器接口实现类的完全限定类名
需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!--
将包内的映射器接口实现全部注册为映射器
但是需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

Mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.mapper.UserMapper">
    
</mapper>

namespase中文意思:命名空间,
作用:
namespace的明明必须跟某个接口同名
接口中的方法与映射文件中sql语句的id应该一一对应
namespace和子元素的id联合保证唯一,区别不同的mapper
绑定DAO接口
namespace命名规则:包名+类名
MyBatis的真正强大在于它的映射语句,由于它的异常强大,映射器的xml文件就显得相对简单了。跟具有相同功能的JDBC代码对比,你就会立即省掉将近96%的代码。
Mybatis为聚焦SQL而构建,尽可能减少程序员在数据库操作上的麻烦

===================================================================

properties优化

数据库这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可以通过properties元素的子元素来传递

第一步:在资源目录下新建一个db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username=root
password=123456

第二步:将文件导入properties配置文件

<configuration>
    <!--导入properties文件-->
    <properties resource="db.properties"/>
 
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

typeAliases优化

类型别名是Java类型设置一个短的名字,他只和XML配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

<!--配置别名,注意顺序-->
<typeAliases>
    <typeAlias type="com.kuang.pojo.User" alias="User"/>
</typeAliases>

当这样配置时,User可以用在任何使用com.zhizhi.pojo.User的地方。
也可以指定一个包名,Mybatis会在包名下搜索需要的Java Bean,

<typeAliases>
    <package name="com.kuang.pojo"/>
</typeAliases>

在每一个包com.zhizhi.pojo中的JavaBean,在没有注解·的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。

若有注解,则别名为其注解值。

@Alias("user")
public class User {
    ...
}

其他配置浏览

设置

设置(settings)相关=》查看帮助文档
懒加载
日志实现
缓存开启关闭
一个配置完整的settings元素实例:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

类型处理器

无论时Mybatis在预处理语句中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型。
可以重回类型处理器或者创建自己的类型处理器来处理不支持的非标准的类型

对象工厂

Mybatis每次创建结果对象的新实例时,他会使用一个对象工厂(ObjectFactory)实例来完成。
默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过有参构造方法来实例化。
如果像覆盖对象工厂的默认方法,则可以通过构造自己的对象工厂来实现。

生命周期和作用域(Scope)

理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。

Mybatis的执行过程:

开始----》SqlSessionFactoryBuilder—》SqlSessionFactory—》SqlSession–》SQL

Mapper–》结束
SqlSessionFactoryBuilder:通过xml文件或者配置文件生成SqlSessionFactory

作用域的理解

SqlSessionFactoryBuilder的作用在于创建SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder就是去作用了,所以它只能存在于创建SqlSessionFactory的方法中,而不要让其长期存在。因此SqlSessionFactoryBuilder实例的最佳作用域是方法作用域(也就是局部方法变量)
SqlSessionFactory可以被认为是一个数据库连接池。他的作用是创建SqlSession接口对象。因为Mybatis的本质就是Java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个Mybatis的应用中,所以一旦创建SqlSessionFactory,就要长期保存它,直至不再使用Mybatis应用。所以可以认为SqlSessionFactory的生命周期就等同于Mybatis的应用周期。
由于SqlSessionFactory是一个对数据库的连接池,所以它占据着数据库的连接资源,如果创建多个SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也就会导致数据库连接资源被消耗,出现系统宕机等情况,所以尽量避免发生,
因此在一般的应用中,我i们希望SqlSessionFactory作为一个单例,让它再应用中被共享,所以说SqlSessionFactory的最佳作用域是应用作用域

如果说SqlSessionFactory相当于数据库连接池,那么SqlSession就相当于一个数据库连接(Connection对象),可以再一个事务里执行多条SQL,然后通过它的commit、rollback等方法,提交或者回滚事务,所以它应该存活再一个业务请求中,处理玩整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory,否则数据库资源就会很快被消费完,系统就会瘫痪,所以用try 。。。 catch。。。finally。。语句来保证其正确关闭,
所以SqlSession的最佳的作用域是请求或者方法作用域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值