当前位置: 首页 > news >正文

MyBatis 进阶

目录

前言

一、动态 SQL

1. 标签

2. 标签

3. 标签

4. 标签

5. 标签

6. 标签

二、xml 自动生成工具

1. 引入依赖

2. 添加 generator.xml 并修改

三、MyBatis-plus

1. 引入依赖

2. mybatis-plus 配置

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 语句也就不同;

接口定义:

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 实现:

    <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 实现如下:

<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 关键字;

接口定义:

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 实现:

    <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 关键字,也会去除掉额外的逗号;

接口定义:

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 实现:

    <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:每次遍历之间间隔的字符串;

接口方法:

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 实现:

    <delete id="deleteByIds">delete from userinfowhere id in<foreach collection="ids" open="(" close=")" separator="," item="id">#{id}</foreach></delete>

6. <include> 标签

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

    <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. 引入依赖

<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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//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. 引入依赖

        <!-- 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 配置

spring:application:name: mybatis-plus-demo# 数据库配置datasource:url: jdbc:mysql://127.0.0.1:3308/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:#  配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件mapper-locations: classpath:mybatis/**Mapper.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置打印 MyBatis日志map-underscore-to-camel-case: true #配置驼峰自动转换

3. 编码

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

@TableId 注解用于指定主键;

@TableFiled 注解用于指定列名 

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 {@TableIdprivate Integer id;@TableFieldprivate String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}
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 中有常用的接口实现,直接调用即可;


http://www.dtcms.com/a/442187.html

相关文章:

  • 软件设计师-软件工程-软件过程模型
  • 论坛网站方案手机网站建设的趋势
  • LeetCode每日一题——单调数列
  • LeetCode 100题(10题)
  • 后端开发网站做一些什么建设部网站官网 造价鉴定
  • day52-Zabbix(第一部分)
  • 依托Java和百度地图实现长沙市热门道路与景点实时路况检索的实践探索
  • 7-1-查询练习
  • Numpy 手搓线性回归
  • 昆明网站服务器湖北seo推广
  • 医院网站建设怎么样盐城网站建设效果
  • dockerfile理解
  • SpringBoot集成Druid连接池_配置优化与监控实践指南
  • 12380网站建设打算公众号小程序开发公司
  • 高并发场景下的前后端数据同步策略:长轮询、SSE与WebSocket对比分析
  • 网站推广对接北京手机网站搭建费用
  • Raydium
  • 动态Vault
  • 量化交易策略中ATR与波动率的配合
  • 便宜的网站设计企业永久免费自动建站系统
  • 深入解析JS事件循环机制 (Event Loop)
  • 亭湖区建设局网站小红书推广计划
  • 吃透大数据算法-时间轮(TimingWheel)
  • 从输入URL到展示出页面的这个过程~
  • WebDAV 与 SMB 在钓鱼攻击中的区别
  • 8. Pandas 日期与时间序列数据处理
  • 免费网站模板做零食的网站有哪些
  • 从零开始的C++学习生活 2:类和对象(上)
  • 家纺营销型网站网站建设服务费怎么记账
  • css其他选择器(精细修饰)