标签:实现 reac 字段 pen get 查询 map 引用 重复
放心!没走错,以下非广告!
当我们挑选商品的时候,会选择一些条件进行筛选,因为不同的人甚至是同一个人每次选择的条件都是不同的,即是动态的,那我们要怎么把这些参数动态的传到sql语句中呢?MyBatis已经贴心的帮我们解决这个问题了!
MyBatis是支持动态sql。
以下为MyBatis支持的动态sql。
如:
<select id="selectIf" parameterType="products" resultType="products">
select * from products
where 1=1
<if test="pname != null">
and pname = #{pname}
</if>
<if test="cid != null">
and cid = #{cid};
</if>
</select>
test里面书写条件,where 1=1 是用来消除and的(如果没有where 1=1 就会变成where and,就sql语句错误了)
where就是用来消除 if 中第一个and的情况的。
<select id="selectIf" parameterType="products" resultType="products">
select * from products
<where>
<if test="pname != null">
and pname = #{pname}
</if>
<if test="cid != null">
and cid = #{cid};
</if>
</where>
</select>
将if条件包裹在where条件里,会自动的消除第一个and。
在Products.java中新添加一个int []ids属性,并且加上setter/getter方法,以及重写toString();
foreach用于遍历一个数组或集合中的元素,常用于in或not in。
<select id="selectForeach" parameterType="products" resultType="products">
select * from products
<where>
<if test="ids != null">
<foreach collection="ids" open="pid in (" separator="," close=")" item="id">
#{id}
</foreach>
</if>
</where>
</select>
测试:(只截取片段代码)
ProductsMapper mapper = sqlSession.getMapper(ProductsMapper.class);
Products product = new Products();
int []ids = new int[]{1,2,3,4,5};
product.setIds(ids);
List<Products> products = mapper.selectForeach(product);
for (Products product1 : products) {
System.out.println(product1);
}
结果:
Products{pid=1, pname=‘泰国大榴莲‘, price=98.0, pdate=null, cid=‘s001‘, ids=null}
Products{pid=2, pname=‘新疆大枣‘, price=38.0, pdate=null, cid=‘s002‘, ids=null}
Products{pid=3, pname=‘新疆切糕‘, price=68.0, pdate=null, cid=‘s001‘, ids=null}
Products{pid=4, pname=‘十三香‘, price=10.0, pdate=null, cid=‘s002‘, ids=null}
Products{pid=5, pname=‘老干妈‘, price=20.0, pdate=null, cid=‘s002‘, ids=null}
set是方便用于做update操作的。
因为当我们在做update操作时,要判断传过来的数据是否为null或‘‘,如果最后一个不符合条件,那么整个的sql语句就可能会多一个,
而set标签就是用于去除sql语句中最后一个,的。
<!-- 如果price条件不成立,那么pname = #{pname} 后面就会多一个,-->
<update id="updateSet" parameterType="products">
update products
<set>
<if test="pname != null and pname != ‘‘">
pname = #{pname},
</if>
<if test="price != null and price > 0">
price = #{price}
</if>
</set>
<where>
<if test="pid != null">
pid = #{pid}
</if>
</where>
</update>
测试:
ProductsMapper mapper = sqlSession.getMapper(ProductsMapper.class);
Products product = mapper.selectByPrimaryKey(1);
product.setPname("新疆榴莲");
//将price设置为负数
product.setPrice(-10);
int i = mapper.updateSet(product);
System.out.println(i);
sqlSession.commit();
结果:执行成功
1
有时候sql语句中的片段会经常的出现,比如查询某些字段,这个时候就可以使用include了。
include可以实现sql语句片段的重用。
<!--重复的片段-->
<sql id="all">pid,pname,price,cid</sql>
<!--使用include引用-->
<select id="selectByPrimaryKey" parameterType="int" resultType="products">
select
<include refid="all"/>
from products where pid = #{pid}
</select>
标签:实现 reac 字段 pen get 查询 map 引用 重复
原文地址:https://www.cnblogs.com/denghui-study/p/14553510.html