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

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

文章目录

  • MyBatis笔记(二)——配置(环境配置,类别名typeAlias,映射器mappers,属性 properties),生命周期和作用域,驼峰映射
      • 1.核心配置
      • 2.环境配置environments
      • 3.mappers映射器配置:zap:
      • 4.属性 properties:zap:
      • 5.类别名 typeAlias
      • 6.生命周期与作用域
        • SqlSessionFactoryBuilder
        • SqlSessionFactory
        • SqlSession
      • 拓展1 settings中设置开启驼峰命名映射

参考: 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等等…



<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://47.107.229.140:3306/MyBatis?useSSL=false&useUnicode=true&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>

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

configuration>

3.mappers映射器配置⚡️

上述片段中的 中的内容

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

或者写package


    
<mappers>
        
        
        
        <mapper resource="com/piao/dao/UserMapper.xml"/>
        
        
        <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标签

    
    <properties resource="db.properties">properties>

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



<configuration>

    
   <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="com/piao/dao/UserMapper.xml"/>
    mappers>


configuration>

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

5.类别名 typeAlias

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

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

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官网:

作用域(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

你可能感兴趣的:(#,MyBatis)