码迷,mamicode.com
首页 > 数据库 > 详细

MyBatis(三)动态sql

时间:2021-03-18 14:36:54      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:实现   reac   字段   pen   get   查询   map   引用   重复   

放心!没走错,以下非广告!

技术图片

当我们挑选商品的时候,会选择一些条件进行筛选,因为不同的人甚至是同一个人每次选择的条件都是不同的,即是动态的,那我们要怎么把这些参数动态的传到sql语句中呢?MyBatis已经贴心的帮我们解决这个问题了!

MyBatis是支持动态sql。

以下为MyBatis支持的动态sql。

(1)if

如:

<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语句错误了)

(2)where

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。

(3)foreach

在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}

(4)set

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

(5)sql与include

有时候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>

MyBatis(三)动态sql

标签:实现   reac   字段   pen   get   查询   map   引用   重复   

原文地址:https://www.cnblogs.com/denghui-study/p/14553510.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!