xml配置文件解析

1. xml配置属性解析

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/wu/dao/UserMapper.xml"/>
    </mappers>
</configuration>

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

其设置顺序必须是(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

1.1 属性(properties)

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。

典型的 Java 属性文件 — 在resource目录下创建的db.properties文件配置属性

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false

properties 标签要写在最上方,设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。 driver 和 url 属性将会由db.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。

当db.properties文件中和properties 元素中设置的相应值发生了冲突时(比如两者都设置了密码值),优先配置db.properties文件中数值。

<properties resource="db.properties">
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
</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>

1.2 环境配置(environments)

MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory 实例只能选择一种环境。

由设置每个environment的id来选择使用哪个环境
注:是value="${ } 与 userMapper.xml中的 name = #{name} 区别开

 <environments default="test">
        <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>
        
        <environment id="test">
            <transactionManager type="JDBC"></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>
1.2.1 事务管理器(transactionManager)

默认是JDBC。

在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED –这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false来阻止默认的关闭行为。
提示:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

1.2.2 数据源(dataSource)

默认值是POOLED。

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。
有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]")
相当于数据库连接池。

1.3 映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。

方法一:使用资源路径绑定

    <mappers>
        <mapper resource="com/wu/dao/UserMapper.xml"/>
    </mappers>

注:这里路径是由 / 连接的而不是由 . 连接

方法二:使用包扫描绑定

<package name="com.wu.dao"/>

注:接口和他的Mapper配置文件必须同名且在同一个包下

方法三:用class文件绑定

<mapper class="com.wu.dao.userMapper"/>

注:接口和他的Mapper配置文件必须同名且在同一个包下

1.4 类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

  1. 当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。
    <typeAliases>
        <typeAlias alias="User" type="com.wu.pojo.User"/>
    </typeAliases>
  1. 也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
    <typeAliases>
        <package name="com.wu.pojo"/>
    </typeAliases>

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。通过注解,别名就可以是任意值。

@Alias("lalala")
public class User {
    private int id;

注:基本类型的别名要在前面加上_,比如int的别名是 _int,而Integer的别名才是int,其他类型是将大写字母换成小写字母。

1.5 设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 (了解)
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType
属性来覆盖该项的开关状态。 true | false false
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java
属性名 aColumn。 true | false False ogImpl 指定 MyBatis
所用日志的具体实现,未指定时将自动查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING |
COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 未设置

1.5.1 日志设置

logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。

SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

  1. STDOUT_LOGGING是常规配置。
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

在这里插入图片描述
可以看出这本身就是JDBC的操作,MyBatis将其进行了封装。

  1. LOG4J

Log4j是Apache的一个开源项目。
我们可以控制日志信息输送的目的地。
我们也可以控制每一条日志的输出格式。
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

配置:
第一步:导入maven依赖

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

第二步:编写LOG4J配置文件 log4j.properties

  1. log4j.rootLogger=DEBUG,console,file:此句为将等级为DEBUG的日志信息输出到console(控制台)和file(自动创建的文件)这两个目的地中。
    等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
  2. log4j.appender.console = org.apache.log4j.ConsoleAppender:此句为定义名为console的输出端是哪种类型:org.apache.log4j.ConsoleAppender(控制台)
    layout:console的输出端的layout是PatternLayout(可以灵活地指定布局模式)
    layout.ConversionPattern:如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern:%c 输出所属的类目,通常就是所在类的全名;%m 输出代码中指定的消息;%n 输出一个回车换行符;
  3. log4j.appender.file.File=./log/wu.log:设置创建一个log / wu.log文件存放日志信息。
log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%c】-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/wu.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%p】【%d{yy-MM-dd}】【%c】%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

第三步:配置setting

    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

第四步:测试
在这里插入图片描述

    static Logger logger = Logger.getLogger(userMapper.class);

    @Test
    public void test() {
        logger.debug("DEBUG userMappertest");
        logger.info("INFO userMappertest");
        logger.error("ERROR userMappertest");
    }

在这里插入图片描述
wu.log日志文件内的信息:
在这里插入图片描述

注:

  1. 写配置的时候大小写不能错,空格不能有,否则会报错。
  2. 程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。如果定义了INFO级别,则优先级高于等于INFO级别(如:INFO、WARN、 ERROR)的日志信息将可以被输出,小于该级别的如DEBUG将不会被输出。

2.作用域(Scope)和生命周期

SqlSessionFactoryBuilder:

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
作用:生成SqlSessionFactory,用完就可以释放。

SqlSessionFactory:

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。并且用完后必须关闭。

SqlSessionFactory相当于一个数据连接池,而SqlSession就是连接池中的连接,Mapper就是对应的事务的sql。SqlSession一定要记得关闭,释放资源。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值