mybatis plus 自定义 SQL 模糊查询区分大小写
时间: 2024-11-11 17:14:41 浏览: 40
MyBatis Plus是一个基于MyBatis的ORM框架增强工具,它提供了一些便利的功能,包括简化SQL编写、支持自定义SQL等。对于自定义SQL的模糊查询,如果需要区分大小写,通常需要你在编写动态SQL的时候明确指定`lower`或`upper`函数来进行转换。
例如,如果你有一个字段名为`name`,你想进行区分大小写的模糊查询,可以这样做:
```sql
SELECT * FROM table_name WHERE name LIKE concat('%', #{keyword}, '%') ESCAPE '\' AND lower(name) LIKE lower(#{keyword})
```
这里使用了`lower`函数将查询的关键字和数据库中的`name`字段都转换为小写再做匹配,从而实现区分大小写的模糊查询。记得替换`table_name`为你实际的表名,`#{keyword}`为传入的搜索关键字。
如果你想要在查询时关闭自动的大小写转换,可以在创建QueryWrapper对象时设置`queryWrapper.setCaseSensitive(true)`,但这可能会导致不符合预期的结果,除非你的业务需求明确要求如此。
相关问题
Mybatis-plus不区分大小写
Mybatis-plus默认是区分大小写的,但是可以通过设置相关配置来实现不区分大小写的查询。
1. 在Mybatis-plus的配置文件中,添加如下配置:
```xml
<configuration>
<!-- 开启驼峰命名 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 自定义SQL注入器 -->
<global-config>
<sqlInjector type="com.baomidou.mybatisplus.core.injector.methods.LogicSqlInjector">
<property name="sqlParser" ref="mybatis-plus-sql-parser"/>
</sqlInjector>
</global-config>
<!-- 自定义SQL解析器 -->
<bean id="mybatis-plus-sql-parser" class="com.baomidou.mybatisplus.extension.parsers.JsqlParserCountOptimize">
<constructor-arg value="mysql"/>
</bean>
</configuration>
```
2. 在使用Mybatis-plus的Mapper时,使用Wrapper的LambdaQueryWrapper构造方法,并使用函数lower或upper将查询条件转为小写或大写,例如:
```java
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername, "admin").or().eq(User::getUsername, "ADMIN");
```
可以修改为:
```java
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername, "admin")
.or(wrapper -> wrapper.eq(User::getUsername, "ADMIN").or().eq(User::getUsername, "admin").or().eq(User::getUsername, "Admin"));
```
其中,通过函数lower将查询条件转为小写,再与小写的"admin"进行比较,这样就可以实现不区分大小写的查询。
mybatis-plus in查询忽略大小写怎么做
MyBatis-Plus是一个基于MyBatis的简化整合工具,它提供了一些便捷的功能,包括对SQL的自动处理。如果你想要在IN查询中忽略大小写,你可以利用其提供的动态SQL特性。
首先,你需要创建一个包含大小写不敏感比较条件的自定义拦截器或者全局通用Mapper方法。例如,可以创建一个`CaseInsensitiveInInterceptor`:
```java
public class CaseInsensitiveInInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
ParameterMetaData parameter = invocation.getArgs()[0];
if (parameter != null && parameter.getProperty() != null) {
String columnName = parameter.getProperty().getName();
// 这里使用String的toLowerCase()方法将值转换为小写
String sql = ((SqlSession sqlSession) invocation.getArgs()[1]).getMapper().buildSqlWithoutParameterMarker(columnName);
// 将查询中的所有值也转为小写
List<Object> values = new ArrayList<>(invocation.getArgs()[2].size());
for (Object value : invocation.getArgs()[2]) {
values.add(value.toString().toLowerCase());
}
Object result = sqlSession.selectList(sql, values.toArray());
return result;
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
```
然后,在配置文件中启用这个拦截器:
```xml
<plugins>
<plugin interceptor="com.example.CaseInsensitiveInInterceptor"/>
</plugins>
```
最后,你在Mapper接口的方法上使用`@GlobalConfig`注解,标记该方法需要应用这个拦截器:
```java
@GlobalConfig(casesensitiveInStatement = false)
List<User> findByPropertyNotIgnoreCase(@Param("property") String property, @Param("values") Collection<String> values);
```
这样,在`findByPropertyNotIgnoreCase`方法的IN查询中,MyBatis-Plus会自动忽略大小写地匹配值。
阅读全文