网站挑错,最全做暖暖网站,魔艺极速建站,网站建设一年能收入多少钱部分业务可能会需要根据参数不同而查询不同的表#xff0c;或者查询不同的字段。使用MyBatis-Plus可以很方便地实现这种需求#xff0c;甚至不需要使用.xml文件。 三张数据表user、user1、user2内容都如下#xff1a;
idnameagesex1张三1812李四nullnull3或者查询不同的字段。使用MyBatis-Plus可以很方便地实现这种需求甚至不需要使用.xml文件。 三张数据表user、user1、user2内容都如下
idnameagesex1张三1812李四nullnull3nullnullnull
方式一
在UserMapper.java中使用Select注解动态改变要查询的表或字段 UserMapper.java
public interface UserMapper extends BaseMapperUser {Select(select ${column1} from ${table1} where ${column2} #{variable1})String test(Param(column1) String column1,Param(table1) String table1,Param(column2) String column2,Param(variable1) String variable1);
}使用Test调用测试service层实现类的代码如下
Override
public String test() {return baseMapper.test(name, user, id, 1);
}得到控制台打印输出
JDBC Connection [HikariProxyConnection530131514 wrapping com.mysql.cj.jdbc.ConnectionImpl30bf26df] will not be managed by SpringPreparing: select name from user where id ?Parameters: 1(String)Columns: nameRow: 张三Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession3f362135]
张三这种方式实现了动态更改要查询的表名或字段但是必须要注意
Select注解中如果将表名、字段名作为传参必须使用$不能使用#因为#会给传递的参数带上引号导致sql语法错误Param只有在仅一个参数且名称相同时可以省略否则必须带上
方式二
使用拦截器的方式将表名修改掉。在任意位置建一个MyBatis-Plus的配置类
package cn.ly.mptest.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author : Liuyuan*/
Configuration
public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor new DynamicTableNameInnerInterceptor();dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) - {String newTable user1;return newTable;});interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);return interceptor;}
}改变返回的newTable的值即可更换查询的表。在Test中调用
Test
void test() {User byId userService.getById(1);System.out.println(byId.getName());
}可以看到输出台打印的真正查询语句
JDBC Connection [HikariProxyConnection1958242673 wrapping com.mysql.cj.jdbc.ConnectionImpl1f9d4b0e] will not be managed by SpringPreparing: SELECT id,name,age,sex FROM user1 WHERE id?Parameters: 1(Integer)Columns: id, name, age, sexRow: 1, 张三1, null, nullTotal: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession7d979d34]
张三1可以看到虽然使用的是User实体类但是依然查询的from user1。 这种方式不同MyBatis-Plus版本会有不同写法可以参考这两篇博客 博客1 博客2