MyBatis 进阶

目录

前言

[一、动态 SQL](#一、动态 SQL)

[1. 标签](#1. 标签)

[2. 标签](#2. 标签)

[3. 标签](#3. 标签)

[4.
标签](#4. 标签)

[5. 标签](#5. 标签)

[6. 标签](#6. 标签)

[二、xml 自动生成工具](#二、xml 自动生成工具)

[1. 引入依赖](#1. 引入依赖)

[2. 添加 generator.xml 并修改](#2. 添加 generator.xml 并修改)

三、MyBatis-plus

[1. 引入依赖](#1. 引入依赖)

[2. mybatis-plus 配置](#2. mybatis-plus 配置)

[3. 编码](#3. 编码)


前言

本文介绍了MyBatis的动态SQL功能及其常用标签:1. <if>标签实现条件判断;2. <trim>标签处理多余字符;3. <where>标签智能生成查询条件;4. <set>标签用于更新操作;5. <foreach>标签遍历集合;6. <include>标签复用SQL片段。还讲解了MyBatis Generator自动生成代码工具的使用方法,包括配置文件和插件配置。最后介绍了MyBatis-Plus的快速集成方式,展示了如何通过注解映射数据库表,并利用其提供的BaseMapper简化开发。这些技术能有效提升MyBatis开发效率和灵活性。


一、动态 SQL

动态 SQL 是 MyBatis 的强大特性之一,能够完成不同条件下不同 SQL 的拼接;

1. <if> 标签

比如在填表的时候,某些字段是必填字段,某些字段是非必填字段,用户填写完成后提交,就需要根据用户填写的字段,拼接相应的 SQL 的语句,不同用户填写的字段不同,拼接的 SQL 语句也就不同;

接口定义:

java 复制代码
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserInfoXmlMapper {

    Integer insertUserByCondition(UserInfo userInfo);
}

xml 实现:

XML 复制代码
    <insert id="insertUserByCondition">
        insert into userinfo (
        username, password,
        <if test="age != null">
            age,
        </if>
        <if test="gender != null">
            gender
        </if>
        )
        values (
        #{username}, #{password},
        <if test="age">
            #{age},
        </if>
        <if test="gender">
            #{gender}
        </if>
        )
    </insert>

2. <trim> 标签

上面的 xml 实现拼接的 sql 语句,如果 gender 属性没有填,则 age 属性会多拼接一个逗号,导致 sql 语法错误;

为了解决上述问题,引入了 <trim> 标签;

  • prefix:表⽰整个语句块,以prefix的值作为前缀;
  • suffix:表⽰整个语句块,以suffix的值作为后缀;
  • prefixOverrides:表示整个语句块要去除掉的前缀;
  • suffixOverrides:表⽰整个语句块要去除掉的后缀;

接口定义不变,xml 实现如下:

XML 复制代码
<insert id="insertUserByCondition">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username">
                username,
            </if>
            <if test="password">
                password,
            </if>
            <if test="age">
                age,
            </if>
            <if test="gender">
                gender
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username">
                #{username},
            </if>
            <if test="password">
                #{password},
            </if>
            <if test="age">
                #{age},
            </if>
            <if test="gender">
                #{gender}
            </if>
        </trim>
    </insert>

<trim> 标签通过设置前缀后缀的方式,可以将多余的部分,比如逗号去掉;

3. <where> 标签

<where> 标签可以实现和 <trim> 标签类似的功能,当有多个条件可输入的时候,可以去除掉开头多余的 and 或者 or,当没有条件的时候,可以去除掉 where 关键字;

接口定义:

java 复制代码
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserInfoXmlMapper {

    List<UserInfo> queryByCondition(UserInfo userInfo);
}

xml 实现:

XML 复制代码
    <sql id="allColumn">
        id, username, password, age, gender, phone, delete_flag, create_time, update_time
    </sql>
    
    <select id="queryByCondition" resultType="com.example.demo.model.UserInfo">
        select
        <include refid="allColumn"></include>
        from userinfo
        <where>
            <if test="age != null">
                age = #{age}
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="deleteFlag != null">
                and delete_flag = #{deleteFlag}
            </if>
        </where>
    </select>

4. <set> 标签

<set> 标签会动态插入 set 关键字,也会去除掉额外的逗号;

接口定义:

java 复制代码
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserInfoXmlMapper {

    Integer updateUserByCondition(UserInfo userInfo);
}

xml 实现:

XML 复制代码
    <update id="updateUserByCondition">
        update userinfo
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="age != null">
                age = #{age},
            </if>
            <if test="deleteFlag != null">
                delete_flag = #{deleteFlag}
            </if>
        </set>
        where id = #{id}
    </update>

5. <foreach> 标签

对集合遍历可以使用 <foreach> 标签;

标签具有以下属性:

  • collection:绑定⽅法参数中的集合,如List,Set,Map或数组对象;
  • item:遍历时的每⼀个对象;
  • open:语句块开头的字符串;
  • close:语句块结束的字符串;
  • separator:每次遍历之间间隔的字符串;

接口方法:

java 复制代码
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserInfoXmlMapper {

    Integer deleteByIds(List<Integer> ids);
}

xml 实现:

XML 复制代码
    <delete id="deleteByIds">
        delete from userinfo
        where id in
        <foreach collection="ids" open="(" close=")" separator="," item="id">
            #{id}
        </foreach>
    </delete>

6. <include> 标签

对于重复的冗余 xml 片段,可以使用 <sql> 标签封装成一个 sql 片段,然后通过 <include> 标签进行引用;

XML 复制代码
    <sql id="allColumn">
        id, username, password, age, gender, phone, delete_flag, create_time, update_time
    </sql>


    <select id="getUserInfo" resultType="com.example.demo.model.UserInfo">
        select
        <include refid="allColumn"></include>
        from userinfo
    </select>

二、xml 自动生成工具

1. 引入依赖

XML 复制代码
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.5</version>
    <configuration>
        <!--generator配置文件所在位置-->
        <configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>
		<overwrite>true</overwrite>
		<verbose>true</verbose>
	</configuration>
	<dependencies>
		<dependency>
		    <groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.33</version>
		</dependency>
	</dependencies>
</plugin>

注意配置 generator 配置文件所在位置;

引入插件后,多了一个插件,如下图:

2. 添加 generator.xml 并修改

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<generatorConfiguration>

    <!-- 一个数据库一个context -->
    <context id="MysqlTables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <!--去除注释-->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!--数据库链接信息-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3308/mybatis_test?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!-- 生成实体类 -->
        <javaModelGenerator targetPackage="com.example.generator.model" targetProject="src/main/java" >
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成 mapper xml文件 -->
        <sqlMapGenerator targetPackage="mapperGenerator" targetProject="src/main/resources" >
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- 生成mapxml对应client,也就是接口dao -->
        <javaClientGenerator targetPackage="com.example.generator.mapper" targetProject="src/main/java" type="XMLMAPPER" >
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- table可以有多个,每个数据库中的表都可以写一个table,tableName表示要匹配的数据库表,
        也可以在tableName属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 -->
        <table tableName="userinfo">
            <property name="useActualColumnNames" value="false" />
            <!-- 数据库表主键 -->
            <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        </table>
        <table tableName="articleinfo">
            <property name="useActualColumnNames" value="false" />
            <!-- 数据库表主键 -->
            <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        </table>
    </context>
</generatorConfiguration>

双击 generate,生成实体类,mapper xml 文件和 mapper 接口;

三、MyBatis-plus

1. 引入依赖

XML 复制代码
        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter -->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
			<version>3.5.5</version>
		</dependency>

2. mybatis-plus 配置

XML 复制代码
spring:
  application:
    name: mybatis-plus-demo

  # 数据库配置
  datasource:
    url: jdbc:mysql://127.0.0.1:3308/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  #  配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
  mapper-locations: classpath:mybatis/**Mapper.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置打印 MyBatis日志
    map-underscore-to-camel-case: true #配置驼峰自动转换

3. 编码

@TableName 注解用于指定数据库表名;

@TableId 注解用于指定主键;

@TableFiled 注解用于指定列名

java 复制代码
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Data
@TableName("userinfo")
public class UserInfo {
    @TableId
    private Integer id;
    @TableField
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}
java 复制代码
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

}

BaseMapper 中有常用的接口实现,直接调用即可;


相关推荐
祈祷苍天赐我java之术9 小时前
Redis 热点数据与冷数据解析
java·redis·mybatis
Roye_ack1 天前
【项目实战 Day9】springboot + vue 苍穹外卖系统(用户端订单模块 + 商家端订单管理模块 完结)
java·vue.js·spring boot·后端·mybatis
人间有清欢1 天前
java数据权限过滤
java·mybatis·权限控制·数据过滤
22jimmy1 天前
MyBatis动态sql
java·开发语言·mybatis
不要再敲了1 天前
SSM框架下的redis使用以及token认证
数据库·spring boot·redis·缓存·mybatis
ss2731 天前
手写MyBatis第88弹:从XML配置到可执行SQL的完整旅程
java·开发语言·mybatis
何中应2 天前
MyBatis-Plus字段类型处理器使用
java·数据库·后端·mybatis
似水流年,是谁苍白了等待2 天前
Spring Boot + MyBatis plus + MySQL 实现位置直线距离实时计算
spring boot·mysql·mybatis
卡布叻_星星3 天前
后端笔记之MyBatis 通过 collection 标签实现树形结构自动递归查询
java·笔记·mybatis