2020-09-23 14:24:55
动态SQL的核心在于根据不同条件生成不同的SQL语句,以提高灵活性和减少冗余逻辑。以下是三种常见的实现方式及其详细说明:

通过条件判断拼接SQL片段,直接生成完整语句。
示例代码:
String sql = "SELECT * FROM users WHERE 1=1"; String name = request.getParameter("name");String email = request.getParameter("email");if (name != null && !name.isEmpty()) { sql += " AND name LIKE '%" + name + "%'";}if (email != null && !email.isEmpty()) { sql += " AND email = '" + email + "'";}Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(sql);优点:
缺点:
适用场景:快速原型开发或简单查询,但需严格过滤输入。
2. SQL预处理语句(PreparedStatement)使用占位符(?)替代参数值,避免直接拼接,提升安全性。
示例代码:
String sql = "SELECT * FROM users WHERE 1=1";List<Object> params = new ArrayList<>();String name = request.getParameter("name");String email = request.getParameter("email");if (name != null && !name.isEmpty()) { sql += " AND name LIKE ?"; params.add("%" + name + "%");}if (email != null && !email.isEmpty()) { sql += " AND email = ?"; params.add(email);}PreparedStatement pstmt = connection.prepareStatement(sql);for (int i = 0; i < params.size(); i++) { pstmt.setObject(i + 1, params.get(i));}ResultSet rs = pstmt.executeQuery();优点:
缺点:
适用场景:中等复杂度项目,需兼顾安全性与性能。
3. ORM框架(如MyBatis)通过标签(如<if>、<where>)实现动态SQL,支持高级映射。
示例代码(MyBatis):
<select id="findUsers" parameterType="map" resultType="User"> SELECT * FROM users <where> <if test="name != null and name != ''"> AND name LIKE #{name} </if> <if test="email != null and email != ''"> AND email = #{email} </if> </where></select>优点:
缺点:
适用场景:复杂项目,需频繁动态SQL且追求开发效率。
选择建议通过合理选择动态SQL实现方式,可显著提升开发灵活性与系统安全性,适应不同规模项目的需求。