在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 < #{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等)。