Java框架:Mybatis

news2024/11/19 0:39:20

文章目录

  • 一、Mybatis概述
    • 1.1概念
    • 1.2优点与缺点
    • 1.3MyBatis和Hibernate的区别
    • 1.4Mybatis的核心对象
    • 1.5Mybatis执行流程
  • 三、Mybatis的快速使用
    • 3.1开发环境
    • 3.2 创建一个maven项目
    • 3.3添加Maven依赖
    • 3.4MySQL创建user表
    • 3.5创建数据源database.properties文件
    • 3.6编写mybatis-config.xml配置文件
    • 3.7测试数据库连通性
    • 3.8创建User类
    • 3.9创建UserMapper接口
    • 3.10创建UserMapper.xml文件
    • 3.11添加扫描配置文件的路径
    • 3.12测试UserMapper接口
    • 3.13基于注解的开发
  • 四、Mybatis的全局配置文件解析
  • 五、 Mybatis的mapper(映射器)
    • 5.1映射器概念
    • 5.2Mybatis执行sql的两种方式
    • 5.3select标签
    • 5.4insert标签
    • 5.5update标签
    • 5.6delete标签
    • 5.7resultMap标签

一、Mybatis概述

1.1概念

MyBatis本是apache的一个开源项目iBatis , 2010年改名为MyBatis。

MyBatis是一个基于Java的半自动ORM框架 ,是 JDBC 和 Hibernate 的替代方案 。

MyBatis 支持普通 SQL查询,存储过程,高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性, 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索 。

iBATIS 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身,使用 XML 文件或注解的方式实现 SQL 的灵活配置 。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

  • ORM是什么?

Object Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的User类,去对应数据库中的一张user表,类中的属性和表中的列一一对应。User类就对应user表,一个User对象就对应user表中的一行数据。

1.2优点与缺点

优点:

  • MyBatis 是免费且开源的。
  • 与 JDBC 相比,减少了 50% 以上的代码量。
  • MyBatis 是最简单的持久化框架,小巧并且简单易学。
  • MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。
  • 提供 XML 标签,支持编写动态 SQL 语句。
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射。
  • 支持存储过程。MyBatis 以存储过程的形式封装 SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。

缺点:

  • 编写 SQL 语句工作量较大,对开发人员编写 SQL 语句的功底有一定要求。
  • SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

1.3MyBatis和Hibernate的区别

Hibernate 和 MyBatis 都是目前业界中主流的对象关系映射(ORM)框架,它们的主要区别如下。

1.sql 优化方面

  • Hibernate 使用 HQL(Hibernate Query Language)语句,独立于数据库。不需要编写大量的 SQL,就可以完全映射,但会多消耗性能,且开发人员不能自主的进行 SQL 性能优化。提供了日志、缓存、级联(级联比 MyBatis 强大)等特性。
  • MyBatis 需要手动编写 SQL,所以灵活多变。支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对较大。

2.开发方面

  • Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。

  • MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO 和 SQL 的映射关系。

3.缓存机制比较

  • Hibernate 的二级缓存配置在 SessionFactory 生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置缓存。
  • MyBatis 的二级缓存配置在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且 Mybatis 可以在命名空间中共享相同的缓存配置和实例,通过 Cache-ref 来实现。

4.应用场景

  • Hibernate 适合需求明确、业务固定的项目,例如 OA 项目、ERP 项目和 CRM 项目等。
  • MyBatis 适合需求多变的互联网项目,例如电商项目、金融类型、旅游类、售票类项目等。

1.4Mybatis的核心对象

MyBatis 有三个基本要素:

  • 核心接口和类

  • MyBatis核心配置文件(mybatis-config.xml)

  • SQL映射文件(mapper.xml)

    MyBatis 的核心接口和类,如下所示。
    在这里插入图片描述

每个 MyBatis 应用程序都以一个 SqlSessionFactory 对象的实例为核心。

首先获取 SqlSessionFactoryBuilder对象,可以根据 XML 配置文件或者 Configuration 类的实例构建该对象。

然后获取 SqlSessionFactory 对象,该对象实例可以通过 SqlSessionFactoryBuilder 对象来获取。

有了 SqlSessionFactory 对象之后,就可以进而获取 SqlSession实例。SqlSession 对象中完全包含以数据库为背景的所有执行 SQL 操作的方法,用该实例可以直接执行已映射的 SQL 语句。

SqlSessionFactoryBuilder :

SqlSessionFactoryBuilder 会根据配置信息或者代码生成 SqlSessionFactory,并且提供了多个 build() 方法重载,重要的就是这几个。

  • build(InputStream inputStream, String environment, Properties properties)
  • build(Reader reader, String environment, Properties properties)
  • build(Configuration config)

SqlSessionFactory:

SqlSessionFactory 是工厂接口而不是现实类,他的任务就是创建 SqlSession。 SqlSessionFactory 通过 openSession() 方法来获取 SqlSession 实例 。

SqlSessionFactory的生命周期和作用域: SqlSessionFactory 对象一旦创建,就会在整个应用程序过程中始终存在。 最佳作用域是 Application 。

SqlSession:

SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的 Connection。它提供了面向数据库执行 SQL 命令所需的所有方法,可以通过 SqlSession 实例直接运行已映射的 SQL 语句。

对象说明
Executor接口执行器.统一调度StatementHandler、PrepareStatement、ResultHandler对象执行对应的SQL
StatementHandler使用的数据库中的Statement执行操作 相当于字符串拼接
PrepareStatement使用SQL传参的方式处理
MappedStatement负责对SQL封装,用于存储需要映射的SQL语句及参数等信息
ResultHandler对最后的结果进行封装

SqlSession 的用途主要有两种:

  1. 获取映射器。让映射器通过命名空间和方法名称找到对应的 SQL,并发送给数据库,执行后返回结果。
  2. 直接通过 “命名空间(namespace)+SQL id” 的方式执行 SQL,不需要获取映射器。这是 iBatis 版本留下的方式。

SqlSession生命周期和作用域:SqlSession 对应一次数据库会话。 需要注意的是,每个线程都有自己的 SqlSession 实例,SqlSession 实例不能被共享,也不是线程安全的。因此 SqlSession 的作用域范围是 request 作用域或方法体作用域内。

1.5Mybatis执行流程

在这里插入图片描述

三、Mybatis的快速使用

3.1开发环境

  • JDK1.8
  • IDEA2020
  • Maven:apache-maven-3.6.3
  • MySQL:MySQL5.7

3.2 创建一个maven项目

创建 MyBatis 程序的步骤为:下载jar包 -> 部署jar包 -> 编写MyBatis核心配置文件 -> 创建实体类 -> 创建DAO接口 -> 创建SQL映射文件 -> 编写测试类

3.3添加Maven依赖

添加mybatis依赖、junit依赖、lombok依赖、和配置xml和properties会打包进jar包里。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.shenxm</groupId>
    <artifactId>mybatis-demo</artifactId>
    <version>1.0.0</version>

<dependencies>
<!--      mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.11</version>
    </dependency>
<!--    mysql连接-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.10</version>
    </dependency>
<!--        lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
        <scope>compile</scope>
    </dependency>
    <!--解决冲突问题-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>1.7.2</version>
    </dependency>
<!--     junit   test-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-core</artifactId>
        <version>1.3</version>
    </dependency>
</dependencies>
             
<!--    配置idea扫描xml或者properties文件 -->
    <build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
    </build>
</project>

3.4MySQL创建user表

连接Mysql,创建数据库test,并且创建user表和导入数据:

-- 创建user表
DROP TABLE IF EXISTS USER;

CREATE TABLE USER
(
	id BIGINT(20) NOT NULL AUTO_INCREMENT  COMMENT '主键ID',
	NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ;
-- 真实开发中,version(乐观锁)、deleted(逻辑删除)、create_time(创建时间)、update_time(修改时间)

-- 数据导入
INSERT INTO USER (id, NAME, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

3.5创建数据源database.properties文件

在 src\main\resources 目录下 创建 database.properties文件:用于mybatis配置文件读取数据库信息

#mysql数据库:MySQL5.7
driver=com.mysql.jdbc.Driver
url= jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username=root
password=123456

3.6编写mybatis-config.xml配置文件

在 src\main\resources\mybatis 目录下 创建 mybatis-config.xml配置文件: 用于配置数据库连接和 MyBatis 运行时所需的各种特性,包含了设置和影响 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">
<!-- mybatis的主配置文件 -->
<configuration>
    <!-- 引入 database.properties 配置文件-->
    <properties resource="database.properties"/>

    <!-- 配置环境:有助于将 SQL 映射应用于多种数据库之中 -->
    <environments default="mysql">
        <!-- 配置mysql的环境id-->
        <environment id="mysql">
            <!-- 配置事务的类型:用了 JDBC 的提交和回滚设施-->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源(连接池)type="POOLED -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

<!--     指定映射配置文件的位置 -->
<!--    <mappers>-->
<!--        1.单独加载某个映射配置文件 -->
<!--        <mapper resource="com/shenxm/mybatisdemo/mapper/UserMapper"/>-->
<!--     2.加载某包所有的配置文件  -->
<!--        <package name="com.shenxm.mybatisdemo.mapper"/>-->
<!--    </mappers>-->
</configuration>

3.7测试数据库连通性

在 src\test\java 目录下的 com.shenxm.mybatisdemo包 创建 DemoTest测试类:用输入流读取配置文件,然后根据配置文件信息构建sqlSessionFactory对象,通过sqlSessionFactory对象创建sqlSession对象,并使用sqlSession对象的方法执行数据操作。

package com.shenxm.mybatisdemo;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.Reader;

/**
 * @Author: shen
 * @CreateTime: 2022-01-05  21:51
 * @Description: 测试类
 * @Version 1.0
 */
public class DemoTest {
     @Test
    public void testConetion() throws IOException {
        // 核心配置文件classpath路径
        String resource = "mybatis/mybatis-config.xml";
        // 加载配置文件
        Reader config = Resources.getResourceAsReader(resource);
        //InputStream config = Resources.getResourceAsStream(resource);
        // 构建会话工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
        // 从SqlSessionFactory对象中获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        System.out.println(sqlSession.getConnection());
        // 归还连接给数据源
        sqlSession.close();
    }
}

3.8创建User类

在src\main\java目录下 的 com.shenxm.mybatisdemo.po包创建User类:用于跟数据库字段做映射。

package com.shenxm.mybatisdemo.po;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author: shen
 * @CreateTime: 2022-01-05  21:31
 * @Description: 用户类
 * @Version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    //常见的数据库中主键自动设置方法有(uuid、自增id、雪花算法、redis生成、zookeeper生成)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

3.9创建UserMapper接口

在src\main\java目录下 的com.shenxm.mybatisdemo.mapper包创建UserMapper接口:

package com.shenxm.mybatisdemo.mapper;

import com.shenxm.mybatisdemo.po.User;
import java.util.List;

/**
 * @Author: shen
 * @CreateTime: 2022-01-05  21:48
 * @Description: UserMapper
 * @Version 1.0
 */
public interface UserMapper {
    List<User> selectAll();
}

3.10创建UserMapper.xml文件

在src\main\java 目录下 的com.shenxm.mybatisdemo.mapper包创建UserMapper.xml:

或者

在src\main\resources 目录下 的com.shenxm.mybatisdemo.mapper包创建UserMapper.xml:

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

<mapper namespace="com.shenxm.mybatisdemo.mapper.UserMapper">
    <select id="selectAll" resultType="com.shenxm.mybatisdemo.po.User">
        SELECT * FROM user;
    </select>
</mapper>

注意:

1.mapper接口和mapper.xml之间需要遵循一定规则,才能成功的让mybatis将mapper接口和mapper.xml绑定起来

  • mapper接口的全限定名,要和mapper.xml的namespace属性一致
  • mapper接口中的方法名要和mapper.xml中的SQL标签的id一致
  • mapper接口中的方法入参类型,要和mapper.xml中SQL语句的入参类型一致
  • mapper接口中的方法出参类型,要和mapper.xml中SQL语句的返回值类型一致

2.<select> 标签表明这是一条查询语句,属性 id 用来标识这条 SQL。resultType 表示返回的是一个 User 类型的值。

3.11添加扫描配置文件的路径

mybatis-config.xml文件中添加:

若没有添加扫描,mapper.xml位置,则会报错。

<!--     指定映射配置文件的位置 -->
    <mappers>
<!--        1.单独加载某个映射配置文件 -->
<!--        <mapper resource="com\shenxm\mybatisdemo\mapper\UserMapper.xml"/>-->
<!--     2.加载某包所有的配置文件  -->
        <package name="com.shenxm.mybatisdemo.mapper"/>
    </mappers>

完整的mybatis-config.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">
<!-- mybatis的主配置文件 -->
<configuration>
    <!-- 引入 database.properties 配置文件-->
    <properties resource="database.properties"/>

    <!-- 配置环境:有助于将 SQL 映射应用于多种数据库之中 -->
    <environments default="mysql">
        <!-- 配置mysql的环境id-->
        <environment id="mysql">
            <!-- 配置事务的类型:用了 JDBC 的提交和回滚设施-->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源(连接池)type="POOLED -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

<!--     指定映射配置文件的位置 -->
    <mappers>
<!--        1.单独加载某个映射配置文件 -->
<!--        <mapper resource="com\shenxm\mybatisdemo\mapper\UserMapper.xml"/>-->
<!--     2.加载某包所有的配置文件  -->
        <package name="com.shenxm.mybatisdemo.mapper"/>
    </mappers>
</configuration>

3.12测试UserMapper接口

在 src\test\java 目录下的 com.shenxm.mybatisdemo包中 DemoTest测试类添加测试方法:

@Test
    public void testMapper() {
        // 核心配置文件classpath路径
        String resource = "mybatis/mybatis-config.xml";

        Reader config = null;
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession sqlSession = null;
        List<User> users = null;
        try {
            // 1.加载配置文件
            // 第一种: Resources.getResourceAsReader(resource);
            config = Resources.getResourceAsReader(resource);
            // 第二种:InputStream config = Resources.getResourceAsStream(resource);
            // 2.构建会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
            // 3.打开SqlSession连接
            sqlSession = sqlSessionFactory.openSession();
            // 4.获取该接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 5.执行接口中的方法
            users = mapper.selectAll();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 6.释放SqlSession资源
            sqlSession.close();
        }
        // 遍历集合
        users.forEach(System.out::println);
    }
/** 输出结果:
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
*/

3.13基于注解的开发

基于注解的开发,可以不写UserMapper.xml,只需要将sql写到代码里,但是后续的维护和扩展性不是很好。

这里将UserMapper接口改成:

package com.shenxm.mybatisdemo.mapper;

import com.shenxm.mybatisdemo.po.User;
import java.util.List;

/**
 * @Author: shen
 * @CreateTime: 2022-01-05  21:48
 * @Description: UserMapper
 * @Version 1.0
 */
public interface UserMapper {
    @Select("SELECT * FROM user")
    List<User> selectAll();
}

四、Mybatis的全局配置文件解析

全局配置文件中,各个标签要按照如下顺序进行配置:

<configuration>
	<!-- 配置顺序如下
     properties  

     settings

     typeAliases

     typeHandlers

     objectFactory

     plugins

     environments
        environment
            transactionManager
            dataSource

     mappers
     -->
</configuration>

各个子标签说明如下 :

  • <properties>

一般将数据源的信息单独放在一个properties文件中,然后用这个标签引入,在下面environment标签中,就可以用${}占位符快速获取数据源的信息 。

<properties resource="database.properties"/>
  • <settings>

用来开启或关闭mybatis的一些特性,比如可以用<setting name="lazyLoadingEnabled" value="true"/>来开启延迟加载,可以用<settings name="cacheEnabled" value="true"/>来开启二级缓存

配置项作用配置选项默认值
cacheEnabled该配置影响所有映射器中配置缓存的全局开关true|falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态true|falsefalse
aggressiveLazyLoading当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载true|false版本3.4.1 (不包含) 之前默认值为 true,之后为 false
multipleResultSetsEnabled是否允许单一语句返回多结果集(需要兼容驱动)true|falsetrue
useColumnLabel使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果true|falsetrue
useGeneratedKeys允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)true|falsefalse
autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射。 PARTIAL 表示只会自动映射,没有定义嵌套结果集和映射结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)NONE、PARTIAL、FULLPARTIAL
autoMappingUnkno wnColumnBehavior指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 WARN 级别或者以下,才会显示相关日志,如果处理失败会抛出 SqlSessionException 异常NONE、WARNING、FAILINGNONE
defaultExecutorType配置默认的执行器。SIMPLE 是普通的执行器;REUSE 会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新SIMPLE、REUSE、BATCHSIMPLE
defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数任何正整数Not Set (null)
defaultFetchSize设置数据库驱动程序默认返回的条数限制,此参数可以重新设置任何正整数Not Set (null)
safeRowBoundsEnabled允许在嵌套语句中使用分页(RowBounds)。如果允许,设置 falsetrue|falsefalse
safeResultHandlerEnabled允许在嵌套语句中使用分页(ResultHandler)。如果允许,设置falsetrue|falsetrue
mapUnderscoreToCamelCase是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射true|falsefalse
localCacheScopeMyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速联复嵌套査询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据SESSION|STATEMENTSESSION
jdbcTypeForNull当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHERNULL、VARCHAR、OTHEROTHER
lazyLoadTriggerMethods指定哪个对象的方法触发一次延迟加载equals、clone、hashCode、toString
defaultScriptingLanguage指定动态 SQL 生成的默认语言org.apache.ibatis .script.ing.xmltags .XMLDynamicLanguageDriver
callSettersOnNulls指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这对于 Map.kcySet() 依赖或 null 值初始化时是有用的。注意,基本类型(int、boolean 等)不能设置成 nulltrue|falsefalse
logPrefix指定 MyBatis 增加到日志名称的前缀任何字符串Not set
loglmpl指定 MyBatis 所用日志的具体实现,未指定时将自动査找SLF4J|LOG4J|LOG4J2|JDK_LOGGING |COMMONS_LOGGING |ST DOUT_LOGGING|NO_LOGGINGNot set
proxyFactory指定 MyBatis 创建具有延迟加栽能力的对象所用到的代理工具CGLIB|JAVASSISTJAVASSIST (MyBatis 版本为 3.3 及以上的)
vfsImpl指定 VFS 的实现类提供 VFS 类的全限定名,如果存在多个,可以使用逗号分隔Not set
useActualParamName允许用方法参数中声明的实际名称引用参数。要使用此功能,项目必须被编译为 Java 8 参数的选择。(从版本 3.4.1 开始可以使用)true|falsetrue

例如:

<settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="multipleResultSetsEnabled" value="true"/>
    <setting name="useColumnLabel" value="true"/>
    <setting name="useGeneratedKeys" value="false"/>
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <setting name="defaultStatementTimeout" value="25"/>
    <setting name="defaultFetchSize" value="100"/>
    <setting name="safeRowBoundsEnabled" value="false"/>
    <setting name="mapUnderscoreToCamelCase" value="false"/>
    <setting name="localCacheScope" value="SESSION"/>
    <setting name="jdbcTypeForNull" value="OTHER"/>
    <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
  • <typeAliases>

在mapper.xml中需要使用parameterType和resultType属性来配置SQL语句的输入参数类型和输出参数类型,类必须要写上全限定名,比如一个SQL的返回值映射为Student类,则resultType属性要写com.shenxm.mybatisdemo.po.User,这太长了,所以可以用别名来简化书写,比如

<typeAliases>
    <typeAlias type="com.shenxm.mybatisdemo.po.User" alias="user"/>
</typeAliases>

之后就可以在resultType上直接写user,mybatis会根据别名配置自动找到对应的类。

另外,对于基本的Java类型 -> 8大基本类型以及包装类,以及String类型,mybatis提供了默认的别名,别名为其简单类名的小写,比如原本需要写java.lang.String,其实可以简写为string

  • <typeHandlers>

用于处理Java类型和Jdbc类型之间的转换,mybatis有许多内置的TypeHandler,比如StringTypeHandler,会处理Java类型String和Jdbc类型CHAR和VARCHAR。

  • <objectFactory>

mybatis会根据resultTyperesultMap的属性来将查询得到的结果封装成对应的Java类,它有一个默认的DefaultObjectFactory,用于创建对象实例。

  • <plugins>

可以用来配置mybatis的插件,比如在开发中经常需要对查询结果进行分页,就需要用到pageHelper分页插件,这些插件就是通过这个标签进行配置的。在mybatis底层,运用了责任链模式+动态代理去实现插件的功能

<!-- PageHelper 分页插件 -->
<plugins>
  <plugin interceptor="com.github.pagehelper.PageInterceptor">
     <property name="helperDialect" value="mysql"/>
  </plugin>
</plugins>
  • <environments>

用来配置数据源 , 可以通过配置多个 environment 标签来连接多个数据库,需要注意的是必须指定其中一个为默认运行环境(通过default指定)。

environment 标签提供了两个子标签,即 transactionManager 和 dataSource。

transactionManager标签: MyBatis 支持两个事务管理器,即 JDBC 和 MANAGED。

dataSource标签: 用于配置数据库的连接属性,例如要连接的数据库的驱动程序名称、URL、用户名和密码等。

  • <mappers>

    mappers 标签用于指定 MyBatis SQL 映射文件的路径。

<!--     指定映射配置文件的位置 -->
    <mappers>
<!--        1.单独加载某个映射配置文件 -->
<!--        <mapper resource="com\shenxm\mybatisdemo\mapper\UserMapper.xml"/>-->
<!--     2.加载某包所有的配置文件  -->
        <package name="com.shenxm.mybatisdemo.mapper"/>
    </mappers>

五、 Mybatis的mapper(映射器)

5.1映射器概念

映射器: 是 MyBatis 中最重要的文件,文件中包含一组 SQL 语句(例如查询、添加、删除、修改),例如UserMapper.xml和UserMapper接口就是一个映射器。

映射器由 Java 接口和 XML 文件(或注解)共同组成,它的作用如下:

  • 定义参数类型
  • 配置缓存
  • 提供 SQL 语句和动态 SQL
  • 定义查询结果和 POJO 的映射关系

映射器有以下两种实现方式:(快速使用章节有介绍)

  • 通过 XML 文件方式实现,比如我们在 mybatis-config.xml 文件中描述的 XML 文件,用来生成 mapper。(推荐使用)
  • 通过注解的方式实现,使用 Configuration 对象注册 Mapper 接口。

映射器可以定义以下标签:

元素名称描述备注
mapper映射文件的根节点,只有 namescape 一个属性namescape 作用如下:用于区分不同的 mapper,全局唯一绑定DAO接口,即面向接口编程。当 namescape 绑定某一接口后,可以不用写该接口的实现类,MyBatis 会通过接口的完整限定名查找到对应的 mapper 配置来执行 SQL 语句。因此 namescape 的命名必须要跟接口同名。
select查询语句,最常用、最复杂的元素之一可以自定义参数,返回结果集等
insert插入语句执行后返回一个整数,代表插入的条数
update更新语句执行后返回一个整数,代表更新的条数
delete删除语句执行后返回一个整数,代表删除的条数
parameterMap定义参数映射关系即将被删除的元素,不建议使用
sql允许定义一部分的 SQL,然后在各个地方引用它例如,一张表列名,我们可以一次定义,在多个 SQL 语句中使用
resultMap用来描述数据库结果集与对象的对应关系,它是最复杂、最强大的元素提供映射规则
cache配置给定命名空间的缓存-
cache-ref其它命名空间缓存配置的引用-

5.2Mybatis执行sql的两种方式

1.通过 SqlSession 发送 SQL。

2.通过 SqlSession 获取 Mapper 接口,通过 Mapper 接口发送 SQL。

//第一种:通过 SqlSession 发送 SQL。
List<User> users = (User)sqlSession.selectList("com.shenxm.mybatisdemo.mapper.UserMapper.selectAll");
//第二种:通过 SqlSession 获取 Mapper 接口,通过 Mapper 接口发送 SQL。
 UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 users = mapper.selectAll();

5.3select标签

用于执行查询操作。

执行 SQL 语句时可以定义参数 :基本参数类型或者复杂参数类型,例如JavaBean,Map等。

Mybatis提供了强大的 映射规则,执行sql后,会将结果集自动映射到JavaBean中。 通常这种映射采用Java驼峰命名规则。

参数的传递使用#{参数名},相当于告诉 MyBatis 生成 PreparedStatement 参数。对于 JDBC,该参数会被标识为“?”。

传递参数的四种方式:

  1. 基本类型传参
  2. 使用Map传参
  3. 使用注解传参: @Param() 传递参数
  4. 使用JavaBean传参

代码实现:

UserMapper接口:

package com.shenxm.mybatisdemo.mapper;

import com.shenxm.mybatisdemo.po.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
/**
 * @Author: shen
 * @CreateTime: 2022-01-05  21:48
 * @Description: UserMapper
 * @Version 1.0
 */
public interface UserMapper {

    List<User> selectAll();

    String getNameById(@Param("id") Long id);

    List<User> selectByMap(Map<String, Object> param);

    List<User> selectByentity(User user);
}

UserMapper.xml:

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

<mapper namespace="com.shenxm.mybatisdemo.mapper.UserMapper">
<!--    resultMap
	id 在命名空间中唯一的标识符
	type 结果集映射的javabean 或者 泛型为该类型的集合
-->
    <resultMap id="userMap" type="com.shenxm.mybatisdemo.po.User">
<!--    id主键映射
        result 非主键映射
        property javabean 中的 filed
		column datatable 中的 filed  -->
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="email" column="email"/>
    </resultMap>

<!--    <select id="selectAll" resultType="com.shenxm.mybatisdemo.po.User">-->
<!--        SELECT * FROM user;-->
<!--    </select>-->

    <select id="selectAll" resultMap="userMap">
        SELECT * FROM user;
    </select>

    <select id="getNameById" resultType="string">
        SELECT name FROM user where id = #{id};
    </select>

    <select id="selectByMap" parameterType="map" resultType="com.shenxm.mybatisdemo.po.User">
        SELECT * FROM user where id = #{id};
    </select>

    <select id="selectByentity" parameterType="com.shenxm.mybatisdemo.po.User" resultType="com.shenxm.mybatisdemo.po.User">
        SELECT * FROM user where id = #{id};
    </select>

</mapper>

DemoTest:

 @Test
    public void testMapper2() {
        // 核心配置文件classpath路径
        String resource = "mybatis/mybatis-config.xml";

        Reader config = null;
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession sqlSession = null;
        try {
            // 1.加载配置文件
            // 第一种: Resources.getResourceAsReader(resource);
            config = Resources.getResourceAsReader(resource);
            // 第二种:InputStream config = Resources.getResourceAsStream(resource);
            // 2.构建会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
            // 3.打开SqlSession连接
            sqlSession = sqlSessionFactory.openSession();
            // 4.获取该接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 5.执行接口中的方法
            System.out.println("=================查询所有数据=========================");
            //查询所有数据
            List<User> userList = mapper.selectAll();
            userList.forEach(System.out::println);
            System.out.println("=================基本数据类型传参==================");
            //基本数据类型传参
            String users = mapper.getNameById(1L);
            System.out.println("基本数据类型传参:" + users);
            System.out.println("=================map传参==================");
            //map传参
            HashMap<String, Object> map = new HashMap<>();
            map.put("id", 1L);
            List<User> userList1 = mapper.selectByMap(map);
            userList1.forEach(System.out::println);
            System.out.println("================JavaBean传参==================");
            //JavaBean传参
            User user = new User();
            user.setId(1L);
            List<User> userList2 = mapper.selectByentity(user);
            userList2.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 6.释放SqlSession资源
            sqlSession.close();
        }
    }

常用标签属性:

属性名称描 述备注
id它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用如果命名空间+id不唯一,那么 MyBatis 抛出异常
parameterType表示传入 SQL 语句传入参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数支持基本数据类型和 JavaBean、Map 等复杂数据类型
resultTypeSQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType 或 resultMap 之一-
resultMap它是映射集的引用,与 元素一起使用,返回时可以使用 resultType 或 resultMap 之一是 MyBatis 最复杂的元素,可以配置映射规则、级联、typeHandler 等
flushCache用于设置在调用 SQL 语句后是否要求 MyBatis 清空之前查询的本地缓存和二级缓存默认值为 false,如果设置为 true,则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存
useCache启动二级缓存的开关,默认值为 true,表示将査询结果存入二级缓存中-
timeout用于设置超时参数,单位是秒(s),超时将抛出异常-
fetchSize获取记录的总条数设定默认值是数据库厂商提供的 JDBC 驱动所设置的条数
statementType告诉 MyBatis 使用哪个 JDBC 的 Statement 工作,取值为 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement)-
resultSetType这是针对 JDBC 的 ResultSet 接口而言,其值可设置为 FORWARD_ONLY(只允许向前访问)、SCROLL_SENSITIVE(双向滚动,但不及时更新)、SCROLLJNSENSITIVE(双向滚动,及时更新)-

5.4insert标签

用来定义插入语句,执行插入操作。 当 MyBatis 执行完一条插入语句后,就会返回其影响数据库的行数。

传递参数的四种方式:

  1. 基本类型传参
  2. 使用Map传参
  3. 使用注解传参: @Param() 传递参数
  4. 使用JavaBean传参

主键回填: 数据库自动生成的主键回填到请求对象,供业务使用, 此时,我们就可以通过在 insert 标签中添加 keyProperty 和 useGeneratedKeys 属性,来实现该功能。

UserMapper接口:

package com.shenxm.mybatisdemo.mapper;

import com.shenxm.mybatisdemo.po.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
/**
 * @Author: shen
 * @CreateTime: 2022-01-05  21:48
 * @Description: UserMapper
 * @Version 1.0
 */
public interface UserMapper {

    List<User> selectAll();

    String getNameById(@Param("id") Long id);

    List<User> selectByMap(Map<String, Object> param);

    List<User> selectByentity(User user);

    int addUser(@Param("user") User user);

}

UserMapper.xml:

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

<mapper namespace="com.shenxm.mybatisdemo.mapper.UserMapper">
<!--    resultMap
	id 在命名空间中唯一的标识符
	type 结果集映射的javabean 或者 泛型为该类型的集合
-->
    <resultMap id="userMap" type="com.shenxm.mybatisdemo.po.User">
<!--    id主键映射
        result 非主键映射
        property javabean 中的 filed
		column datatable 中的 filed  -->
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="email" column="email"/>
    </resultMap>

<!--    <select id="selectAll" resultType="com.shenxm.mybatisdemo.po.User">-->
<!--        SELECT * FROM user;-->
<!--    </select>-->

    <select id="selectAll" resultMap="userMap">
        SELECT * FROM user;
    </select>

    <select id="getNameById" resultType="string">
        SELECT name FROM user where id = #{id};
    </select>

    <select id="selectByMap" parameterType="map" resultType="com.shenxm.mybatisdemo.po.User">
        SELECT * FROM user where id = #{id};
    </select>

    <select id="selectByentity" parameterType="com.shenxm.mybatisdemo.po.User" resultType="com.shenxm.mybatisdemo.po.User">
        SELECT * FROM user where id = #{id};
    </select>

    <insert id="addUser" keyProperty="id" useGeneratedKeys="true">
        INSERT INTO user (name,age,email)
        VALUES(#{user.name},#{user.age},#{user.email})
    </insert>


</mapper>

DemoTest:

 @Test
    public void testMapper3() {
        // 核心配置文件classpath路径
        String resource = "mybatis/mybatis-config.xml";

        Reader config = null;
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession sqlSession = null;
        try {
            // 1.加载配置文件
            // 第一种: Resources.getResourceAsReader(resource);
            config = Resources.getResourceAsReader(resource);
            // 第二种:InputStream config = Resources.getResourceAsStream(resource);
            // 2.构建会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
            // 3.打开SqlSession连接
            sqlSession = sqlSessionFactory.openSession();
            // 4.获取该接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 5.执行接口中的方法
            System.out.println("================插入==================");
            User user = new User();
            user.setAge(22);
            user.setName("xiaowu");
            user.setEmail("xiaowu@baomidou.com");
            int i = mapper.addUser(user);
            sqlSession.commit();//提交
            System.out.println("成功插入了:" + i + "条");
            System.out.println("主键回填对象:" + user.getId());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 6.释放SqlSession资源
            sqlSession.close();
        }
    }

常用属性:

属性名称描述备注
id它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用如果命名空间+ id 不唯一,那么 MyBatis 抛出异常
parameterType传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。支持基本数据类型和 JavaBean、Map 等复杂数据类型
keyProperty该属性的作用是将插入操作的返回值赋给 PO 类的某个属性,通常为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。-
useGeneratedKe该属性用来设置,是否使用 JDBC 提供的 getGenereatedKeys() 方法,获取数据库内部产生的主键并赋值到 keyProperty 属性设置的请求对象的属性中,例如 MySQL、SQL Server 等自动递增的字段,其默认值为 false。该属性值设置为 true 后,会将数据库生成的主键回填到请求对象中,以供其他业务使用。
flushCache该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。-
timeout该属性用于设置执行该操作的最大时限,如果超时,就抛异常。-
databaseId取值范围 oracle、mysql 等,表示数据库厂家;元素内部可通过 来为特定数据库指定不同的 sql 语句。MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。
keyColumn该属性用于设置第几列是主键,当主键列不是表中的第 1 列时,就需要设置该属性。如果是联合主键,可以将多个值用逗号隔开。-

5.5update标签

用于定义更新语句,执行更新操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。

传递参数的四种方式:

  1. 基本类型传参
  2. 使用Map传参
  3. 使用注解传参: @Param() 传递参数
  4. 使用JavaBean传参

UserMapper接口:

int updateByentity(@Param("user") User user);

UserMapper.xml:

  <update id="updateByentity">
        UPDATE user SET age=#{user.age}  WHERE id = #{user.id}
  </update>

DemoTest:

  @Test
    public void testMapper4() {
        // 核心配置文件classpath路径
        String resource = "mybatis/mybatis-config.xml";

        Reader config = null;
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession sqlSession = null;
        try {
            // 1.加载配置文件
            // 第一种: Resources.getResourceAsReader(resource);
            config = Resources.getResourceAsReader(resource);
            // 第二种:InputStream config = Resources.getResourceAsStream(resource);
            // 2.构建会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
            // 3.打开SqlSession连接
            sqlSession = sqlSessionFactory.openSession();
            // 4.获取该接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 5.执行接口中的方法
            System.out.println("================更新==================");
            User user = new User();
            user.setAge(18);
            user.setId(8L);
            int i = mapper.updateByentity(user);
            sqlSession.commit();//提交
            System.out.println("共更新了 " + i + " 条记录");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 6.释放SqlSession资源
            sqlSession.close();
        }
    }

常用属性:

属性名称描述备注
id它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用如果命名空间+ id 不唯一,那么 MyBatis 抛出异常
parameterType传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。支持基本数据类型和 JavaBean、Map 等复杂数据类型
flushCache该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。-
timeout该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。-
statementType执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。-

注意:update 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。

5.6delete标签

定义 delete 语句,执行删除操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。

传递参数的四种方式:

  1. 基本类型传参
  2. 使用Map传参
  3. 使用注解传参: @Param() 传递参数
  4. 使用JavaBean传参

UserMapper接口:

int deleteById(@Param("id") Long id);

UserMapper.xml:

 <delete id="deleteById">
        DELETE FROM `user` WHERE id = #{id}
 </delete>

DemoTest:

@Test
    public void testMapper5() {
        // 核心配置文件classpath路径
        String resource = "mybatis/mybatis-config.xml";

        Reader config = null;
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession sqlSession = null;
        try {
            // 1.加载配置文件
            // 第一种: Resources.getResourceAsReader(resource);
            config = Resources.getResourceAsReader(resource);
            // 第二种:InputStream config = Resources.getResourceAsStream(resource);
            // 2.构建会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
            // 3.打开SqlSession连接
            sqlSession = sqlSessionFactory.openSession();
            // 4.获取该接口的代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 5.执行接口中的方法
            System.out.println("================删除==================");
            int i = mapper.deleteById(8L);
            sqlSession.commit();//提交
            System.out.println("删除了 " + i + " 条记录");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 6.释放SqlSession资源
            sqlSession.close();
        }
    }

常用属性:

属性名称描述备注
id它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用如果命名空间+ id 不唯一,那么 MyBatis 抛出异常
parameterType传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。支持基本数据类型和 JavaBean、Map 等复杂数据类型
flushCache该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。-
timeout该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。-
statementType执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。-

注意:delete 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。

5.7resultMap标签

主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。

注意:MyBatis 版本只支持 resultMap 查询,不支持更新或者保存,更不必说级联的更新、删除和修改。

<resultMap id="" type="">
    <constructor><!-- 类再实例化时用来注入结果到构造方法 -->
        <idArg/><!-- ID参数,结果为ID -->
        <arg/><!-- 注入到构造方法的一个普通结果 --> 
    </constructor>
    <id/><!-- 用于表示哪个列是主键 -->
    <result/><!-- 注入到字段或JavaBean属性的普通结果 -->
    <association property=""/><!-- 用于一对一关联 -->
    <collection property=""/><!-- 用于一对多、多对多关联 -->
    <discriminator javaType=""><!-- 使用结果值来决定使用哪个结果映射 -->
        <case value=""/><!-- 基于某些值的结果映射 -->
    </discriminator>
</resultMap>

其中:

  • 元素的 type 属性表示需要的 POJO,id 属性是 resultMap 的唯一标识。
  • 子元素

    id 和 result 元素都有以下属性。

    元素说明
    property映射到列结果的字段或属性。如果 POJO 的属性和 SQL 列名(column元素)是相同的,那么 MyBatis 就会映射到 POJO 上
    column对应 SQL 列
    javaType配置 Java 类型。可以是特定的类完全限定名或 MyBatis 上下文的别名
    jdbcType配置数据库类型。这是 JDBC 类型,MyBatis 已经为我们做了限定,基本支持所有常用数据库类型
    typeHandler类型处理器。允许你用特定的处理器来覆盖 MyBatis 默认的处理器。需要指定 jdbcType 和 javaType 相互转化的规则

    一条 SQL 查询语句执行后会返回结果集,结果集有两种存储方式,即使用 Map 存储和使用 POJO 存储。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

H13-531云计算HCIE V2.0——1~400常错题和知识点总结

1~100 35、FusionStorage Block无法是被配置RAID的磁盘,一定要将RAID信息删除后, Fusionstrage block才能识别到这些磁盘? 错误 61、Ceilometer监控通过在计算节点部署Compute服务 84.&#xff08;多选&#xff09;在配置 FusionSphere OpenStack 时&#xff0c;可以用来实…

商务BD干多了,做一个无情的微信发消息机器人帮我发消息吧

1. 有没有那种做微信的伙伴&#xff0c;每天需要定点定时发消息&#xff1f; 2. 有没有那种做电商商务的朋友&#xff0c;每天需要发消息提醒达人商务们&#xff1f; 3. 有没有那种需要定时定点打卡&#xff0c;需要提醒自己要干啥的兄弟姐妹&#xff1f;** 那么有没有大冤种去…

如何获取电脑软件图标和app图标

如何获取电脑软件图标和app图标大家在写博客或者作图的时候经常会需要找到电脑软件图标或者app图标&#xff0c;如果从网上找有的图标并不清楚&#xff0c;今天给大家分享下&#xff0c;怎么快速的获取电脑软件图标和app图标&#xff0c;得到的图标也比较清楚。电脑软件图标获取…

【操作系统】操作系统的Buffer和Cache

文章目录1.Buffer和Cache的区别2.磁盘和文件写入操作案例3.磁盘和文件读取操作案例4.Cache和Buffer的命中案例1.Buffer和Cache的区别 &#xff08;1&#xff09;什么是Buffer Buffer指Linux内存的 Buffer cache&#xff08;缓冲区&#xff09;。Buffer为了让不同的速度的设备…

【迅为iMX6Q】开发板 Linux 5.15.71 SD卡 启动

开发环境 win10 64位VMware Workstation Pro 16ubuntu 22.04【迅为imx6q】开发板&#xff0c; 2G DDR linux-imx 下载 使用 NXP 官方提供的 linux-imx&#xff0c;代码地址为&#xff1a; https://github.com/nxp-imx/linux-imx 使用 git 下载 linux-imx&#xff0c; git cl…

Linux应用编程---6.无名管道

Linux应用编程—6.无名管道 6.1 pipe()函数使用详情 ​ 管道是进程之间进行通讯的一种方式。管道有两种&#xff0c;分别是&#xff1a;无名管道和有名管道。先看无名管道。管道创建函数是pipe()&#xff0c;在Linux终端输入man pipe。 图1 pipe()函数详情NAMEpipe, pipe2 - …

Mathorcup数学建模竞赛第六届-【妈妈杯】B题:小区车位分布的优化设计与评价(附一等奖获奖论文、C++和matlab代码)

赛题描述 随着现代社会经济的快速发展,房地产成为国家经济发展中重要的经济增长点之一。而小区内汽车停车位的分布对于小区居民的上下班出行影响很大。请建立数学模型,解决下列问题: 问题1:分析评判小区汽车停车位分布是否合理的几个关键指标,建立评判车位分布合理的数学…

mybatis官方文档之第一个mybatis程序实操

mysql数据库准备工作&#xff1a; 首先&#xff0c;我们需要在mysql数据库中&#xff0c;建立数据库和数据表&#xff1a; //创建数据库 create database my_batis; //创建表 create table students(id int not null,name varchar(30) default null,pwd varchar(30) default …

用移动激光扫描来估计树干直径的分割和树干校准法

Paper题目&#xff1a;Mobile Laser Scanning for Estimating Tree Stem Diameter Using Segmentation and Tree Spine Calibration Abstract 移动激光扫描 (MLS) 可以通过使用自动推导出树干中心位置和树干直径的算法来提高森林清查效率。在这项工作中&#xff0c;我们提出了…

远程控制软件– 向日葵使用教程

新冠疫情的严峻形式下&#xff0c;各地都延期复工&#xff0c;一时间远程办公&#xff0c;在家办公可谓非常火爆。然而&#xff0c;家里毕竟不是公司&#xff0c;很多的资料都在办公室电脑&#xff0c;甚至一些比较专业系统或者专属网络限制无法完成在家办公&#xff0c;这时候…

从加(解)密角度讲栅栏密码

目录普通型栅栏加密原理解密原理W型栅栏加密原理实例解密原理这今天在做新生赛的一道“只有倒着翻过十八层的篱笆才能抵达北欧神话的终点”&#xff0c;研究了很长时间的栅栏原理&#xff0c;flag没出来&#xff0c;而且自己对于普通和W型的加密解密整的有的蒙… 原先一篇文章里…

sentinel-流量控制

github地址&#xff1a;主页 alibaba/Sentinel Wiki GitHub 目录 概述基于 QPS/并发数的流量控制基于调用关系的流量控制 概述 流量控制&#xff08;flow control&#xff09;&#xff0c;其原理是监控应用流量的 QPS 或并发线程数等指标&#xff0c;当达到指定的阈值时对…

免费安全的内网穿透实现——Tailscale

一、需求说明想要实现访问公司或家里的网络设备&#xff08;Windows电脑、NAS、安卓设备等&#xff09;;但是这些设备又没有对应的公网IP地址&#xff1b;且就算有公网 IP 地址&#xff0c;也不放心让这些网络设备直接公开暴露在网络环境中&#xff08;这样很容易被频繁的恶意扫…

【MySQL Tips】除了指定密码外 MySQL客户端更好的选择——登录路径

在实际项目中&#xff0c;我们在生产&#xff08;环境&#xff09;发布新版本或运维时&#xff0c;使用 mysql 、mysqladmin、mysqlimport、mysqldump、mysqlpump 等 MySQL 客户端程序时&#xff0c;每次都需要输入密码&#xff0c;一般都会采用更安全的互动输入密码模式&#…

UOS 22.0家庭版使用体验

1月4日这天我收到了UOS的22.0版本的推送&#xff0c;更新后新增了未成年人账户和学习中心&#xff0c;由于是虚拟机中所以无法新增未成年人账户&#xff0c;于是我制作了Linux to go&#xff08;LTG&#xff09;但是由于我的U盘不是固态U盘所以我用普通的更新就卡在了更新界面。…

Linux下第一个程序:进度条

一、前言 进度条程序曾经是百度的一道面试题。 这一期博客我们来介绍代码和原理究竟是怎样的。 二、知识点 1.回车和换行 通常意义上我们以为回车就是就是键盘的那个回车键。 其实不然。回车其实是不换行&#xff0c;回到本行开头。我们通常用符号表示为 \r 。 换行就是新…

Docker Compose安装

目录 前言 1. 二进制包在线安装 2. 二进制包离线安装 2.1 下载安装包。 2.2 上传到linux服务器 2.3 解压到/usr/local/bin/docker-compose目录。 2.4 将可执行权限应用于二进制文件 2.5 创接建软链&#xff08;可选&#xff09; 2.6 测试是否安装成功 3. 国内镜像二进…

Linux应用编程---3.wait()函数

Linux应用编程—3.wait()函数 ​ 首先引入三个函数&#xff0c;我们通过在Linux终端下查阅它的作用与使用方法。 ​ Linux终端命令下输入&#xff1a;man exit&#xff0c;敲击回车键即可打开exit函数详情页。 图1 exit编程手册​ exit函数的作用是终止一般进程&#xff0c;没…

12、Java基础之泛型的使用

一、泛型的理解1、泛型的概念所谓泛型&#xff0c;就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时&#xff08;例如&#xff0c; 继承或实现这个接口&#xff0c;用这个类型声明变量、创建对象时&#…

[游戏测试]基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; (*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &a…