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>
相关推荐
小羊没烦恼!4 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里4 天前
java中的继承和多态的区别
java
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕4 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码4 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖4 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时4 天前
01-06-A-JVM排查实战详解
java·jvm
这个DBA有点耶4 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
vipxieliang4 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
DBA_G4 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库