Mybatis高阶

动态SQL

当我们注册页面时,当中的所要填入的选项有必选项和非必需选项,而非必选项当中用户可能会有不确定的选项时,应该采取默认值而不是将数值置为null,那么怎么解决这一问题,就需要使用动态SQL语句来实现

<if>标签

java 复制代码
 <insert id="insertByCondition">
        insert into user_info (username,`password`,age
        <if test="gender != null">
            ,gender
        </if>
        ) values (#{username},#{password},#{age}
        <if test="gender != null">
            ,#{gender}
        </if>
        )
    </inser

之前时一个字段时非必选项,如果当多个字段都不确定时,可能就会导致SQL语句报错下一个标签来来解决这个问题

<trim>标签

suffixOverrides:去除后缀

perfixOverrides:去除前缀

prefix:添加前缀

suffix:添加后缀

java 复制代码
<insert id="insertByCondition">
        insert into user_info
        <trim suffixOverrides="," prefix="(" suffix=")">
            <if test="username != null">
                username,
            </if>
            <if test="password != null">
                password,
            </if>
            <if test="age != null">
                age,
            </if>
            <if test="gender != null">
                gender
            </if>
        </trim>
        <trim suffixOverrides="," prefix="values (" suffix=")">
        <if test="username != null">
            #{username},
        </if>
        <if test="password != null">
            #{password},
        </if>
        <if test="age != null">
            #{age},
        </if>
        <if test="gender != null">
            #{gender}
        </if>
        </trim>
    </insert>

<where>标签

根据条件拼接SQL语句进行查询,如果SQL语句where后面的条件都没有,SQL语句就会出错

第一种解决办法

java 复制代码
<select id="selectByCondition" resultType="com.Kon.mybatis.entity.UserInfo">
        select *  from user_info  where 1=1
        <trim prefixOverrides="and">
            <if test="age != null">
                and age = #{age}
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
        </trim>
    </select>

第二种(加where标签)帮忙去掉"and",并且没有条件where关键字就不会出现

<set>标签和<where>标签同理

<foreach>标签

可以对集合进行遍历,例如:进行批量删除

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

<include>标签

SQL语句当中会有重复的语句,就需要此标签来替代

java 复制代码
 <sql id="normal">
        id, username, `password`, age, gender, phone, delete_flag,
        create_time, update_time
    </sql>
<!--只有select需要对象映射,resultType="    "    -->
    <select id="selectAll" resultType="com.Kon.mybatis.entity.UserInfo" >
        select <include refid="normal"></include> from user_info
    </select>

MyBatis Generator

通过MyBatis Generator插件更具数据表生成Model, Mapper接⼝以及SQL映射⽂件

通过添加插件

java 复制代码
<plugin>
				<groupId>org.mybatis.generator</groupId>
				<artifactId>mybatis-generator-maven-plugin</artifactId>
				<version>1.3.6</version>
				<executions>
					<execution>
						<id>Generate MyBatis Artifacts</id>
						<phase>deploy</phase>
						<goals>
							<goal>generate</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<!--generator配置文件所在位置-->
					<configurationFile>src/main/resources/generate/generator.xml</configurationFile>
					<!-- 允许覆盖生成的文件, mapxml不会覆盖, 采用追加的方式-->
					<overwrite>true</overwrite>
					<verbose>true</verbose>
					<!--将当前pom的依赖项添加到生成器的类路径中-->
					<includeCompileDependencies>true</includeCompileDependencies>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>mysql</groupId>
						<artifactId>mysql-connector-java</artifactId>
						<version>8.0.33</version>
					</dependency>
				</dependencies>
			</plugin>

添加generatorConfig.xml并修改

java 复制代码
<?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:3306/book_test?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!-- 生成实体类 -->
        <javaModelGenerator targetPackage="generate.entity" targetProject="src/main/java" >
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成mapxml文件 -->
        <sqlMapGenerator targetPackage="MybatisGenerator" targetProject="src/main/resources" >
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- 生成mapxml对应client,也就是接口dao -->
        <javaClientGenerator targetPackage="generate.mapper" targetProject="src/main/java" type="XMLMAPPER" >
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- table可以有多个,每个数据库中的表都可以写一个table,tableName表示要匹配的数据库表,也可以在tableName属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 -->
        <table tableName="book_info">
            <property name="useActualColumnNames" value="false" />
            <!-- 数据库表主键 -->
            <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        </table>
        <table tableName="user_info">
            <property name="useActualColumnNames" value="false" />
            <!-- 数据库表主键 -->
            <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        </table>
    </context>
</generatorConfiguration>
相关推荐
运维行者_1 小时前
ISP 企业级带宽计费怎么做?网络流量计费的 6 大核心能力
运维·服务器·网络·数据库·支持向量机·接口隔离原则
奇树谦1 小时前
PCB生产制造全流程详解:从开料、钻孔、沉铜到检测、包装
网络·数据库·制造
驾驭人生2 小时前
Hangfire.Redis.StackExchange 已归档停更!生产任务卡死、重复执行、网络抖动问题解决方案
数据库·redis·缓存
xierui1231232 小时前
Agent记忆不是聊天记录:用三层存储构建可追溯的 AI 工作流
数据库·人工智能·aigc·软件工程
2301_800074212 小时前
mysql DQL
数据库·sql·mysql
嘻哈baby2 小时前
Go 函数中的参数为什么不支持默认值?
java·开发语言·jvm
西风未眠2 小时前
ClickHouse数据库引擎引起的数据丢失
数据库·clickhouse·故障
慧都小项2 小时前
MyEclipse 2026:当 Agent、MCP 与 Java 26 进入 Eclipse 工作流
java·eclipse·springboot·copilot·myeclipse
海浪仙人掌2 小时前
应收账款分析如何操作?应收账款分析有哪些注意事项?
数据库·人工智能