08【MyBatis之动态SQL】_动态sql中可以出现set集合吗

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


* 测试类:



package com.dfbz.test;

import com.dfbz.dao.EmpDao;
import com.dfbz.entity.Condition;
import com.dfbz.entity.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
* @author lscl
* @version 1.0
* @intro:
*/

public class Demo01 {

private SqlSessionFactory factory;
private SqlSession session;

@Before
public void before() throws IOException {
    InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    factory = builder.build(is);
    session = factory.openSession(true);     
}

@After
public void after() throws IOException {          
    session.close();
}

@Test
public void test1() throws Exception{
    Emp emp = empDao.findByIdAndName(1, "张三");
    System.out.println(emp);
}

}


### 2.2 动态 SQL 之`<where>`标签


为了简化上面 `where 1=1` 的条件拼装,我们可以采用`<where>`标签来简化开发。



<?xml version="1.0" encoding="UTF-8"?> select * from emp and id=#{id} and name=#{name}


> 
> Tips:**where只能帮我们去除前and,不能帮助我们去除后and(where标签除了可以智能的去除and,也可以智能的去除or)**
> 
> 
> 


### 2.3 动态标签之`<foreach>`标签


我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。这样我们将如何进行参数的递?


MyBatis在传递集合时,将集合的key设置为:**collection(List集合、Set集合等)**,在mapper.xml中,使用`#{collection}`就可以获取到集合的值,如果是List类型的集合,还可以使用`#{list}`来获取到集合的值,如果是数组类型,那么需要使用`#{array}`来获取值


#### 2.3.1 传递List集合


* dao接口:



List findByIds(List ids);


* mapper.xml:



select * from emp id in #{id}

* 测试:



@Test
public void test2() {
//创建id
List ids = Arrays.asList(1, 2, 3);

List<Emp> empList = empDao.findByIds(ids);
for (Emp emp : empList) {
    System.out.println(emp);
}

}


#### 2.3.2 传递Set和数组


* dao接口:



List findByIds2(Set ids);

List findByIds3(Integer[] ids);


* mapper.xml:



select * from emp id in #{id} select * from emp id in #{id}

* 测试类:



@Test
public void test3() {

HashSet<Integer> ids = new HashSet<>(Arrays.asList(1, 2, 3));

List<Emp> empList2 = empDao.findByIds2(ids);
List<Emp> empList3 = empDao.findByIds3(new Integer[]{1,2,3});

System.out.println(empList2);
System.out.println(empList2);

}


### 2.4 `<choose>`组合标签


choose 相当于 java 里面的 switch 语句。otherwise(其他情况)


* dao接口:



List findByEmp(Emp emp);


* 测试类:



@Test
public void test4() {

Emp emp = new Emp();
emp.setId(1);
emp.setName("张%");

List<Emp> empList = empDao.findByEmp(emp);

System.out.println(empList);

}


* mapper.xml:



select * from emp and id=#{id} and name like #{name} and 1!=1

* 测试类:



@Test
public void test4() {

Emp emp = new Emp();
emp.setId(1);
emp.setName("张%");

List<Emp> empList = empDao.findByEmp(emp);

System.out.println(empList);

}


### 2.5 `<set>`标签


set标签和where标签很类似,set标签主要是用在更新操作的时候,如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。


* dao接口:



void update(Emp emp);


* mapper.xml:



update emp name = #{name}, age = #{age}, addr = #{addr}, salary = #{salary}, where id=#{id}

* 测试类:



@Test
public void test5() {

empDao.update(new Emp(1,"张三三",null,null,null));

}



> 
> **Tips:与where标签不同的是,set标签能够去除多余的前后**`,`
> 
> 
> 


### 2.6 `<trim>`标签


trim标签的作用和where标签类似,不过**trim标签可以定制化去除的内容和增加的内容**,where标签只能增加where,去除and、or等;


* trim标签使用说明:




| 属性 | 说明 |
| --- | --- |
| prefix | 给SQL语句拼接的前缀 |
| suffix | 给SQL语句拼接的后缀 |
| prefixOverrides | 去除的前缀 |
| suffixOverrides | 去除的后缀 |


#### 2.6.1 去除前缀


* dao接口:



List findByIdOrName(@Param(“id”) Integer id,@Param(“name”) String name);


* mapper.xml:



select * from emp
<!--

prefix: 如果trim标签内的内容有一个成立,那么增加where前缀
prefixOverrides: 去除前面拼接的and 或者 or 使得SQL语法正确
–>


or id = #{id}


or name = #{name}



* 测试:



@Test
public void test6() {
List empList = empDao.findByIdOrName(1, “张三”);
System.out.println(empList);
}


#### 2.6.2 去除后缀


* dao接口:



void update2(Emp emp);


* mapper.xml:





## 学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7a04c5d629f1415a9e35662316578e07.png#pic_center)



**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值