SpringBoot从入门到精通(十九) Mybatis使用注解实现复杂动态SQL
springboot集成mybatis
springboot集成mybatis的过程很简单,如下简单的几步。
1、引入依赖
直接将下面的依赖引入springboot的pom文件中:
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.1</version>
</dependency>
2、配置mybatis
加入依赖之后需要在配置文件中配置数据源和mybatis,在yaml文件或者properties文件中添加如下模板
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver #mysql8的驱动
url: jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
username: root
password: root
mybatis:
mapper-locations: classpath:mapper/*.xml
然后需要在启动类添加一个注解@MapperScan("com.example.mapper")
@SpringBootApplication
@MapperScan(basePackages = "com.example.mapper")
public class GdFApplication {
public static void main(String[] args) {
SpringApplication.run(GdFApplication.class, args);
}
}
Mybatis使用注解实现复杂动态SQL
一、基础注解
这里介绍的注解有@Select、@Update、@Insert、@Delete ,常用的也是这些。
以下是一个示例展示了如何使用注解执行复杂 SQL:
import org.apache.ibatis.annotations.*;
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
List<User> getUserByNameAndAge(@Param("name") String name, @Param("age") int age);
@Update("UPDATE users SET name = #{name} WHERE id = #{id}")
void updateUserNameById(@Param("id") int id, @Param("name") String name);
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
void insertUser(@Param("name") String name, @Param("age") int age);
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUserById(@Param("id") int id);
// 更复杂的 SQL 可以通过 XML 方式或者动态 SQL 的注解方式实现
// 也可以使用动态 SQL 注解 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 等
}
当然,也可以再注解中使用if标签和foreach来实现复杂sql,如下示例所示
@Select("SELECT * FROM users WHERE 1=1 " +
"<if test='ids != null'> " +
"AND id IN <foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach> " +
"</if>")
List<User> getUsersByIds(@Param("ids") List<Integer> ids);
@Select({
"SELECT * FROM users WHERE id IN ",
"<foreach item='id' collection='userIds' open='(' separator=',' close=')'>",
"#{id}",
"</foreach>"
})
List<User> getUsersByIds(@Param("userIds") List<Integer> userIds);
其中第二个查询,但是userIds是一个list,然后我们就是查询id=这个list的用户
Mybatis实用教程之XML实现动态sql
- 动态条件查询
假设有一个 User 实体,有 id、username 和 email 字段,我们希望根据不同条件查询用户信息。
<!-- 在 Mapper XML 文件中编写动态 SQL 查询 -->
<select id="selectUsers" resultType="User">
SELECT * FROM users
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="username != null and username != ''">
AND username = #{username}
</if>
<if test="email != null and email != ''">
AND email = #{email}
</if>
</where>
</select>
<where>
标签用于将动态生成的条件组合到 WHERE 子句中。
<if>
标签根据条件的存在与否来动态生成查询条件。
上面的方法可以根据id、username、email进行条件查询,当test后面的语句为true的时候,会将if标签内的语句拼接。
- 动态更新语句
假设我们想根据不同的条件更新用户信息。
<!-- 在 Mapper XML 文件中编写动态 SQL 更新 -->
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="username != null">
username = #{username},
</if>
<if test="email != null">
email = #{email},
</if>
</set>
WHERE id = #{id}
</update>
<set>
标签用于指定要更新的字段。
<if>
标签根据条件动态设置要更新的字段。
3. 动态插入语句
如果要根据不同情况插入不同的字段,也可以使用动态 SQL。
<!-- 在 Mapper XML 文件中编写动态 SQL 插入 -->
<insert id="insertUser" parameterType="User">
INSERT INTO users
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="username != null and username != ''">
username,
</if>
<if test="email != null and email != ''">
email,
</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="username != null and username != ''">
#{username},
</if>
<if test="email != null and email != ''">
#{email},
</if>
</trim>
</insert>
<trim>
标签用于动态设置插入的字段和对应的值,当trim标签内的内容为空时,不会添加前缀。
prefix 和 suffix 属性用于指定插入语句的前缀和后缀。
suffixOverrides 属性用于去除最后一个不必要的逗号。
其他标签的使用
基础的语法使用如下所示。choose、when、otherwise 有点像if-else if -else的感觉
<!-- 使用 choose、when、otherwise 标签实现条件选择 -->
<select id="getUserByIdOrUsername" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="username != null and username != ''">
AND username = #{username}
</when>
<otherwise>
AND 1=1
</otherwise>
</choose>
</where>
</select>
<!-- 使用 foreach 标签进行遍历操作 -->
<select id="getUsersByIdList" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话