Springboot 项目学习

Springboot 项目快速入门

参考视频:https://www.bilibili.com/video/BV1nV4y1s7ZN?spm_id_from=333.337.search-card.all.click

idea新建springboot 项目后,在其基础上进行学习:

开发环境热部署

学习目的:

简化修改代码后手动运行时间,使用spring-boot-devtools组件使得无须手动重启Spring Boot应用即可重新编译、启动项目。

步骤:

1.pom.xml添加依赖,并下载

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

2.在application.properties文件中配置

//热部署生效
spring.devtools.restart.enabled=true
//设置重启目录
spring.devtools.restart.additional-paths=src/main/java

3.鼠标进行如下配置

打开Settings页面,在左边的菜单栏依次找到Build,Execution,Deployment→Compile,勾选Build project automatically

image-20220914213231914

打开设置界面,选择高级设置,下拉选择编译器允许自动make启动。

image-20220914213926102

web入门

1.创建SpringBoot项目勾选Spring Web选项后,会自动将spring-boot-starter-web组件加入到项目中。

webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖。

2.Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求。

如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据,则可以使用@RestController注解,,@RestController注解会将返回的对象数据转换为JSON格式。

image-20220914232517141

路由映射

@RequestMapping和@GetMapping作用一致,@GetMapping写法更为简便。

image-20220914232757193

参数传递

1.通过url?后携带参数与函数参数保持一致

image-20220914233212393

2.url后多参数通过&进行参数的衔接,在函数参数中加入对应属性名称即可。

如上,类比出一下参数传递方式。

@RestController
public class ParamsController {

    @RequestMapping(value = "/getTest1",method = RequestMethod.GET)
    public String getTest1(){
        return "GET请求";
    }

    @RequestMapping(value = "/getTest2",method = RequestMethod.GET)
//  http://localhost:8080/getTest2?nickname=xxx&phone=xxx
    public String getTest2(String nickname,String phone){
        System.out.println("nickname:"+nickname);
        System.out.println("phone:"+phone);
        return "GET请求";
    }
    
//url中的nickname和函数参数中的name进行匹配
    @RequestMapping(value = "/getTest3",method = RequestMethod.GET)
//  http://localhost:8080/getTest2?nickname=xxx
    public String getTest3(@RequestParam(value = "nickname",required = false) String name){
        System.out.println("nickname:"+name);
        return "GET请求";
    }
    
//post请求不能用url进行调试,可用测试工具postman进行http请求调试
    @RequestMapping(value = "/postTest1",method = RequestMethod.POST)
    public String postTest1(){
        return "POST请求";
    }
    
    @RequestMapping(value = "/postTest2",method = RequestMethod.POST)
    public String postTest2(String username,String password){
        System.out.println("username:"+username);
        System.out.println("password:"+password);
        return "POST请求";
    }
    
    //url后跟的参数可以是java对象
    @RequestMapping(value = "/postTest3",method = RequestMethod.POST)
    public String postTest3(User user){
        System.out.println(user);
        return "POST请求";
    }

    //url后跟的参数可以是json对象
    @RequestMapping(value = "/postTest4",method = RequestMethod.POST)
    public String postTest4(@RequestBody User user){
        System.out.println(user);
        return "POST请求";
    }

    @GetMapping("/test/*")
    public String test(){
        return "通配符请求";
    }

postTest2请求测试方法,以下2张图片均可。

image-20220914234407389

image-20220914234725254

postTest3测试之前在后端需要有对应的实体类,测试方法如下。

image-20220915104402306

postTest4测试之前在后端需要有对应的实体类,测试方法如下。

image-20220914235710157

访问静态资源

resoures/static目录下可与存放静态资源。

image-20220915084120115

访问方式:

image-20220915084343242

想要在访问路径前加上前缀,可以在图下文件中加入以下语句,然后通过local host:8080/imges/test.jpg进行访问。

image-20220915084448918

静态资源的存储位置也可以进行如下配置:

image-20220915084959253

文件上传

image-20220915085226585

上传文件类代码如下:

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String up(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException {
        System.out.println(nickname);
        // 获取图片的原始名称
        System.out.println(photo.getOriginalFilename());
        // 取文件类型
        System.out.println(photo.getContentType());

        String path = request.getServletContext().getRealPath("/upload/");
        System.out.println(path);
        saveFile(photo,path);
        return "上传成功";
    }

//
    public void saveFile(MultipartFile photo,String path) throws IOException {
//       判断存储的目录是否存在,如果不存在则创建
        File dir = new File(path);
        if(!dir.exists()){
//          创建目录
            dir.mkdir();
        }

        File file = new File(path+photo.getOriginalFilename());
        photo.transferTo(file);
    }

测试方法如下:

image-20220915085643963

注意事项:

上传文件的大小受限的话可以对application.properties进行如下配置:

spring.servlet.multipart.max-file-size=10MB
spring.servlet. multi part. max-request -size=10MB

如果希望用户能访问自己上传的文件,可以对application.properties进行如下配置:

image-20220915090005548

通过如下方式对已经上传的图片进行访问;

image-20220915104930745

拦截器

创建登录拦截器如下:

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("LoginInterceptor");
        return true;
    }
}

request对应前端的请求,response对应响应信息。

创建config类,注册拦截器拦截自定义路径:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( new LoginInterceptor()).addPathPatterns("/user/**");
    }
}

构建restful服务

restful服务的controller类模板如下:

@RestController
public class UserController {

    @ApiOperation("获取用户")
    @GetMapping("/user/{id}")
    public String getUserById(@PathVariable int id){
        System.out.println(id);
        return "根据ID获取用户信息";
    }
    @PostMapping("/user")
    public String save(User user){
        return "添加用户";
    }
    @PutMapping("/user")
    public String update(User user){
        return "更新用户";
    }
    @DeleteMapping("/user/{id}")
    public String deleteById(@PathVariable int id){
        System.out.println(id);
        return "根据ID删除用户";
    }
}

Swagger

在Spring Boot项目中集成Swagger同样非常简单,只需在项目中的pom.xml文件引入springfox-swagger2和springfox-swagger-ui依赖即可。

<!-- 添加swagger2相关功能 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<!-- 添加swagger-ui相关功能 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

兴建config文件夹,创建SwaggerConfig 类,swagger代码如下:

@Configuration // 告诉Spring容器,这个类是一个配置类
@EnableSwagger2 // 启用Swagger2功能
public class SwaggerConfig {
    /**
     * 配置Swagger2相关的bean
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com"))// com包下所有API都交给Swagger2管理
                .paths(PathSelectors.any()).build();
    }

    /**
     * 此处主要是API文档页面显示信息
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("演示项目API") // 标题
                .description("演示项目") // 描述
                .version("1.0") // 版本
                .build();
    }
}

Spring Boot 2.6.X后与Swagger有版本冲突问题,需要在application.properties中加入以下配置:

image-20220915094927044

启动项目访问 http://127.0.0.1:8080/swagger-ui.html ,即可打开自动生成的可视化测试页面

MyBatis-Plus

添加依赖

<!--  MyBatisPlus依赖  -->
<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>

application.properties文件全局配置:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
server.port=8088

springboot都的启动类添加注解,全路径可以通过选中该文件右键copy路径:

image-20220915095556981

1.新建controller文件夹,添加UserController类,先写一个测试方法:

image-20220915095842385

2.新建entity文件夹,添加User类,对应数据库中的表项及其属性值。

3.新建mapper文件夹,添加Usermapper类。

image-20220915100117905

4.在UserController类中添加注解,注入mapper方法:

image-20220915100307036

注意实现:对于前端想要返回json对象,函数返回参数为list即可。

增删改查基础模板如下,usermapper类添加:

image-20220915100659144

usercontroller类内添加:

//  插入数据
    @PostMapping("/user")
    public String save(User user){
        int r= userMapper.add(user);
    }

MyBatis-Plus简化

usermapper修改如下,BaseMapper提供基本方法,具体可以查看该类文件:

image-20220915101133597

继承BaseMapper后,只需通过多态的方式调用父方法即可:

image-20220915101424745

MyBatis-Plus提供一些细节操作,可以根据官网对自己的进行调整:

简介 | MyBatis-Plus (baomidou.com)

多表查询

模拟现实中一个用户多个订单,一个订单只对应一个用户的使用场景,实现通过用户查询订单,和通过订单查询用户的功能:

1:N:

1.在User类中新增表中不存在的字段

//  描述用户的所有订单
    @TableField(exist = false)
    private List<Order> orders;

2.在Usermapper中新增selectAllUserAndOrders方法:

//   查询用户及其所有的订单 id在user表中 ,通过这个查找订单
    @Select("select * from t_user")
    @Results(
            {
                    @Result(column = "id",property = "id"),
                    @Result(column = "username",property = "username"),
                    @Result(column = "password",property = "password"),
                    @Result(column = "birthday",property = "birthday"),
                    @Result(column = "id",property = "orders",javaType = List.class,
                            many=@Many(select = "com.example.mpdemo.mapper.OrderMapper.selectByUid")
                    )
            }
    )
    List<User> selectAllUserAndOrders();

3.在OrderMapper新增selectByUid方法:

    @Select("select * from t_order where uid = #{uid}")
    List<Order> selectByUid(int uid);

这样完成了从用户查订单的操作。

1:1:

1.在Order类中新增表中不存在的字段:

@TableField(exist = false)
private User user;

2.在Oderrmapper中新增selectAllOrdersAndUser方法:

//  查询所有的订单,同时查询订单的用户
    @Select("select * from t_order")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(column = "uid",property = "user",javaType = User.class,
                one=@One(select = "com.example.mpdemo.mapper.UserMapper.selectById")
            )
    })
    List<Order> selectAllOrdersAndUser();

3.在UserMapper新增selectById方法:

//   查询用户,根据用户id查询信息   select * from user where id =
    @Select("select * from t_user where id = #{id}")
    User selectById(int id);

这样完成了从订单查用户的操作。

分页查询

1,先做配置,新建config文件夹,新建MyBatisPlusConfig配置类:

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInterceptor);
        return interceptor;
    }
}

2.在Controller层中实现自定义分页查询方法:

//  分页查询
    @GetMapping("/user/findByPage")
    public IPage findByPage(){
        //设置起始值及每页条数
        Page<User> page = new Page<>(0,2);
        IPage iPage = userMapper.selectPage(page,null);
        return iPage;
    }

至此,springboot项目能够实现基本的http请求和链接数据库的相关操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值