ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【测试开发】知识点-mybatis,全局配置文件介绍

2021-11-17 22:34:49  阅读:111  来源: 互联网

标签:知识点 配置文件 数据库 别名 sql mybatis id


MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

具体学习可以结合官方文档:https://mybatis.org/mybatis-3/zh/configuration.html

一、属性(properties)

mybatis 可以通过 properties 标签来引入外部 properties 配置文件里的内容。

最常见的就是引入外部配置文件里的数据库连接信息,在之前的 mybatis 配置文件里是写死的,现在来引入我们项目配置文件application.properties里的数据库信息.

那么 mybatis 配置文件现在可以这么写:

<?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>
    <properties resource="application.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${spring.datasource.driver-class-name}"/>
                <property name="url" value="${spring.datasource.url}"/>
                <property name="username" value="${spring.datasource.username}"/>
                <property name="password" value="${spring.datasource.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

在标签<<properties>中:

  • 如果使用resource:读取类路径下属性文件
  • 如果使用url:指定的路径读取属性文件,并覆盖之前读取过的同名属性

引入配置文件application.properties之后就可以使用${}来使用配置文件里的属性名了。

二、设置(settings)

这是 MyBatis 中极为重要的设置,会改变 MyBatis 运行时的行为。文档里的设置项很多,可以逐个看下混个脸熟,以后使用到的时候知道哪里找。

比如mapUnderscoreToCamelCase,作用是: 是否开启驼峰命名自动映射,即从经典数据库列名A_COLUMN映射到经典 Java 属性名aColumn

举个栗子:

数据库字段:user_name,开启配置后,就可以映射 java 属性名 userName

配置文件这样写:

...
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
...

三、类型别名(typeAliases)

1. 单个起别名

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,方便引用的时候使用。

比如在 xml 文件UserMapper.xml中:

<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
    <select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User">
      select * from user where id = #{id}
    </select>
</mapper>

返回类型resultTypecom.pingguo.bloomtest.pojo.User,全类名有点长,给它起个别名。

回到全局配置文件mybatis-config.xml中:

    <typeAliases>
        <typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />
    </typeAliases>
  • type: 写上全类名
  • alias: 不写的话默认是类名小写

然后引用的时候就可以使用别名:

<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
    <select id="getUserById" resultType="user">
      select * from user where id = #{id}
    </select>
</mapper>

2. 批量起别名

标签<typeAlias>一次只可以给一个类型起别名,如果要起别名的很多,可以进行批量处理。

使用package标签:

    <typeAliases>
        <!--<typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />-->
        <package name="com.pingguo.bloomtest.pojo" />
    </typeAliases>
  • name:指定包名,为这个包以及下面的所有后代包的每一个类都起一个默认别名(类名小写)

如果引用的时候resultType="User"我换成大写开头,运行也是OK的,别名不区分大小写

3. @Alias 给类指定别名

假如com.pingguo.bloomtest.pojo包下还有一个子包,而这个子包下面也有一个类叫User,这时候就是别名冲突了,mybatis 运行报错。

可以使用@Alias给类指定别名:

@Alias("User2")
public class User {
    @TableId(type = IdType.ID_WORKER)
    private Long id;

    private String username;
    private String password;
...

4. 内置别名

mybatis 有为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,采取了特殊的命名风格。

我们自定义别名的时候不要与内置的重复。

不过不用别名,就用全类名也有好处。比如在用 idea编辑器,可以直接按住ctrl+左击 类名跳过去,很方便。

四、类型处理器(typeHandlers)

类型处理器的作用,简单来说就是架起了java 类型和数据库类型一一映射的桥梁。

比如 java 对象中的 String 类型的变量,保存到数据库兼容的 varchar 或者 char。

image.png

这部分就先混个脸熟先,后续涉及到对应知识点再进一步学习。

五、插件(plugins)

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed),执行器,常见的增删改查
  • ParameterHandler (getParameterObject, setParameters),参数处理,sql语句预编译设置参数
  • ResultSetHandler (handleResultSets, handleOutputParameters),结果集处理,查询到结果后拿到结果集并封装成Javabean对象
  • StatementHandler (prepare, parameterize, batch, update, query),sql语句处理器

这4个对象里有很多各自的方法(括号里),通过插件可以在方法执行之前做一些自定义的处理,来改变一些默认行为。

这里同样混脸熟,后续学习了mybatis 运行机制和原理的时候,再进一步学习。

六、环境配置(environments)

MyBatis 可以配置多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。

在之前已经用过这个标签<environments>:

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${spring.datasource.driver-class-name}"/>
            <property name="url" value="${spring.datasource.url}"/>
            <property name="username" value="${spring.datasource.username}"/>
            <property name="password" value="${spring.datasource.password}"/>
        </dataSource>
    </environment>
</environments>

其中<environment>可以配置一个具体的环境信息,id代表当前环境的唯一标识,可以通过default动态的指定当前我要使用的环境。

另外,里面还有2个不可或缺的标签:transactionManagerdataSource

transactionManager

transactionManager 事务管理器,type是管理器的类型。

在 MyBatis 中有两种类型的事务管理器:

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。

如果我们使用Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

dataSource

dataSource数据源,type是数据源的类型。有三种内建的数据源类型:

  • UNPOOLED: 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。 性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形
  • POOLED: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
  • JNDI: 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。

七、数据库厂商标识(databaseIdProvider)

MyBatis 可以根据不同的数据库厂商执行不同的语句,databaseIdProvider这个标签其实就是 mybatis 在一致性方面的作为。

你只需要告诉 mybatis 你写的 sql 是属于哪个数据库厂商下的,那么它就可以动态的根据数据库厂商标识,来发送不同的sql语句。

<databaseIdProvider type="DB_VENDOR">
  <property name="MySQL" value="mysql"/>
  <property name="DB2" value="db2"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

这个DB_VENDOR,作用就是得到数据库厂商的标识(驱动自带获取厂商标识的方法)。

name设置不同的数据库标识,value可以设置别名。

最后,需要在 sql映射文件里告诉mybatis 这条 sql 是又哪个厂商去执行:

<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
    <select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User" databaseId="mysql">
      select * from user where id = #{id}
    </select>
</mapper>

这里databaseId里的值就是上面配置的别名。

八、映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。

mappers标签就是将 sql 映射注册到全局配置文件中去,比如之前写的:

<mappers>
    <mapper resource="UserMapper.xml"/>
</mappers>

每个<mapper>注册一个 sql映射,其中又会涉及到如下几个属性:

resource

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

url

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

class

上面2个是注册配置文件的,而这个是用来注册接口的,里面写接口全类名

<!-- 使用映射器接口实现类的全类名 -->
<mappers>
  <mapper class="com.pingguo.bloomtest.dao.UserMapper"/>
</mappers>

但是要注意:sql映射文件必须和接口同名,并且放在同一目录下。

另外,注册接口的情况下,也是可以不写 sql 映射文件的,所有的sql都利用注解写在接口上。

public interface UserMapper {

    @Select("select * from user where id = #{id}")
    User getUserById(Integer id);
}

感觉写注解很方便啊?可以mybatis好不容易让sql与代码分离这不又回去了?

没关系,混合用就好了。可以把比较重要的、复杂的用来写 sql映射文件,简单的可以写注解里,方便快速开发。

批量注册
上面是单个的注册,现在同样也可以批量进行注册:

<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

name写包名。

标签:知识点,配置文件,数据库,别名,sql,mybatis,id
来源: https://www.cnblogs.com/pingguo-softwaretesting/p/15559152.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有