spring-boot

spring boot learning note

idea的配置以及问题

开启自动热部署,但是要手动进行处理(暂时没有解决,或者降级到2021版本进行处理)

1
2
3
spring.devtools.restart.enabled=true
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/static

基本路由建立以及用法

类的注解

1
2
@RestController //只是请求数据
@Controller //请求页面和数据

//上述两种注解是用于标识类的用法是用于处理http请求的

方法的注解

1
2
3
4
5
@GetMapping("/") //用于get请求跳转
@PostMapping("/") //用于post请求跳转
//具有各种请求方式,但是可以直接在@RequestMapping地方直接改变
@RequestMapping(value = "/post", method = RequestMethod.POST) //可以使用value决定路由,method决定请求方式
@Override //重写方法

变量的注解

1
2
3
@RequestBody //限制使用json格式传参
@RequestParam //用于变量的绑定,常用于变量出现冲突的情况
//@RequestParam(required = false, value = "file2"),false表示不一定需要该变量,value是形参
1
2
3
4
5
6
7
8
9
10
11
@PathVariable

//使用方式:
@RequestMapping(value="/demo2/{name}/{id}")
public void demo2(@PathVariable String name, @PathVaribale int id)
{
System.out.println("get name is : " + name + ", id: " + id);
return;
}

@PathParam同上

静态文件

1
2
3
4
5
spring.mvc.static-path-pattern=/image/**
//用于配置静态文件访问的url,只有在出现这样的http://localhost:8080/image/1.txt这样的路径才会对静态文件进行搜索,相当于路径上的映射,真正的资源加载是在spring.resources.static-locations中决定的

spring.resources.static-locations=classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources
使用“http://localhost:8080/image/1.txt”就会在上述的四个路径中依次查找是否存在“1.txt”文件,如果找到了,则返回此文件,否则返回404错误。

文件上传

1
2
MultipartFile file //接受文件的对象
HttpServletRequest //HttpServletRequest对象代表客户端的请求,封装了基本的Http请求所需要的信息

MultipartFile方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
getName(); 
// 获取表单中文件组件的名字

getOriginalFilename();
//获取源文件的昵称

getContentType()
//返回文件的内容类型

isEmpty()
判断是否为空,或者上传的文件是否有内容

getSize()
返回文件大小 以字节为单位

getBytes()
//将文件内容转化成一个byte[] 返回

getInputStream()
//返回InputStream读取文件的内容

getResource()
//返回Resource类型,需要的话方便后续操作

transferTo(File var1)
//transferTo是复制file文件到指定位置(比如D盘下的某个位置),不然程序执行完,文件就会消失,程序运行时,临时存储在temp这个文件夹中

HttpServletRequest内置方法

客户机信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
getRequestURL()
//返回客户端发出请求时的完整URL。

getRequestURI()
//返回请求行中的资源名部分。

getQueryString ()
//返回请求行中的参数部分。

getRemoteAddr()
//返回发出请求的客户机的IP地址。

getPathInfo()
//返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以"/"开头。

getRemoteHost()
//返回发出请求的客户机的完整主机名。

getRemotePort()
//返回客户机所使用的网络端口号。

getLocalAddr()
//返回WEB服务器的IP地址。

getLocalName()
//返回WEB服务器的主机名。

客户机请求头

1
2
3
4
5
getHeader(string name)方法:String

getHeaders(String name)方法:Enumeration

getHeaderNames()方法

绝对路径获取

1
getServletContext().getRealPath(path)

拦截器

image-20230713132824655

1
2
3
4
5
6
7
public class login implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) {
System.out.println("login sucess ");
return true;
}
}

继承HandlerInterceptor(拦截器类),重写preHandle,在内部可以添加条件以此判断是否给予权限,相当于一个身份判断

1
2
3
4
5
6
7
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new login()).addPathPatterns();
}
}

使用Configuration注解(自动读取,表明当前类是一个配置类),继承WebMvcConfigurer(配置类),重写addInterceptors,使用addInterceptor表明拦截逻辑的调用,addPathPatterns表明了是拦截访问的路径(权限分级和区分)

sql

单表查询与条件查询

引入配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--        MyBatisP1us依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!-- -mysql驱动依赖一>-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据连接池druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
1
@MapperScan  //当Mapper过多的时候,为了方便,给主程序添加MapperScan,作用就是会自动扫描并且给指定路径下的所有文件自动添加Mapper注解

UserMap.java

1
2
3
4
5
6
7
8
9
10
@Mapper
public interface UserMap {
@Select("select * from user")
public List<User> find();

@Insert("INSERT INTO user VALUES (#{username},#{password})")
public void insert(User user);

}
//写map(即定义sql语句文件下),使用interface实现多重继承,以便完成更多操作,可以对接下来的sql语句进行修改

在另外专门控制sql的地方进行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RestController
public class UserContrllor {
@Autowired
private UserMap userMap;

@GetMapping("/user")
public List query(){
List<User> list = userMap.find();
// System.out.println(list);
return list;
}

@PostMapping("/user")
public String save(User user){
userMap.insert(user);
return "sucess";
}
}

其中@Autowired可以自动将语句进行注入,然后实例化usermap进行调用对应函数即可,对于变量只需要使用**#{value}**进行放置,然后引入的包就会自动将变量对应注入(注意变量名需要和数据库的名称相同)

除此之外还可以使用其他的方法进行实现sql

1
2
3
@Mapper
public interface UserMap extends BaseMapper<User> {
}

直接继承BaseMapper类对其进行使用,但是从灵活性来说可以自定义出一个类对其进行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;

public class UserService {

// 查询操作
public User getUserByName(String name) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", name);
return userMapper.selectOne(queryWrapper);
}

// 插入操作
public void addUser(User user) {
userMapper.insert(user);
}

// 更新操作
public void updateUser(User user) {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", user.getId())
.set("name", user.getName())
.set("age", user.getAge());
userMapper.update(null, updateWrapper);
}

// 删除操作
public void deleteUserByName(String name) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", name);
userMapper.delete(queryWrapper);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
where		WHERE 语句,拼接 + WHERE 条件
and AND 语句,拼接 + AND 字段=值
andNew AND 语句,拼接 + AND (字段=值)
or OR 语句,拼接 + OR 字段=值
orNew OR 语句,拼接 + OR (字段=值)
eq 等于=
allEq 基于 map 内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查询 LIKE
notLike 模糊查询 NOT LIKE
in IN 查询
notIn NOT IN 查询
isNull NULL 值查询
isNotNull IS NOT NULL
groupBy 分组 GROUP BY
having HAVING 关键词
orderBy 排序 ORDER BY
orderAsc ASC 排序 ORDER BY
orderDesc DESC 排序 ORDER BY
exists EXISTS 条件语句
notExists NOT EXISTS 条件语句
between BETWEEN 条件语句
notBetween NOT BETWEEN 条件语句
addFilter 自由拼接 SQL
last 拼接在最后,例如:last("LIMIT 1")

以及会出现需要操作的类和sql中的表明不一样的情况,那么就可以对需要操作的类进行注解

1
2
3
@TableName("user")
@TableId(type = IdType.AUTO) //定义自增的id值
@TableField(value = "username",exist = true) //定义字段名(两者冲突)以及是否存在

CRUD 接口 | MyBatis-Plus (baomidou.com)

多表查询

新建一个OrderMap.java

1
2
3
4
5
@Mapper
public interface OrderMap extends BaseMapper<User> {
@Select("select * from t_order where userid = #{userid}")
int selectOrder(int userid);
}

里面写入查询语句和条件

在UserMap中写入

1
2
3
4
5
6
7
8
9
10
11
@Mapper
public interface UserMap extends BaseMapper<User> {
@Select("select * from user")
@Results({
@Result(column = "username",property = "username"),
// @Result(column = "password",property = "password"),
@Result(column = "userid",property = "userid",javaType = User.class,many = @Many(select = "com.example.demo.entity.OrderMap.selectOrder"))
})
List<User> selectAll();
}

使用Result来对其进行处理,column是sql表的列名,property是类的变量名

1
column = "userid",property = "userid",javaType = User.class,many = @Many(select = "com.example.demo.entity.OrderMap.selectOrder")

这句话javaType使用的是将关联查询的结果返回为User对象,当然实际上也可以使用List,int,String等

many则防止使用关联查询的第二条语句的方法

另外sql和类变量如果名字一致则不需要设置映射关系,Mybatis-Plus 默认会按照列名和属性名的对应关系进行自动映射,无需额外的映射配置。

分页查询

需要写一个配置文件

1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class SqlConfig {
@Bean
public MybatisPlusInterceptor paginationlnterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;

}
}

然后进行查询

1
2
3
4
5
6
@GetMapping("/page")
public IPage page(){
Page<User> page = new Page<>(0,2);
IPage iPage = userMap.selectPage(page,null);
return iPage;
}

参数从哪里开始,查询几条