mybatis-plus 是 mybatis 的增强版,提供了许多开箱即用的 crud 操作。然而,在实际项目中,开发者常常需要编写自定义 sql 以处理更复杂的查询需求。mybatis-plus 提供了灵活的机制,允许开发者通过注解或 xml 自定义 sql,同时也能支持复杂查询、动态 sql 等高级操作。
1. 自定义 sql 的两种方式
mybatis-plus 支持两种自定义 sql 的方式:
- 注解方式:直接在
mapper接口上通过注解编写 sql 语句。 - xml 方式:通过
mapper配置文件的方式编写自定义 sql。
2. 通过注解编写自定义 sql
mybatis-plus 支持在 mapper 接口方法上直接使用注解编写 sql 语句。常见的注解包括:
@select:用于查询。@insert:用于插入。@update:用于更新。@delete:用于删除。
2.1 查询示例
假设有一个 user 表,包含 id、username 和 email 字段。通过注解编写自定义 sql 查询用户信息:
import com.baomidou.mybatisplus.core.mapper.basemapper;
import com.example.demo.model.user;
import org.apache.ibatis.annotations.mapper;
import org.apache.ibatis.annotations.select;
import java.util.list;
@mapper
public interface usermapper extends basemapper<user> {
// 根据用户名查询用户
@select("select * from user where username = #{username}")
user findbyusername(string username);
// 查询所有用户
@select("select * from user")
list<user> findall();
}
2.2 插入示例
通过注解实现插入用户记录:
import org.apache.ibatis.annotations.insert;
@mapper
public interface usermapper extends basemapper<user> {
@insert("insert into user (username, email) values (#{username}, #{email})")
void insertuser(user user);
}
2.3 动态 sql
mybatis-plus 还支持通过 @selectprovider、@updateprovider 等注解来实现动态 sql。以下是通过 @selectprovider 动态生成查询 sql 的示例:
import org.apache.ibatis.annotations.selectprovider;
import org.apache.ibatis.builder.annotation.providercontext;
import java.util.map;
@mapper
public interface usermapper extends basemapper<user> {
@selectprovider(type = sqlprovider.class, method = "findbycondition")
list<user> findbycondition(map<string, object> conditions);
class sqlprovider {
public string findbycondition(map<string, object> params, providercontext context) {
stringbuilder sql = new stringbuilder("select * from user where 1=1");
if (params.get("username") != null) {
sql.append(" and username = #{username}");
}
if (params.get("email") != null) {
sql.append(" and email = #{email}");
}
return sql.tostring();
}
}
}
在此示例中,通过 @selectprovider 动态生成 sql,根据传入的条件查询用户。
3. 通过 xml 编写自定义 sql
除了注解方式,mybatis-plus 还支持通过 xml 文件编写自定义 sql。xml 配置的方式可以编写更复杂、灵活的查询和动态 sql。
3.1 xml 配置基本结构
首先,在 resources/mapper/ 目录下创建 usermapper.xml,并通过 namespace 绑定 usermapper 接口。
<?xml version="1.0" encoding="utf-8" ?>
<!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.usermapper">
<!-- 查询所有用户 -->
<select id="findall" resulttype="com.example.demo.model.user">
select * from user
</select>
<!-- 根据用户名查询用户 -->
<select id="findbyusername" resulttype="com.example.demo.model.user">
select * from user where username = #{username}
</select>
<!-- 插入用户 -->
<insert id="insertuser">
insert into user (username, email) values (#{username}, #{email})
</insert>
</mapper>
3.2 xml 动态 sql 示例
mybatis 的动态 sql 标签可以用于构建灵活的 sql 语句,常见的动态 sql 标签有:
<if>:根据条件拼接 sql。<choose>:类似于switch-case。<where>:智能拼接条件。<foreach>:用于处理集合(如in查询)。
以下示例展示如何使用动态 sql 实现根据条件查询用户:
<select id="findbycondition" resulttype="com.example.demo.model.user">
select * from user
<where>
<if test="username != null">
and username = #{username}
</if>
<if test="email != null">
and email = #{email}
</if>
</where>
</select>
4. 复杂查询的实现
在实际开发中,复杂查询经常涉及多表关联查询、分页、动态条件查询等。mybatis-plus 提供了良好的支持,结合 sql 注解、xml 和查询构造器等机制,可以实现灵活的复杂查询。
4.1 多表关联查询
mybatis-plus 支持通过自定义 sql 实现多表关联查询(如 join 查询)。
<select id="finduserwithrole" resulttype="com.example.demo.model.user">
select u.id, u.username, r.role_name
from user u
left join role r on u.role_id = r.id
where u.id = #{id}
</select>
在此示例中,user 表通过 role_id 关联 role 表,查询用户的角色信息。
4.2 动态分页查询
结合 mybatis-plus 提供的分页插件和动态 sql,可以实现复杂的分页查询。首先,需要引入分页插件:
import com.baomidou.mybatisplus.extension.plugins.paginationinterceptor;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
@configuration
public class mybatisplusconfig {
@bean
public paginationinterceptor paginationinterceptor() {
return new paginationinterceptor();
}
}
然后在 usermapper.xml 中实现分页查询:
<select id="findbycondition" resulttype="com.example.demo.model.user">
select * from user
<where>
<if test="username != null">
and username = #{username}
</if>
<if test="email != null">
and email = #{email}
</if>
</where>
</select>
在服务层调用时使用分页功能:
import com.baomidou.mybatisplus.extension.plugins.pagination.page;
import com.example.demo.mapper.usermapper;
import com.example.demo.model.user;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.service;
import java.util.map;
@service
public class userservice {
@autowired
private usermapper usermapper;
public page<user> findusersbycondition(page<user> page, map<string, object> conditions) {
return usermapper.findbycondition(page, conditions);
}
}
5. 使用查询构造器进行复杂查询
mybatis-plus 提供了一个查询构造器 wrapper,用于简化条件查询。常见的查询构造器有:
- querywrapper:用于构建查询条件。
- updatewrapper:用于构建更新条件。
5.1 使用 querywrapper 进行复杂查询
querywrapper 是 mybatis-plus 提供的条件构造器,允许开发者使用链式语法构建查询条件。
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.example.demo.mapper.usermapper;
import com.example.demo.model.user;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.service;
import java.util.list;
@service
public class userservice {
@autowired
private usermapper usermapper;
public list<user> findusersbycondition(string username, string email) {
querywrapper<user> querywrapper = new querywrapper<>();
querywrapper.eq(username != null, "username", username)
.like(email != null, "email", email);
return usermapper.selectlist(querywrapper);
}
}
在此示例中,querywrapper 用于根据条件动态构建 sql 查询,eq 和 like 方法会根据传入的参数生成相应的 sql 语句。
5.2 使用 updatewrapper 进行复杂更新
类似于查询,updatewrapper 用于构建更新条件。
import com.baomidou.mybatisplus.core.conditions.update.updatewrapper;
public
void updateuseremail(integer id, string email) {
updatewrapper<user> updatewrapper = new updatewrapper<>();
updatewrapper.eq("id", id).set("email", email);
usermapper.update(null, updatewrapper);
}
6. 总结
mybatis-plus 提供了灵活的自定义 sql 和复杂查询机制,支持通过注解、xml 和查询构造器实现灵活的数据库操作。
- 注解方式:简单、直观,适合快速开发常见的 sql 操作。
- xml 方式:适用于复杂 sql 和动态 sql,通过 mybatis 提供的标签,可以灵活地编写条件查询、多表关联查询等。
- 查询构造器:通过
querywrapper和updatewrapper,开发者可以以链式语法构建复杂查询条件。
到此这篇关于mybatis-plus自定义sql和复杂查询的实现的文章就介绍到这了,更多相关mybatis-plus自定义sql和复杂查询内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论