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>
相关推荐
liangbo78 分钟前
Spring系列03:Bean 的三种注册方式
java·spring
余槐i11 分钟前
MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s
java·spring boot·mysql·docker·性能优化
SL_staff12 分钟前
制造业订单交付总在最后一刻爆雷?用结构化计划模板打通跨系统协同断点
java·开源·全栈
字节跳动开源14 分钟前
OpenViking连接业务系统,LLM Wiki一键编译
数据库·开源
做科研的周师兄31 分钟前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
有点小困97741 分钟前
Spring Boot 异步任务 ClassLoader 踩坑实录:ClassNotFoundException 的诡异真相
java
aiks_yuan44 分钟前
Java 正则表达式很慢怎么办:Pattern 预编译只快 2~5 倍,真正卡死线程的是回溯(JDK 8、11、17 实测)
java
用户3721574261351 小时前
C# 填写 PDF 交互式表单:文本框、复选框、单选按钮和下拉列表
java
IT枫斗者枫哥1 小时前
Java 退款请求超时,先查原单还是重试?
java·后端
特立独行的猫A1 小时前
我用仓颉写了个多平台发文工具:一份 Markdown,一条命令发六个平台
java·后端·python