SQL语句的模糊查询

本文介绍了一个Java中的单元测试案例,该案例使用了JdbcUtils获取数据库连接,并禁用了自动提交功能,通过BookInfoVoDaoImpl类的方法findBookInfoVoById查询书籍信息。此测试用例演示了如何设置SQL参数并执行包含LIKE子句的复杂查询。
@Test
	public void testFindBookById() throws SQLException {
		Connection conn = JdbcUtils.getConn();
		conn.setAutoCommit(false);
		ConnectionProvider.newInstance().bind(conn);
		//System.out.println("'%"+""+"%'");
		System.out.println(new BookInfoVoDaoImpl().findBookInfoVoById(8,"%%","%%"));
		conn.commit();
	}

在Java中sql语句用占位符代替,传入参数的时候不需要单引号,因为本来就是字符串

i.bookcase = c.id where "
				+ "i.id = ? and i.barcode like ? and i.bookname like ?"


### SQL 模糊查询的语法和使用示例 SQL 中的模糊查询主要通过 `LIKE` 运算符实现,通常与通配符结合使用。以下是常见的语法和使用示例。 #### 1. `LIKE` 与通配符的基本用法 模糊查询的核心语法是使用 `LIKE` 关键字,结合通配符 `%` 和 `_`。其中: - `%` 表示任意数量的字符(包括零个字符)。 - `_` 表示单个字符。 例如,查询所有以 "A" 开头的记录: ```sql SELECT * FROM table_name WHERE column_name LIKE 'A%'; ``` 查询所有以 "A" 开头且后面跟着一个任意字符的记录: ```sql SELECT * FROM table_name WHERE column_name LIKE 'A_'; ``` #### 2. 使用 `CONCAT` 函数进行模糊匹配 在某些情况下,可能需要动态构造模糊查询条件。可以使用 `CONCAT` 函数将 `%` 通配符与参数结合,例如: ```sql SELECT * FROM table_name WHERE column_name LIKE CONCAT('%', 'search_term', '%'); ``` 此查询将返回包含 "search_term" 的所有记录 [^2]。 #### 3. 防止 SQL 注入的方法 为了防止 SQL 注入攻击,推荐使用预处理语句(如 `#{} ` 语法)而不是直接拼接字符串。例如,在 MyBatis 框架中,使用 `#{} ` 语法来安全地传递参数: ```xml <select id="selectLike01" resultType="com.xissl.model.Book"> SELECT * FROM t_mvc_book WHERE bname LIKE #{bname}; </select> ``` 此方法通过预处理防止 SQL 注入 [^1]。 #### 4. 使用 `${}` 的注意事项 虽然 `${}` 语法可以用于字符串替换,但它不能防止 SQL 注入,因此不推荐在生产环境中使用。例如: ```xml <select id="selectLike02" resultType="com.xissl.model.Book"> SELECT * FROM t_mvc_book WHERE bname LIKE '${bname}'; </select> ``` 这种方式容易受到 SQL 注入攻击,需谨慎使用 [^1]。 #### 5. 使用 `BIND` 方法进行模糊查询 推荐使用 `BIND` 方法来构造模糊查询条件,例如: ```xml <select id="findStudentLikeSname" resultType="student"> <bind name="keyn" value="'%' + _parameter + '%'"/> SELECT * FROM student WHERE sname LIKE #{keyn}; </select> ``` 此方法通过 `BIND` 标签动态生成模糊查询条件,既安全又灵活 [^2]。 #### 6. 业务层处理模糊查询 在某些情况下,可以在业务层处理模糊查询条件,例如: ```xml <select id="selectLike03" resultType="com.xissl.model.Book"> SELECT * FROM t_mvc_book WHERE bname LIKE concat('%', #{bname}, '%'); </select> ``` 此方法通过 `CONCAT` 函数在 SQL 层面构造模糊查询条件 [^1]。 ### 示例代码 以下是一个完整的 SQL 查询示例,展示如何使用 `LIKE` 进行模糊查询: ```sql -- 查询所有以 "A" 开头的记录 SELECT * FROM table_name WHERE column_name LIKE 'A%'; -- 查询所有包含 "search_term" 的记录 SELECT * FROM table_name WHERE column_name LIKE CONCAT('%', 'search_term', '%'); -- 查询所有以 "A" 开头且后面跟着一个任意字符的记录 SELECT * FROM table_name WHERE column_name LIKE 'A_'; ``` ### 总结 SQL 模糊查询通过 `LIKE` 运算符和通配符实现,结合 `CONCAT` 函数或框架提供的预处理语法(如 `#{} `)可以更安全地构造查询条件。为防止 SQL 注入,应优先使用预处理语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值