【Java】MyBatis动态SQL

在MyBatis中使用动态SQL语句。

动态SQL是指根据参数数据动态组织SQL的技术。

生活中的案例:

在京东上买东西时,用户搜索商品,可以选择筛选条件,比如品牌,价格,材质等,也可以不使用筛选条件。这时候后台需要写多个查询模块吗?其实不需要,这时候可以用动态SQL语句,使用if标签决定在什么条件下要SQL语句要包含的内容。

if标签:

xml 复制代码
<if test="">  
	...
</if>

这个标签的作用可以理解为C++中的 #if ... #endif

示例:

xml 复制代码
<select id="selectDynamicSQL" parameterType="java.util.Map" resultType="com.hust.mybatis.entity.Goods">  
    select * from t_goods  
    where   
        <if test="categoryId != null">  <!--如果参数中:categoryId != null-->  
            category_id = #{categoryId} <!--则sql语句包含这句话-->  
        </if>  
        <if test="currentPrice != null">  
            and current_price &lt; #{currentPrice}  
        </if>  
</select>

可以在MyBatis中正常使用

java 复制代码
@Test  
public void testDynamicSQL() throws Exception {  
	SqlSession sqlSession = null;  
	try {  
		sqlSession = MyBatisUtils.openSession();  
//            Map param = new HashMap();  
		Map<String, Object> param = new HashMap<String, Object>();  
		param.put("categoryId", 44);  // 查询条件  
		param.put("currentPrice", 500);  
		
		List<Goods> list = sqlSession.selectList("com.hust.mybatis.entity.Goods.selectDynamicSQL", param);  
		for (Goods g : list) {  
			System.out.println(g.getTitle() + ": 【" + g.getCurrentPrice() + "】 -- " + g.getGoodsId());  
		}  
	} catch (Exception e) {  
		throw new RuntimeException(e);  
	} finally {  
		if (sqlSession != null) MyBatisUtils.closeSession(sqlSession);  
	}  
}

如果出现了报错,请检查一下这几个if标签有没有用逻辑运算符连接(and,or等)。

相关推荐
Flittly12 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了12 小时前
Java 生成二维码解决方案
java·后端
人活一口气16 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP18 小时前
Vibe Coding -- 完整项目案例实操
java
荣码18 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing18 小时前
Google第三方授权登录
java·后端·程序员
明月光81818 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑1 天前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯1 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路1 天前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java