Mybatis_总结_01_用_XMl方式

一、Mybatis简介

  MyBatis 是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 可以使用XML 或注解进行配置和映射。Mybatis通过将参数映射到配置的SQL形成最终执行的SQL语句,最后将执行SQL的结果映射成Java对象返回。

  与其他的ORM(对象关系映射)框架不同,Mybatis并没有将Java对象与数据表进行关联,而是将java方法与SQL语句关联,是一种“半自动化”的ORM实现。(Hibernate是全自动化ORM)。Mybatis允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。

二、MyBatis的配置文件结构

MyBatis的配置文件包含了影响MyBatis行为的信息,文档的结构如下:


顶层configuration配置

  • properties 属性
  • settings 设置
  • typeAliases 类型命名
  • typeHandlers 类型处理器
  • objectFactory 对象工厂
  • plugins 插件
  • environments 环境

    • environment 环境变量

      • transactionManager 事务管理器
      • dataSource 数据源
  • databaseIdProvider 数据库厂商标识
  • mappers 映射器

三、properties属性

properties是一个配置属性的元素,让我们能在配置文件的上下文中使用它。

1.加载顺序

如果属性在不止一个地方进行了配置,那么MyBatis按照下面的顺序来加载:

1.在properties元素体内指定的属性首先被读取

2.然后根据properties元素中的resource属性读取类路径下属性文件或者根据url属性指定的路径读取属性文件,并覆盖已读取的同名模块

3.最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

因此优先级顺序:方法参数传递的属性  >  resource/url 属性中指定的配置文件 properties 属性中指定的属性

在MyBatis.xml的配置里面配置如下的属性

<dataSource type="pooled">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/springdatastudy?serverTimezone=UTC"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</dataSource>

2.properties配置文件

使用properties来配置属性,可以方便我们在多个配置文件重复使用,也可以随时修改及日后维护

(1)在resources文件夹下面创建datasource.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/springdatastudy?serverTimezone=UTC
username=root
password=root

(2)在MyBatis.xml配置文件的properties节点下引入properties文件

<properties resource="datasource.properties"/>

(3)其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值.

<!--数据源-->
<dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</dataSource>

3.程序参数传值

实际工作中,数据库的用户名及密码可能是加密后的字符串。所以在SqlSessionFactoryBuilder处,需要将加密的字符串进行解密。

/**
 * 模拟字符串解密
 *
 * @param str
 * @return
 */
public static String decode(String str) {
    return str;
}
public static void main(String[] args) throws IOException {
    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    Properties properties = new Properties();
    properties.load(Resources.getResourceAsStream("datasource.properties"));
    properties.setProperty("username",decode(properties.getProperty("username")));
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,properties);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    List<User> users = userDao.getUser();
    for (User u : users) {
        System.out.println(u.toString());
    }
}

四、settings设置

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。

一个配置完整的 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>

1.cacheEnabled

boolean属性,默认是true。该配置影响的所有映射器中配置的缓存的全局开关。

2.lazyLoadingEnabled

boolean属性,默认值是false。延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。

3.aggressiveLazyLoading

boolean属性,jar版本3.4.1以下是true。3.4.1以上是false。当启用时,任何方法的调用都会加载该对象的所有属性。不开启,按需加载。

4.multipleResultSetsEnabled

boolean属性,默认值是true。是否允许单一语句返回多结果集合。(需要兼容驱动)

5.useColumnLabel

 boolean属性,默认值为true。使用列标签代替列名。

6.useGeneratedKeys

 boolean属性,默认值为false。允许JDBC支持自动生成主键。如果设置为true,则这个设置强制使用自动生成主键。(需要驱动兼容)

7.autoMappingBehavior

 枚举属性,三个可选值:None(表示取消自动映射)、Partial(表示只会自动映射没有定义嵌套结果集映射的结果集)、Full(表示会自动映射任意复杂的结果集),默认值为:Partial。

8.autoMappingUnknownColumnBehavior

枚举属性,三个可选值:None(不做任何反应)、WARNING(输出提醒日志,org.apache.ibatis.session.AutoMappingUnknownColumnBehavior日志等级必须设置为Warn)、FAILING(映射失败,抛出SqlSessionException)。默认值为None。

8.defaultExecutorType

枚举属性,三个可选值:SIMPLE(普通执行器)、REUSE(会重用预处理语句(prepared statements))、BATCH(重用语句并执行批量更新)

9.defaultExecutorType

枚举属性,三个可选值:SIMPLE(普通执行器)、REUSE(会重用预处理语句(prepared statements))、BATCH(重用语句并执行批量更新)

10.defaultStatmentTimeOut

 任意正整数,默认值没有设置。设置超时时间,它决定驱动等待数据库响应的秒数。

11.defaultFetchSize

任意正整数,默认值没有设置。为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖

12.safeRowBoundsEnabled

boolean属性,默认值为false。允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false。

13.safeResultHandlerEnabled

boolean属性,默认值为true。允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为false。

14.mapUnderscoreToCamelCase

boolean属性,默认为false。是否开启自动驼峰命名规则(camelcase)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。

15.localCacheScope

枚举属性,两个枚举属性:SESSION(会缓存一个会话中执行的所有查询)、STATEMENT(本地会话仅用在语句执行上,对相同SqlSession的不同调用将不会共享数据。)。默认值为SESSION。

16.jdbcTypeForNull

JDBCType属性,常用的属性有:Null、Varchar、Other。当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。

17.lazyLoadTriggerMethods

指定哪个对象的方法触发一次延迟加载。

18.defaultScriptingLanguage

指定动态SQL生成的默认语言。

19.defaultEnumTypeHandler

Specifies the TypeHandler used by default for Enum. (Since: 3.4.5)

20. callSettersOnNulls

boolean属性,默认值为false。。指定当结果集中值为null的时候是否调用映射对象的 setter(map 对象时为put)方法,这对于有Map.keySet()依赖或null值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。

21.returnInstanceForEmptyRow

boolean属性,默认值为false。当返回行的所有列都是空时,MyBatis默认返回null。

22.logPrefix

String类型,指定 MyBatis 增加到日志名称的前缀。

23.logImpl

枚举值,指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

24.proxyFactory

枚举值,指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。CGLIB | JAVASSIST。默认值:JAVASSIST (MyBatis 3.3 or above)

25.vfsImpl

指定VFS的实现。自定义VFS的实现的类全限定名,以逗号分隔。

26.useActualParamName

boolean属性,默认值为true。允许使用方法签名中的名称作为语句参数名称。为了使用该特性,你的工程必须采用Java8编译,并且加上-parameters选项。(从3.4.1开始)

27.configurationFactory

指定一个提供Configuration实例的类.这个被返回的Configuration实例是用来加载被反序列化对象的懒加载属性值. 这个类必须包含一个签名方法static Configuration getConfiguration(). (从 3.2.3 版本开始)

六、参考资料

1.MyBatis XML配置-w3cschool

2.深入MyBatis配置文件

3.详解MyBatis的配置文件

猜你喜欢

转载自www.cnblogs.com/shirui/p/9575956.html