mybatis常用查询语法集合

本文介绍三种SQL模糊查询方法:使用$符号、#符号及concat函数,并对比其优劣;同时提供两种日期范围查询的方法,包括使用date_format进行格式化及concat进行连接。
1、字符串的模糊匹配语法

第一种方式:使用 $ 符号编写
但是缺点就是 $ 符号无法防止sql注入问题

<if test="title != null  and title != ''"> and title like "%${title}%"</if>

第二种方式:使用 #  好处就是防止sql注入
因为#{...}解析成sql语句时候,会在变量外侧自动加单引号'  ',所以这里 % 需要使用双引号"  ",不能使用单引号 '  ',不然会查不到任何结果。

<if test="title != null  and title != ''"> and title like "%"#{title}"%"</if>

第三种方式:使用concat进行连接

<if test="title != null  and title != ''"> and title like concat('%', #{title} ,'%')</if>


2、日期查询语法

第一种方式:使用 date_format 字符串格式化操作
between date_format(#{beginTime},'%Y-%m-%d 00:00:00') and date_format(#{endTime},'%Y-%m-%d 23:59:59')

第二种方式:使用MySQL 函数 concat 连接操作
between concat(#{beginTime},' ','00:00:00') and concat(#{endTime},' ','23:59:59')

如果您认为本文对您有所帮助的话,不妨给作者点个赞,您的支持是我继续写作最大的动力,谢谢

### MyBatis 使用 Set 集合进行动态条件查询MyBatis 中,`<if>` 和 `<foreach>` 是两个常用的标签,用于实现动态 SQL 查询。如果需要根据 `Set` 集合的内容作为条件进行查询,则可以通过 `<foreach>` 标签遍历集合并生成对应的 SQL 条件。 以下是具体的实现方法: #### 实现方式 假设有一个 `User` 对象,其中包含一个字段 `emails`,它是一个 `Set<String>` 类型的集合。我们需要通过这个集合中的邮箱地址来查询符合条件的用户记录。 ##### 映射文件配置 (`Mapper.xml`) ```xml <select id="selectUsersByEmails" parameterType="map" resultType="com.example.User"> SELECT * FROM users WHERE 1=1 <if test="emails != null and emails.size() > 0"> AND email IN <foreach collection="emails" item="email" open="(" separator="," close=")"> #{email} </foreach> </if> </select> ``` 上述代码中: - `WHERE 1=1` 是为了便于后续拼接更多的条件[^1]。 - `<if>` 判断传入的参数 `emails` 是否为空或者大小是否大于零[^3]。 - `<foreach>` 遍历 `emails` 集合,并将其转换为 SQL 的 `IN` 子句的一部分[^4]。 ##### Java 方法调用 ```java public List<User> selectUsersByEmails(Set<String> emails) { Map<String, Object> params = new HashMap<>(); params.put("emails", emails); return sqlSession.selectList("selectUsersByEmails", params); } ``` 在此处: - 将 `Set<String>` 转换为 `Map` 参数传递给 MyBatis[^2]。 - 使用 `sqlSession.selectList()` 执行查询操作。 --- ### 注意事项 1. **空集处理** 当 `Set` 集合为空时,应确保不会生成错误的 SQL 语法。因此,在 `<if>` 标签下进行了非空校验[^3]。 2. **性能优化** 如果集合较大,建议分批执行查询以减少单次查询的压力[^4]。 3. **SQL 注入防护** 使用 `#{}` 占位符代替 `${}`,从而防止潜在的 SQL 注入风险[^3]。 --- #### 示例运行结果 假设有如下数据表结构和数据: | id | name | email | |----|----------|----------------| | 1 | Alice | alice@example.com | | 2 | Bob | bob@example.com | | 3 | Charlie | charlie@example.com | 调用方法时传入以下参数: ```java Set<String> emails = new HashSet<>(Arrays.asList("alice@example.com", "bob@example.com")); List<User> users = userDao.selectUsersByEmails(emails); ``` 最终生成的 SQL 如下: ```sql SELECT * FROM users WHERE 1=1 AND email IN ('alice@example.com', 'bob@example.com'); ``` 返回的结果将是 ID 为 1 和 2 的两条记录。 --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值