【Mybatis】xml常用总结(持续更新)

目录

一、常用增删改查

查询(SELECT)操作

插入(INSERT)操作

更新(UPDATE)操作

删除(DELETE)操作

批量插入(INSERT)操作

批量删除(DELETE)操作

批量更新(UPDATE)操作

参数传递

结果映射

动态SQL

二、常用关键词总结

关键字表格总结

SQL举例

三、其他一些总结

处理数据转数据

生成指定表的insert语句


XML 复制代码
开发常用的xml写法简单整理下, 欢迎补充~

一、常用增删改查

下面是关于MyBatis XML配置中增删改查以及批量操作的常用写法总结:

查询(SELECT)操作

XML 复制代码
<select id="getUserById" resultType="com.example.User">
  SELECT * FROM users WHERE id = #{id}
</select>

<select id="queruByIds" parameterType="com.example.User" resultType="com.example.User">
	SELECT *
	where id in
	<foreach collection="list" item="item" open="(" close=")" separator=",">
		#{item}
	</foreach>;
</select>

这个示例中,`getUserById`是查询操作的唯一标识符,`resultType`指定了返回结果的类型。

插入(INSERT)操作

XML 复制代码
<insert id="insertUser" parameterType="com.example.User">
  INSERT INTO users (id, name, email) VALUES (#{id}, #{name}, #{email})
</insert>

这个示例中,`insertUser`是插入操作的唯一标识符,`parameterType`指定了传入参数的类型。

更新(UPDATE)操作

XML 复制代码
<update id="updateUser" parameterType="com.example.User">
  UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>

这个示例中,`updateUser`是更新操作的唯一标识符,`parameterType`指定了传入参数的类型。

删除(DELETE)操作

XML 复制代码
<delete id="deleteUserById" parameterType="int">
  DELETE FROM users WHERE id = #{id}
</delete>

这个示例中,`deleteUserById`是删除操作的唯一标识符,`parameterType`指定了传入参数的类型。

批量插入(INSERT)操作

XML 复制代码
<insert id="batchInsert" parameterType="java.util.List">
  INSERT INTO users (id, name, email)
  VALUES
  <foreach collection="list" item="user" separator=",">
    (#{user.id}, #{user.name}, #{user.email})
  </foreach>
</insert>

这个示例中,`insertUsers`是批量插入操作的唯一标识符,`parameterType`指定了传入参数的类型。使用`<foreach>`标签来循环遍历传入的列表进行批量插入。

批量删除(DELETE)操作

XML 复制代码
<delete id="deleteUsersByIds" parameterType="java.util.List">
  DELETE FROM users WHERE id IN
  <foreach collection="list" item="id" open="(" close=")" separator=",">
    #{id}
  </foreach>
</delete>

<update id="batchDel">
	update table_name set deleted = 1
	where deleted = 0
	<if test="list!=null and list.size != 0 ">
		and id in
		<foreach collection="list" item="item" open="(" separator="," close=")">
			#{item}
		</foreach>
	</if>
</update>

这个示例中,`deleteUsersByIds`是批量删除操作的唯一标识符,`parameterType`指定了传入参数的类型。使用`<foreach>`标签来循环遍历传入的列表进行批量删除。

批量更新(UPDATE)操作

XML 复制代码
<update id="updateUsers" parameterType="java.util.List">
  <foreach collection="list" item="user" separator=";">
    UPDATE users SET name = #{user.name}, email = #{user.email} WHERE id = #{user.id}
  </foreach>
</update>

这个示例中,`updateUsers`是批量更新操作的唯一标识符,`parameterType`指定了传入参数的类型。使用`<foreach>`标签来循环遍历传入的列表进行批量更新。

参数传递

在上述示例中,使用了`#{parameter}`语法来引用传入的参数。例如,`#{id}`引用了传入参数中的`id`字段。

结果映射

使用`resultType`指定查询结果的类型,或者使用`resultMap`来进行更复杂的结果映射。

动态SQL

MyBatis支持动态SQL,可以根据条件生成不同的SQL语句。例如,使用`<if>`、`<choose>`、`<when>`和`<otherwise>`等标签来编写动态SQL。

这些是一些常用的MyBatis XML配置写法总结,涵盖了增删改查等操作。您可以根据具体需求和情况进行相应的配置和使用。

二、常用关键词总结

关键字表格总结

关键字 释义 简单SQL示例
SELECT 从数据库中检索数据 SELECT * FROM 表名;
INSERT 将数据插入到表中 INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2);
UPDATE 更新表中的数据 UPDATE 表名 SET 列名 = 值 WHERE 条件;
DELETE 从表中删除数据 DELETE FROM 表名 WHERE 条件;
CREATE 创建新的表、视图等 CREATE TABLE 表名 (列1 数据类型, 列2 数据类型);
ALTER 修改现有表的结构 ALTER TABLE 表名 ADD 列名 数据类型;
DROP 删除表、视图等 DROP TABLE 表名;
TRUNCATE 快速删除表中数据 TRUNCATE TABLE 表名;
FROM 指定数据源表 SELECT * FROM 表名;
WHERE 指定查询条件 SELECT * FROM 表名 WHERE 条件;
GROUP BY 对结果进行分组 SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名;
HAVING 对分组结果进行条件过滤 SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名 HAVING 条件;
ORDER BY 对结果进行排序 SELECT * FROM 表名 ORDER BY 列名 ASC/DESC;
JOIN 将多个表连接起来查询 SELECT * FROM 表1 JOIN 表2 ON 表1.列 = 表2.列;
UNION 合并多个查询结果集 SELECT 列名 FROM 表1 UNION SELECT 列名 FROM 表2;
DISTINCT 返回唯一的查询结果 SELECT DISTINCT 列名 FROM 表名;
INDEX 创建索引以提高查询性能 CREATE INDEX 索引名 ON 表名 (列名);
PRIMARY KEY 定义表中的主键 CREATE TABLE 表名 (列1 数据类型 PRIMARY KEY, 列2 数据类型);
FOREIGN KEY 定义表之间的外键关系 CREATE TABLE 表1 (列1 数据类型, 列2 数据类型, FOREIGN KEY (列1) REFERENCES 表2(列2));
CONSTRAINT 定义表的约束条件 CREATE TABLE 表名 (列1 数据类型, 列2 数据类型, CONSTRAINT 约束名 PRIMARY KEY (列1));
LIMIT 限制查询结果的数量 SELECT * FROM 表名 LIMIT 数量;
OFFSET 偏移查询结果的行数 SELECT * FROM 表名 LIMIT 数量 OFFSET 偏移量;
BETWEEN 在范围内进行条件判断 SELECT * FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2;
IN 在一组值中进行条件判断 SELECT * FROM 表名 WHERE 列名 IN (值1, 值2, 值3);
LIKE 根据模式匹配进行条件判断 SELECT * FROM 表名 WHERE 列名 LIKE '模式';
NOT 对条件取反 SELECT * FROM 表名 WHERE NOT 条件;
IS NULL 判断值是否为空 SELECT * FROM 表名 WHERE 列名 IS NULL;
EXISTS 判断子查询是否返回结果 SELECT * FROM 表1 WHERE EXISTS (SELECT * FROM 表2 WHERE 条件);
CASE 条件表达式 SELECT 列名, CASE WHEN 条件 THEN 值 ELSE 值 END AS 别名 FROM 表名;
WHEN CASE语句中的条件 SELECT 列名, CASE 列名 WHEN 值1 THEN 值2 WHEN 值3 THEN 值4 ELSE 值5 END AS 别名 FROM 表名;
THEN CASE语句中的结果 SELECT 列名, CASE WHEN 条件 THEN 值1 ELSE 值2 END AS 别名 FROM 表名;
ELSE CASE语句中的默认结果 SELECT 列名, CASE WHEN 条件 THEN 值 ELSE 值 END AS 别名 FROM 表名;
END CASE语句结束标记 SELECT 列名, CASE WHEN 条件 THEN 值1 ELSE 值2 END AS 别名 FROM 表名;
AS 为列或表起别名 SELECT 列名 AS 别名 FROM 表名;
ON 指定连接条件 SELECT * FROM 表1 JOIN 表2 ON 表1.列 = 表2.列;
ASC 升序排序 SELECT * FROM 表名 ORDER BY 列名 ASC;
DESC 降序排序 SELECT * FROM 表名 ORDER BY 列名 DESC;
AVG 计算平均值 SELECT AVG(列名) FROM 表名;
SUM 计算总和 SELECT SUM(列名) FROM 表名;
COUNT 计算行数 SELECT COUNT(*) FROM 表名;
MAX 计算最大值 SELECT MAX(列名) FROM 表名;
MIN 计算最小值 SELECT MIN(列名) FROM 表名;
IFNULL 判断并返回非空值 SELECT IFNULL(列名, 替代值) FROM 表名;
COALESCE 返回第一个非空值 SELECT COALESCE(列1, 列2, 列3) FROM 表名;
DATE 提取日期部分 SELECT DATE(列名) FROM 表名;
NOW 返回当前日期和时间 SELECT NOW();
CURDATE 返回当前日期 SELECT CURDATE();
CURTIME 返回当前时间 SELECT CURTIME();
YEAR 提取年份部分 SELECT YEAR(列名) FROM 表名;
MONTH 提取月份部分 SELECT MONTH(列名) FROM 表名;
DAY 提取天数部分 SELECT DAY(列名) FROM 表名;
HOUR 提取小时部分 SELECT HOUR(列名) FROM 表名;
MINUTE 提取分钟部分 SELECT MINUTE(列名) FROM 表名;
SECOND 提取秒数部分 SELECT SECOND(列名) FROM 表名;
CONCAT 连接字符串 SELECT CONCAT(列1, 列2) FROM 表名;
SUBSTRING 提取子字符串 SELECT SUBSTRING(列名, 开始位置, 长度) FROM 表名;
LENGTH 计算字符串长度 SELECT LENGTH(列名) FROM 表名;
UPPER 转换为大写字母 SELECT UPPER(列名) FROM 表名;
LOWER 转换为小写字母 SELECT LOWER(列名) FROM 表名;
TRIM 去除字符串两端的空格 SELECT TRIM(列名) FROM 表名;

SQL举例

XML 复制代码
<select id="select"
            resultType="com.god.demo.app.entity.vo.DemoVo"
            parameterType="com.god.demo.app.entity.dto.DemoDTO">
        SELECT
        -- 加序号 @i := @i + 1 AS row,( SELECT @i := 0 ) r
        @i := @i + 1 AS row,
        ac.`name` companyName,
        ac.`name` nnn,
        ad.`name` departmentName,
        sus.userName creatorName,
        -- case when then else end
        CASE
        WHEN NOW() &lt;= su.effective_start_time THEN "未生效"
        WHEN NOW() &gt;= su.effective_start_time AND NOW() &lt; su.effective_end_time THEN "生效中"
        WHEN NOW() &gt;= su.effective_end_time THEN "已过期"
        ELSE NULL
        END effectiveStatus,
        concat( TRUNCATE ( IFNULL( su.user_integral / su.user_integral, 0 ) * 100, 2 ), '%' ) ratio,
        -- 想要的时间格式
        DATE_FORMAT( su.create_time, '%Y-%m-%d %H:%I:%s' ) createTime1,
        DATE_FORMAT( su.create_time, '%Y-%m-%d %H:%I' ) createTime2,
        DATE_FORMAT( su.create_time, '%Y-%m-%d %H' ) createTime3,
        DATE_FORMAT( su.create_time, '%Y-%m-%d' ) createTime4,
        DATE_FORMAT( su.create_time, '%Y-%m' ) createTime5,
        DATE_FORMAT( su.create_time, '%Y' ) createTime6,
        -- 关联俩字段
        concat_ws( '-', su.create_time, su.create_time ) time,
        -- 符号转义方法1:<![CDATA[< ]]>
        CASE
        WHEN su.user_integral <![CDATA[< ]]> 1000 THEN '普通会员'
        WHEN su.user_integral <![CDATA[>=  1000 AND su.user_integral <= ]]> 10000 THEN '黄金会员'
        WHEN su.user_integral <![CDATA[>=  10000 AND su.user_integral <= ]]> 20000 THEN '钻石会员'
        WHEN su.user_integral <![CDATA[>= ]]> 20000 THEN '星钻会员'
        ELSE '普通用户' END integralLevel,
        su.overage amount,
        su.*
        FROM
        sys_user su
        LEFT JOIN app_company ac ON su.company_id = ac.id
        LEFT JOIN app_department ad ON su.department_id = ad.id
        LEFT JOIN (SELECT s.id, s.`name` userName FROM sys_user s WHERE s.del_flag = '0' AND s.`status` = '1' AND
        DATE_FORMAT( s.create_time, '%Y' )= '2020' ) sus ON su.creator_id = sus.id,
        ( SELECT @i := 0 ) r
        <where>
            su.del_flag='0'

            <if test="companyId != null and companyId !=''">
                AND su.company_id=#{companyId}
            </if>
            <if test="departmentId != null and departmentId !=''">
                AND su.department_id=#{departmentId}
            </if>
            <if test="postId != null and postId !=''">
                AND su.post_id=#{postId}
            </if>
            <if test="level != null and level !=''">
                AND su.user_level=#{level}
            </if>

            -- 模糊比较
            <if test="name != null and name !=''">
                AND su.name like CONCAT('%', #{name,jdbcType=VARCHAR}, '%')
            </if>
            <if test="email != null and email !=''">
                AND su.email like CONCAT('%', #{email,jdbcType=VARCHAR}, '%')
            </if>
            <if test="phone != null and phone !=''">
                AND su.phone like CONCAT('%', #{phone}, '%')
            </if>

            -- 字符转义1: <![CDATA[< ]]>
            <if test="businessStartDate != null">
                and t.business_date <![CDATA[>= ]]> #{businessStartDate}
            </if>
            <if test="businessStartDate != null">
                and t.business_date >= #{businessStartDate}
            </if>
            <if test="businessEndDate != null">
                and <![CDATA[ t.business_date <= #{businessEndDate} ]]>
            </if>

            -- 字符转义2 &lt; &gt;
            <if test="age != null and age != ''">and age &gt;= #{age}</if>

            -- 数组判空
            <if test="phoneArray != null and phoneArray.length > 0">
                and 1=1
            </if>

            -- 集合判空
            <if test="phoneList != null and phoneList.size() > 0">
                AND su.phone in
                <foreach collection="phoneList" index="index" item="item" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>

			<if test="statusList!=null">
				and status in
				<foreach collection="statusList" item="item" open="(" separator="," close=")">
					#{item}
				</foreach>
			</if>

            -- 集合模糊匹配
            <if test="happys != null  and happys.size != 0">
                and
                <foreach collection="happys" item="happy" open="(" separator=" or " close=")">
                    happy like concat('%', #{happy}, '%')
                </foreach>
            </if>

            <include refid="Base_date_param"/>

        </where>
        ORDER BY
        su.create_time
    </select>

三、其他一些总结

处理数据转数据

XML 复制代码
  <insert id="insertUser">
        INSERT INTO demo1 ( `id`, `name`, `age`, `company`, `department`, `level`, `deleted` ) SELECT
        `c_id` id,
        `first_name` NAME,
        18 age,
        "阿凡哒" company,
        "xx" department,
        1 LEVEL,
        '0' deleted
        FROM
        demo2
        WHERE
        deleted = '0'
    </insert>

生成指定表的insert语句

XML 复制代码
SELECT
	CONCAT( 'INSERT INTO table_name (id,name,age,company,department,deleted) VALUES(', id, ', "', NAME, '", "', age, '", "', company, '", "', department, '", ', deleted, ');' ) AS insert_statement 
FROM
	table_name 
WHERE
	deleted = 0;

欢迎大佬们留言补充!

相关推荐
小徐敲java5 小时前
通用mybatis-plus查询封装(QueryGenerator)
mybatis
OEC小胖胖6 小时前
Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)
java·spring boot·后端·spring·mybatis·web
计算机学姐7 小时前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
落落落sss7 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
罗曼蒂克在消亡10 小时前
2.3MyBatis——插件机制
java·mybatis·源码学习
cyt涛12 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
OLDERHARD16 小时前
Java - MyBatis(上)
java·oracle·mybatis
计算机学姐1 天前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis
我是浮夸1 天前
MyBatisPlus——学习笔记
java·spring boot·mybatis
编程、小哥哥1 天前
手写mybatis之Mapper XML的解析和注册使用
xml·java·mybatis