Mybatis-plus中输出组装好的SQL

本文介绍了在Mybatis-plus中如何输出完整的SQL语句,而非带有"?"占位符的部分。通过添加特定的日志配置或使用Mybatis-plus的拦截器,可以在调试时方便地获取可执行的SQL,提高开发效率。
摘要由CSDN通过智能技术生成

    在本地开发调试过程中,有时候需要输出PreparedStatement 的调用的SQL,也就是将每一个SQL调用语句都输出,按照文档的介绍,可以在配置中添加如下日志输出的配置。

# 配置slq打印日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    然而,可以观察日志,知道日志是分别输出若干部分带有"?"参数的SQL语句,也就是需要我们人手去替换"?",这样才可以得到一个完整可以执行的SQL,这个并不是我们要的,我们需要的是一个可以直接输出完整SQL的方法。

    Mybatis-plus 提供了类似于mybatis原生的拦截器一样的拦截器实现,我们只需要模仿官方提供的分页插件,在其之后,添加一个替换完"?"输出SQL的拦截器既可。

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        interceptor.addInnerInterceptor(new MyBatisPlusSqlLogInterc
### 回答1: MybatisPlus是一款优秀的ORM框架,它提供了丰富的API,可以方便地进行动态SQL拼接。在使用MybatisPlus进行动态SQL拼接时,我们可以使用Wrapper类来构建查询条件,例如: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name", "张三"); wrapper.gt("age", 18); wrapper.like("email", "@qq.com"); List<User> userList = userMapper.selectList(wrapper); ``` 在上面的代码,我们使用QueryWrapper类来构建查询条件,eq方法表示等于,gt方法表示大于,like方法表示模糊查询。最后,我们调用selectList方法执行查询,并将结果封装成List<User>对象返回。 除了QueryWrapper类,MybatisPlus还提供了LambdaQueryWrapper类,它可以使用Lambda表达式来构建查询条件,例如: ``` LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.eq(User::getName, "张三"); lambdaWrapper.gt(User::getAge, 18); lambdaWrapper.like(User::getEmail, "@qq.com"); List<User> userList = userMapper.selectList(lambdaWrapper); ``` 在上面的代码,我们使用LambdaQueryWrapper类来构建查询条件,eq方法、gt方法、like方法都可以使用Lambda表达式来表示。最后,我们调用selectList方法执行查询,并将结果封装成List<User>对象返回。 总之,MybatisPlus提供了丰富的API,可以方便地进行动态SQL拼接,让我们的开发更加高效、便捷。 ### 回答2: MybatisPlus是Mybatis的增强插件,它的主要功能是通过一些简单的配置,减少Mybatis的样板代码,提高开发效率。其最常用的功能之一是动态拼接SQL。 动态拼接SQLMybatisPlus强大的特性之一,它可以根据不同的条件来动态组合SQL语句,以适应不同的业务需求。 MybatisPlus提供了多种方法来实现动态拼接SQL,最常用的方法是使用Wrapper。Wrapper是一个具有强大功能的接口,可以用于拼接SQL的各个部分,例如WHERE子句、AND/OR条件、ORDER BY子句等。 例如,我们需要查询一个学校所有年龄大于20岁的学生,代码如下: ``` QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("school_id", 1001) .gt("age", 20); List<Student> studentList = studentMapper.selectList(queryWrapper); ``` 在这个例子,我们使用了QueryWrapper来动态拼接SQL。首先我们创建了一个QueryWrapper对象,然后使用eq方法和gt方法来设置条件。 其eq方法用于等值查询,它的参数是数据库表的列名和要查询的值。gt方法用于大于查询,它的参数是数据库表的列名和要查询的值。 最后,我们使用selectList方法执行该查询并返回结果。 除了上述方法,MybatisPlus还提供了LambdaQueryWrapper和UpdateWrapper等方法,用于更加方便的动态拼接SQL。这些方法可以帮助我们减少编写繁琐的SQL语句的时间和精力,从而提高开发效率。 ### 回答3: Mybatis-PlusMybatis的增强版,提供了更多的操作方法、注解等。动态拼接SQLMybatis-Plus非常强大的功能之一,允许我们在不写复杂SQL语句的情况下,根据不同的需求动态的生成SQLMybatis-Plus的动态SQL可以分为两种:XML动态SQL和注解动态SQL。 XML动态SQL可以使用if、choose、when、otherwise、foreach等建立一条动态的SQL语句,例如: ```xml <select id="getUserListByCondition" resultMap="resultMap"> SELECT * FROM user <where> <if test="name!=null and name!=''"> and name like concat('%',#{name},'%') </if> <if test="age!=null and age!=0"> and age = #{age} </if> <if test="sex!=null and sex!=''"> and sex = #{sex} </if> </where> </select> ``` 在这个例子,动态的拼接了一个where子句,如果参数包含name、age、sex属性的话,会将相应的条件拼接到SQL语句,达到动态的效果。 注解动态SQL可以使用@SelectProvider、@UpdateProvider、@DeleteProvider、@InsertProvider注解指定提供动态SQL实现的类,并指定类的方法。例如: ```java @Mapper public interface UserMapper extends BaseMapper<User> { @SelectProvider(type = UserSqlProvider.class, method = "getUserListByCondition") List<User> getUserListByCondition(UserCondition userCondition); } public class UserSqlProvider { public String getUserListByCondition(UserCondition userCondition){ return new SQL() {{ SELECT("*"); FROM("user"); if (userCondition.getName() != null && !userCondition.getName().isEmpty()) { WHERE("name like concat('%',#{name},'%')"); } if (userCondition.getAge() != null && userCondition.getAge() != 0) { WHERE("age = #{age}"); } if (userCondition.getSex() != null && !userCondition.getSex().isEmpty()) { WHERE("sex = #{sex}"); } }}.toString(); } } ``` 在这个例子,定义了一个UserSqlProvider类,其getUserListByCondition方法返回一个动态SQL语句。使用注解@SelectProvider指定了提供动态SQL的类和方法,使其成为动态SQL语句的提供者。 总之,动态拼接SQLMybatis-Plus的重要功能之一,可以使我们免去写复杂SQL的烦恼,使开发更加快速高效。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值