1 什么是动态SQL

2 逻辑判断

2.1 if标签

  1. 作用:条件满足则往sql语句添加标签中的内容
  2. 实例
    1. xml文件
  1. <!-- if标记,test属性是字符串类型的判断条件。判断条件中的变量是传入对象的属性、字典中的某个键值对 -->
  2. <select id="listProduct-if" resultType="Product">
  3. select * from product_
  4. <if test="name!=null">
  5. where name like concat('%',#{name},'%')
  6. </if>
  7. </select>

b. java文件

  1. System.out.println("查询所有的");
  2. List<Product> ps = session.selectList("listProduct-if");
  3. for (Product p : ps) {
  4. System.out.println(p);
  5. }
  6. System.out.println("模糊查询");
  7. // 通过hashmap存名字
  8. // Map<String,Object> params = new HashMap<>();
  9. // params.put("name","子");
  10. // 通过对象存名字
  11. Product params=new Product();
  12. params.setName("子");
  13. // 因为要使用属性来进行条件判断,因此不能传入基本类型数据
  14. List<Product> ps2 = session.selectList("listProduct-if",params);
  15. for (Product p : ps2) {
  16. System.out.println(p);
  17. }

2.2 choose when otherwise标签

  1. 作用:choose父标签下,when内容满足条件则往sql语句里添加内容,如果没有任何when满足则添加otherwise标签。
  2. 实例
    1. xml文件
  1. <<select id="listProduct-choose" resultType="Product">
  2. SELECT * FROM product_
  3. <where>
  4. <choose>
  5. <when test="name != null">
  6. and name like concat('%',#{name},'%')
  7. </when>
  8. <when test="price !=null and price != 0">
  9. and price > #{price}
  10. </when>
  11. <otherwise>
  12. and id >1
  13. </otherwise>
  14. </choose>
  15. </where>
  16. </select>
  1. java文件
  1. System.out.println("choose查询");
  2. List<Product> ps = session.selectList("listProduct-choose");
  3. for (Product p : ps) {
  4. System.out.println(p);
  5. }

3 动态查询条件、动态属性设置

3.1 where标签

  1. 作用:自动在标签内语句前添加where,并且去除前面多余的and|or。
  2. 实例
    1. xml文件
  1. <select id="listProduct-where" resultType="Product">
  2. select * from product_
  3. <where>
  4. <if test="name!=null">
  5. and name like concat('%',#{name},'%')
  6. </if>
  7. <if test="price!=null and price>0">
  8. and price > #{price}
  9. </if>
  10. </where>
  11. </select>
  1. java文件
  1. System.out.println("查询所有的");
  2. List<Product> ps = session.selectList("listProduct-where");
  3. for (Product p : ps) {
  4. System.out.println(p);
  5. }
  6. System.out.println("模糊查询-提供name 子");
  7. Product params1 = new Product();
  8. params1.setName("子");
  9. List<Product> ps2 = session.selectList("listProduct-where", params1);
  10. for (Product p : ps2) {
  11. System.out.println(p);
  12. }
  13. System.out.println("模糊查询-提供price 20");
  14. Product params2 = new Product();
  15. params2.setPrice((float)20);
  16. List<Product> ps3 = session.selectList("listProduct-where", params2);
  17. for (Product p : ps3) {
  18. System.out.println(p);
  19. }
  20. System.out.println("模糊查询-提供name 子和price 20");
  21. Product params3 = new Product();
  22. params3.setName("子");
  23. params3.setPrice((float)20);
  24. List<Product> ps4 = session.selectList("listProduct-where", params3);
  25. for (Product p : ps4) {
  26. System.out.println(p);

3.2 set标签

  1. 作用:自动在标签内语句前添加set,并且去除后面余的逗号,。
  2. 实例
    1. xml文件
  1. <update id="updateProduct-set" parameterType="Product">
  2. update product_
  3. <set>
  4. <if test="name != null">name=#{name},</if>
  5. <if test="price != null">price=#{price}</if>
  6. </set>
  7. where id=#{id}
  8. </update>
  1. java文件
  1. Product p = new Product();
  2. p.setId(6);
  3. p.setName("巴拉拉能量");
  4. p.setPrice(50.5f);
  5. session.update("updateProduct-set",p);
  6. System.out.println("查询所有的");
  7. List<Product> ps = session.selectList("listProduct-where");
  8. for (Product p1 : ps) {
  9. System.out.println(p1);
  10. }

3.3 trim标签,定制化内容

  1. 作用:定制化标签作用。

  2. 实例

    1. xml文件
  1. <!-- where标记prefix属性为WHERE,prefixOverrides属性为AND|OR -->
  2. <select id="listProduct-trim-where" resultType="Product">
  3. select * from product_
  4. <trim prefix="WHERE" prefixOverrides="AND|OR">
  5. <if test="name!=null">
  6. and name like concat('%',#{name},'%')
  7. </if>
  8. <if test="price!=null and price>0">
  9. and price > #{price}
  10. </if>
  11. </trim>
  12. </select>
  13. <!-- set标记prefix属性为SET,suffixOverrides属性为, -->
  14. <update id="updateProduct-trim-set" parameterType="Product">
  15. update product_
  16. <trim prefix="SET" suffixOverrides=",">
  17. <if test="name != null">name=#{name},</if>
  18. <if test="price != null">price=#{price}</if>
  19. </trim>
  20. where id=#{id}
  21. </update>
  1. java文件
  1. Product p = new Product();
  2. p.setId(6);
  3. p.setName("仙女棒");
  4. p.setPrice(90.8f);
  5. session.update("updateProduct-trim-set",p);
  6. System.out.println("查询price 20的");
  7. Product params = new Product();
  8. params.setPrice((float)20);
  9. List<Product> ps = session.selectList("listProduct-trim-where",params);
  10. for (Product p1 : ps) {
  11. System.out.println(p1);
  12. }

4 其他标签

4.1 foreach标签

  1. 作用:通常用where的in关键字作用,指定in的列表内容。

    <!— item:集合中元素迭代时的别名,该参数为必选。 index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选 open:foreach代码的开始符号,一般是(和close=”)”合用。常用在in(),values()时。该参数可选 separator:元素之间的分隔符,例如在in()的时候,separator=”,”会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。

close: foreach代码的关闭符号,一般是)和open=”(“合用。常用在in(),values()时。该参数可选。 collection:

要做foreach的对象,作为入参时,List对象默认用”list”代替作为键,数组对象有”array”代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。

除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection

= “ids”.如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection

= “ids.id” —>

  1. 实例
    1. xml文件
  1. <select id="listProduct-foreach" resultType="Product">
  2. SELECT * FROM product_
  3. WHERE ID in
  4. <foreach item="item" index="index" collection="list" open="("
  5. separator="," close=")">
  6. #{item}
  7. </foreach>
  8. </select>
  1. java文件
  1. System.out.println("查询1,3,4");
  2. List<Integer> ids = new ArrayList();
  3. ids.add(1);
  4. ids.add(3);
  5. ids.add(4);
  6. List<Product> ps = session.selectList("listProduct-foreach",ids);
  7. for (Product p : ps) {
  8. System.out.println(p);
  9. }

4.2 bind标签

  1. 作用:为该标签内一个新的变量绑定一个字符串。
  2. 实例
    1. xml文件
  1. <select id="listProduct-bind" resultType="Product">
  2. <bind name="likename" value="'%' + name + '%'" />
  3. select * from product_ where name like #{likename}
  4. </select>
  1. java文件
  1. System.out.println("bind查询");
  2. Map<String, String> params = new HashMap();
  3. params.put("name", "子");
  4. List<Product> ps = session.selectList("listProduct-bind", params);
  5. for (Product p : ps) {
  6. System.out.println(p);
  7. }

5 总结

5.1 逻辑判断

  1. if标签
  2. choose、when、otherwise标签充当if else标签的作用

    5.2 动态语句

  3. where标签用用在条件查询select中

  4. set标签用在update中
  5. trim标签定制化内容

    5.3 其他标签

  6. foreach标签用在sql语句的in关键字之后。

  7. bind标签用来绑定变量内容