目录
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() <= su.effective_start_time THEN "未生效"
WHEN NOW() >= su.effective_start_time AND NOW() < su.effective_end_time THEN "生效中"
WHEN NOW() >= 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 < >
<if test="age != null and age != ''">and age >= #{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;
欢迎大佬们留言补充!