MyBatis 之三:配置文件详解和 Mapper 接口方式

配置文件

MyBatis 的配置文件是 XML 格式的,它定义了 MyBatis 运行时的核心行为和设置。默认的配置文件名称为 mybatis-config.xml,该文件用于配置数据库连接、事务管理器、数据源、类型别名、映射器(mapper 文件)以及其他全局属性。

以下是一些主要配置元素的概览:

  1. <configuration>作为整个配置文件的根元素,所有其他配置项都包含在其中。
  2. <properties>用于加载外部属性文件,这些属性可以在配置文件中其他地方通过 ${property} 引用。
  3. <settings>设置 MyBatis 的全局配置参数,如自动映射模式、延迟加载策略、日志工厂等。
  4. <typeAliases> 或 <typeHandlers>定义类型别名或类型处理器,简化类型在 SQL 映射文件中的表示以及自定义类型的处理方式。
  5. <plugins>注册 MyBatis 插件,例如拦截器以实现自定义的行为扩展。
  6. <environments>配置环境,通常包括多个环境,每个环境有一个唯一的 ID,并且可以指定一个默认的环境。 每个环境内包含 <transactionManager> 和 <dataSource> 元素,分别定义事务管理器和数据源配置。
  7. <transactionManager>可配置 JDBC、MANAGED 等事务管理器类型,控制事务边界。
  8. <dataSource>数据源配置,可配置 UNPOOLED、POOLED、JNDI 等不同类型的数据源,用于连接数据库。
  9. <mappers>注册映射器接口或者 XML 映射文件,可以通过类路径或者绝对路径引用 mapper 接口或者 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>
    <properties resource="db.properties"/>

    <settings>
        <!-- ... -->
    </settings>

    <typeAliases>
        <!-- ... -->
    </typeAliases>

    <typeHandlers>
        <!-- ... -->
    </typeHandlers>

    <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/example/mapper/UserMapper.xml"/>
        <mapper class="com.example.mapper.UserMapper"/>
        <!-- ... -->
    </mappers>
</configuration>
properties

可以通过此标记中的属性引用外部的属性配置文件,键值对的属性资源文件

引用之前,先要新建 db.properties 文件,并编辑好内容

新建 db.properties 文件

username=root
password=zhangroot
url=jdbc:mysql://127.0.0.1:3306/homework
driver=com.mysql.cj.jdbc.Driver

在配置文件中使用:

<!--导入资源文件-->
<properties resource="db.properties">
    <!--用作默认值,如果属性文件中获取不到对应属性时,这里才会起作用,优先级低于属性文件夹的-->
    <property name="password" value="zhangroot"/>
</properties>

注意:

在配置文件中的属性设置

优先级低于属性资源配置文件,所以我们一般把在配置文件中的属性设置用作默认值。

使用属性文件中的配置信息方式${}

<environment id="devA">
    <transactionManager type="JDBC"></transactionManager>
    <dataSource type="POOLED">
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <property name="url" value="${url}"/>
        <property name="driver" value="${driver}"/>
    </dataSource>
</environment>
transactionManager

在配置文件

事务管理器(transactionManager)

在MyBatis中,事务管理器(Transaction Manager)的类型有两种( type="[JDBC|MANAGED]"):

  1. JDBC

    当事务管理器类型设置为JDBC时,MyBatis会使用Java JDBC API直接管理事务。这意味着它会从数据源获取数据库连接,并利用该连接对象来执行事务的开启、提交或回滚操作。在处理完SQL操作后,MyBatis会根据需要自行关闭连接或返回给连接池。

  2. MANAGED

    当配置为MANAGED时,MyBatis则不会自己管理事务,而是将事务控制权交给外部容器(如Spring框架或者Java EE应用服务器如JBoss、WebLogic等)。这种情况下,容器负责启动、提交或回滚事务。通常在企业级应用程序中,容器提供了全局事务管理的能力,可以跨多个资源进行事务协调。

数据源(dataSource)

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

  • 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。

有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]")

  1. UNPOOLED (非池化数据源):
    • UNPOOLED 类型的数据源每次请求数据库连接时都会创建一个新的连接实例。
    • 这种方式简单、轻量级,但不适合高并发场景,因为频繁创建和关闭数据库连接会消耗大量资源,并可能导致性能问题。
  2. POOLED (池化数据源):
    • POOLED 数据源是基于连接池实现的,它会预先创建一定数量的数据库连接并保持空闲状态,当应用程序需要使用数据库时,从池中取出一个连接,用完后归还给池而不是直接关闭。
    • 连接池技术可以有效提高系统的性能和稳定性,因为它能够重用已存在的数据库连接,减少创建和销毁连接带来的开销。
  3. JNDI (Java Naming and Directory Interface,Java命名和目录接口):
    • JNDI 数据源并不是 MyBatis 内部实现的连接池,而是通过JNDI查找机制来获取外部容器(如Tomcat、JBoss等应用服务器)管理的数据源。
    • 在企业级应用中,通常由应用服务器或容器统一管理数据库连接池,开发人员通过JNDI名称来引用这个已经配置好的数据源。
    • 使用 JNDI 数据源的优势在于它可以与容器整合,便于管理和配置,并且有助于应用服务器层面的资源隔离和优化。

properties

在MyBatis的配置文件中,<dataSource>元素是用来配置数据源的,用于定义如何连接数据库。

<dataSource> 内部可以使用多个 <property> 子元素来设置具体的属性值,以便正确初始化和配置数据源。

例如,对于一个基于 MyBatis 的POOLED 数据源配置,可能会包含以下 <property> 标签:

<dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
    <property name="username" value="myuser"/>
    <property name="password" value="mypassword"/>

    <!-- 其他可能的属性 -->
    <property name="poolSize" value="10"/>
    <property name="maxIdle" value="8"/>
    <property name="minIdle" value="2"/>
</dataSource>

上述配置中,每个 <property> 标签都指定了数据源的一个具体属性,如数据库驱动类名、数据库URL、用户名和密码等。不同的数据源类型(UNPOOLED、POOLED 或 JNDI)可能需要不同的属性配置。如果遇到错误"元素类型为 "dataSource" 的内容必须匹配 "(property)*"",则意味着 <dataSource> 中的内容结构不正确,应当只包含零个或多个 <property> 子元素。

8. Mapper 接口方式

在多层架构开发中,我们常常按功能划分为控制层、业务层、DAO层

在 DAO 层设计中,一般都会设计接口来访问数据库

在MyBatis框架中,Mapper接口方式是一种基于接口编程的映射方式,它允许开发者通过定义一个Java接口来声明SQL操作,而无需编写XML配置文件。MyBatis会自动为这些接口生成代理对象,并处理方法调用到SQL执行的映射关系。

第一步:定义接口

IEmpDao接口

package com.wdzl.dao;

import com.wdzl.pojo.Emp;

import java.util.List;

/**
 * 接口----特殊抽象类--高度抽象类--接口
 * 抽象---复杂问题简单化---忽略具体的实现细节
 * 接口---定义规范
 *
 *
 */
public interface IEmpDao {
    void save(Emp emp);

    void delete(Emp emp);

    void update(Emp emp);

    Emp get(Integer empno);

    List<Emp> queryAll();
}
第二步:编写映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!---->
<!--1.要求: 命名空间必须和dao接口保持一致。取值 只能是接口完整类名
  因为可以把这里的映射文件理解成 DAO接口的实现类
-->
<mapper namespace="com.wdzl.dao.IEmpDao">

    <!--就是IEmpDao 接口中的get方法的实现-->
    <select id="get" resultType="emp">
        select empno,ename,sal,hiredate from emp where empno=#{empno}
    </select>

    <select id="queryAll" resultType="emp">
        select empno,ename,sal,hiredate from emp
    </select>

</mapper>

注意:

  • namespace 命名空间取值,必须是接口的完整限定名(全类名)
  • 编写SQL的标记元素id取值必须和接口中要实现的方法名保持一致
  • 标记元素 id 的实现不需要和接口全部一致,
    • 比如:可以实现部分抽象方法,可以额外增加其他名字的sql 标记
第三步:编写代码

通过 sqlSession.getMapper() 方式获取对应接口的代理对象

/**
 * Mapper 代理接口方式实现
 */
public class EmpService {
    public static void main(String[] args) {
//        IEmpDao dao = new EmpDaoImpl();

        //SqlSession
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        // 动态代理  动态根据接口实现生成对应的实现类的代理对象
        IEmpDao dao = sqlSession.getMapper(IEmpDao.class);

        Emp emp = dao.get(1);

        dao.queryAll().forEach(System.out::println);
        System.out.println(emp);
    }
}
相关推荐
drebander1 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
乌啼霜满天2495 分钟前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn10 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟11 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy21 分钟前
高级编程之结构化代码
java·spring boot·spring cloud
弗锐土豆27 分钟前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部
Elaine20239128 分钟前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
小小大侠客1 小时前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext
一二小选手1 小时前
【MyBatis】全局配置文件—mybatis.xml 创建xml模板
xml·java·mybatis
码老白1 小时前
【老白学 Java】Warshipv2.0(二)
java·网络