在MyBatis中,使用XML配置进行LIKE
查询是一个常见的需求。以下是一个简单的例子,展示如何在MyBatis的XML映射文件中进行LIKE
查询。
假设我们有一个用户表users
,包含字段id
, name
, email
等,现在我们需要根据用户名的一部分来查询用户列表。
1. 创建SQL映射文件(UserMapper.xml)
在你的映射文件中,你可以这样定义一个LIKE
查询:
<?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.mapper.UserMapper">
<!-- 根据用户名部分匹配查询用户 -->
<select id="findUsersByName" parameterType="java.lang.String" resultType="com.example.model.User">
SELECT id, name, email
FROM users
WHERE name LIKE CONCAT('%', #{name}, '%')
</select>
</mapper>
2. 创建Mapper接口(UserMapper.java)
接下来,你需要创建对应的Mapper接口:
package com.example.mapper;
import com.example.model.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
List<User> findUsersByName(@Param("name") String name);
}
3. 创建User模型(User.java)
确保你有一个User类来映射数据库表中的字段:
package com.example.model;
public class User {
private Long id;
private String name;
private String email;
// Getters and Setters
}
4. 配置MyBatis
确保你的MyBatis配置文件(如mybatis-config.xml
)已经正确配置,并且包含了你的Mapper文件。
5. 使用Mapper
最后,你可以在你的服务或控制器中使用UserMapper
来进行查询:
package com.example.service;
import com.example.mapper.UserMapper;
import com.example.model.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
public class UserService {
private SqlSessionFactory sqlSessionFactory;
public UserService(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public List<User> searchUsersByName(String name) {
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
return userMapper.findUsersByName(name);
}
}
}
注意事项
- SQL注入防护:虽然MyBatis内置了参数绑定机制以防止SQL注入,但在处理
LIKE
查询时,确保不要直接拼接用户输入的值,而是使用参数绑定(如#{name}
)。 - 性能优化:
LIKE '%xxx%'
这种查询会导致全表扫描,性能较差。如果查询性能是关键,考虑使用全文索引或其他优化手段。
通过以上步骤,你应该能够在MyBatis中使用XML配置进行LIKE
查询。
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/18448005