springboot模糊查询

在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。
  数据库表名为test_student,初始化了几条记录,如图:
  数据库表内容
  
  起初我在MyBatis的mapper文件中是这样写的:

    <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        SELECT * FROM test_student
        <where> <if test="age != null and age != '' and compare != null and compare != ''"> age ${compare} #{age} </if> <if test="name != null and name != ''"> AND name LIKE '%#{name}%' </if> <if test="address != null and address != ''"> AND address LIKE '%#{address}%' </if> </where> ORDER BY id </select>

 

写完后自我感觉良好,很开心的就去跑程序了,结果当然是报错了:
报错

  经百度得知,这么写经MyBatis转换后(‘%#{name}%’)会变为(‘%?%’),而(‘%?%’)会被看作是一个字符串,所以Java代码在执行找不到用于匹配参数的 ‘?’ ,然后就报错了。

解决方法

1.用${…}代替#{…}

   <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        SELECT * FROM test_student
        <where> <if test="age != null and age != '' and compare != null and compare != ''"> age ${compare} #{age} </if> <if test="name != null and name != ''"> AND name LIKE '%${name}%' </if> <if test="address != null and address != ''"> AND address LIKE '%${address}%' </if> </where> ORDER BY id </select>

 

查询结果如下图:
查询结果

  注:使用${…}不能有效防止SQL注入,所以这种方式虽然简单但是不推荐使用!!!

2.把’%#{name}%’改为”%”#{name}”%”

   <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        SELECT * FROM test_student
        <where> <if test="age != null and age != '' and compare != null and compare != ''"> age ${compare} #{age} </if> <if test="name != null and name != ''"> AND name LIKE "%"#{name}"%" </if> <if test="address != null and address != ''"> AND address LIKE "%"#{address}"%" </if> </where> ORDER BY id </select>

 

查询结果:
查询结果

3.使用sql中的字符串拼接函数

   <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        SELECT * FROM test_student
        <where> <if test="age != null and age != '' and compare != null and compare != ''"> age ${compare} #{age} </if> <if test="name != null and name != ''"> AND name LIKE CONCAT(CONCAT('%',#{name},'%')) </if> <if test="address != null and address != ''"> AND address LIKE CONCAT(CONCAT('%',#{address},'%')) </if> </where> ORDER BY id </select>

 

 

查询结果:
查询结果

4.使用标签

   <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        <bind name="pattern1" value="'%' + _parameter.name + '%'" /> <bind name="pattern2" value="'%' + _parameter.address + '%'" /> SELECT * FROM test_student <where> <if test="age != null and age != '' and compare != null and compare != ''"> age ${compare} #{age} </if> <if test="name != null and name != ''"> AND name LIKE #{pattern1} </if> <if test="address != null and address != ''"> AND address LIKE #{pattern2} </if> </where> ORDER BY id </select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

查询结果:
查询结果

5.在Java代码中拼接字符串
  这个方法没试过,就不贴代码和结果了。

转载于:https://www.cnblogs.com/MaxElephant/p/8418276.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Spring Data JPA 中的 Query By Example(QBE)实现模糊查询。QBE 是一种基于实体类的动态查询方式,可以根据实体类的属性值来构建查询条件。具体实现步骤如下: 1. 创建一个实体类,该实体类中包含需要查询的属性。 2. 创建一个 Example 对象,将需要查询的属性值设置到该对象中。 3. 创建一个 ExampleMatcher 对象,设置匹配规则,如忽略大小写、模糊查询等。 4. 调用 JpaRepository 中的 findAll 方法,将 Example 对象和 ExampleMatcher 对象作为参数传入即可。 下面是一个示例代码: ```java // 实体类 @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; // getter 和 setter 略 } // DAO 接口 public interface UserRepository extends JpaRepository<User, Long> { } // Service 类 @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> findUsers(String name) { User user = new User(); user.setName(name); ExampleMatcher matcher = ExampleMatcher.matching() .withMatcher("name", match -> match.contains().ignoreCase()); Example<User> example = Example.of(user, matcher); return userRepository.findAll(example); } } ``` 以上代码实现了根据用户名进行模糊查询的功能。其中,ExampleMatcher 中的 withMatcher 方法用于设置匹配规则,"name" 表示要匹配的属性名,match.contains() 表示使用模糊查询,ignoreCase() 表示忽略大小写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值