MyBatis笔记(二)——配置(环境配置,别名优化,mapper映射器,属性 properties),生命周期和作用域

MyBatis笔记(二)——配置(环境配置,类别名typeAlias,映射器mappers,属性 properties),生命周期和作用域,驼峰映射


参考: https://www.bilibili.com/video/BV1NE411Q7Nx

视频原作者CSDN: https://blog.csdn.net/qq_33369905

这篇是自己整理了一下,以便自己复习。

1.核心配置

配置文件MyBatis-config.xml,可配置内容如下:

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->

2.环境配置environments

  • 开发环境environments 设置多个environment:开发环境,测试环境,生产环境
  • transactionManager事务管理器 JDBC(默认)或者MANAGED
  • datasource数据源 UNPOOLED POOLED(默认) JNDI

数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等…

<?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>
    <!--    1.开发环境environments   <environments default="development">  还可设置测试环境,生产环境
     default指定默认的环境 -->
    <environments default="development">
        <environment id="development">
            <!--     2.transactionManager事务管理器 JDBC(默认)或者MANAGED
                 JDBC 直接用jdbc的提交和回滚事务,依赖于从数据源得到的连接来管理 事务作用域
                 MANAGED(几乎没做什么配置,默认关闭连接)     (managed)     -->
            <transactionManager type="JDBC"/>

            <!--   3.数据源  UNPOOLED  POOLED(默认) JNDI
             UNPOOLED这个数据源的实现只是每次被请求时打开或者关闭连接,慢
             POOLED 利用“池”的概念将JDBC连接对象组织起来,避免创建新的连接实例时所需要初始化和认证的时间(更快速)
             JNDI目前用的很少
             -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://47.107.229.140:3306/MyBatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="23573"/>
            </dataSource>
        </environment>
        
                
        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="测试环境的数据库连接驱动driver (例如换成别的数据库:Oracle)"/>
                <property name="url" value="测试环境的数据库连接url"/>
                <property name="username" value="测试环境的数据库连接 用户名"/>
                <property name="password" value="测试环境的数据库连接 密码"/>
            </dataSource>
        </environment>
        
    </environments>

    <!--    每一个mapper都需要在配置文件中注册 mapper.xml  默认从resource-->
    <mappers>
        <!--   三种写法 类class 绝对地址url resource(一般用这个) -->
        <!-- 举例-->
        <mapper resource="com/piao/dao/UserMapper.xml"/>
    </mappers>

</configuration>

3.mappers映射器配置⚡️

上述片段中的 中的内容

三种写法 类class 绝对地址url resource相对于类路径的资源引用(一般用这个)

或者写package


    <!--   在配置文件注册各个mapper.xml -->
<mappers>
        <!--   三种写法 类class 绝对地址url resource相对于类路径的资源引用(一般用这个) -->
        
        <!-- resource相对于类路径的资源引用-->
        <mapper resource="com/piao/dao/UserMapper.xml"/>
        
        <!-- 完全限定资源定位符(URL)
         路径对应的是网络上了某个文件,注意file:// 前缀 +路径+文件名-->
        <mapper url="file:///var/mappers/BlogMapper.xml"/>
        
        <!-- 使用映射器接口实现类的完全限定类名(包名+类名)
          需要配置文件名称和接口名称一致,并且位于同一目录下-->
        <mapper class="com.piao.dao.UserMapper"/>
        
        <!--  推荐使用一个包
        将包内的映射器接口实现全部注册为映射器
        但是需要配置文件名称和接口名称一致,并且位于同一目录下
        -->
        <package name="com.piao.dao"/>

</mappers>

4.属性 properties⚡️

使用properties改造MyBatis配置:

新建db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://ip:端口/数据库名?useSSL=true&useUnicode=true&characterEncoding=utf8
username=用户
password=密码

在核心配置文件MyBatis-config.xml中引入该文件db.properties

需要写在configuration标签的首部,因为该配置文件有规定的配置顺序:

配置文件规定的配置顺序:

The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”.

即先properties标签,然后settings,然后typeAliases,等等…最后是mappers标签

    <!--    引入自己的写的db.properties-->
    <properties resource="db.properties"></properties>

使用 ${ } 获取properties文件中的值

<?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>

    <!--    引入自己的写的db.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>

    <!--    每一个mapper都需要在配置文件中注册 mapper.xml  默认从resource-->
    <mappers>
        <!--   三种写法 类class 绝对地址url resource(一般用这个) -->
        <mapper resource="com/piao/dao/UserMapper.xml"/>
    </mappers>


</configuration>

properties本身也可编写属性配置,但会优先选择resource属性指定的外部配置文件中的属性。

5.类别名 typeAlias

起个别名 这样xml中resultType可以使用别名如User代替全限定名 如com.piao.pojo.User
1.给实体类 起个别名

2.指定一个包中的类,在没有用注解@Alias指定的情况下,默认别名为类名首字母小写。

3。Java类中使用注解@Alias起别名

    <!--   起个别名 这样xml中resultType可以使用User代替com.piao.pojo.User
             1.给实体类  起个别名 
             <typeAlias type="com.piao.pojo.User" alias="User"/>
             2.指定一个包中的类,在没有用注解@Alias指定的情况下,默认别名为类名首字母小写。
             <package name="com.piao.pojo"/>
             3。Java类中使用注解@Alias起别名
                 -->
    <typeAliases>
        <typeAlias type="com.piao.pojo.User" alias="User"/>
        <package name="com.piao.pojo"/>
    </typeAliases>

Java

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

同样得遵守配置标签得顺序,typeAliases写在properties,settings之后

配置文件规定的配置顺序:

The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”.

还有一些其他得配置,具体可前往官方文档查看:

Mybatis官方中文文档(最好的MyBatis文档)⚡️ : http://www.mybatis.org/mybatis-3/zh/index.html

6.生命周期与作用域

Mybatis的执行过程 :主要是过程一

过程二是直接通过sqlsession去操作数据库,现已不推荐不用

以下两图 来源自百度

mybatis生命周期

sqlsession生命周期

以下摘自MyBatis官网:

作用域(Scope)和生命周期

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


提示 对象生命周期和依赖注入框架

依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。 如果对如何通过依赖注入框架使用 MyBatis 感兴趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 两个子项目。


SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:

拓展1 settings中设置开启驼峰命名映射

数据表的字段:

  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,

实体类的属性定义:

    private Date createTime;
    private Date updateTime;

由于有字段:

createTime <-> create_time

update_time <-> updateTime

开启驼峰命名 MyBatis-confg.xml中添加设置:

注意:settings需要写在properties之后

mybatis-config.xml中设置

<!--    开启驼峰命名-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--    开启日志在笔记三中会提到-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

更多settings设置可前往官方文档查看:https://mybatis.org/mybatis-3/zh/configuration.html#settings

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值