目录
1.创建SpringBoot项目
新建SpringBoot项目
创建完成后,启动 SpringBoot 项目
出现如图所示,代表SpringBoot项目创建成功
2.配置MySQL数据库
-
创建数据库 springboot_vue
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `username` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '用户名称', `password` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '用户密码', `email` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '用户邮箱', `city` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '所在城市', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC;
-
添加测试数据
INSERT INTO `user` VALUES (1, 'Un1', '123456', '123456@qq.com', '上海'); INSERT INTO `user` VALUES (2, 'Un2', '123456', '123456@qq.com', '上海'); INSERT INTO `user` VALUES (3, 'Un3', '123456', '123456@qq.com', '上海'); INSERT INTO `user` VALUES (4, 'Un4', '123456', '123456@qq.com', '北京'); INSERT INTO `user` VALUES (5, 'Un5', '123456', '123456@qq.com', '北京'); INSERT INTO `user` VALUES (6, 'Un6', '123456', '123456@qq.com', '北京'); INSERT INTO `user` VALUES (7, 'Un7', '123456', '123456@qq.com', '深圳'); INSERT INTO `user` VALUES (8, 'Un8', '123456', '123456@qq.com', '深圳'); INSERT INTO `user` VALUES (9, 'Un9', '123456', '123456@qq.com', '深圳'); INSERT INTO `user` VALUES (10, 'Un10', '123456', '123456@qq.com', '杭州'); INSERT INTO `user` VALUES (11, 'Un11', '123456', '123456@qq.com', '杭州'); INSERT INTO `user` VALUES (12, 'Un12', '123456', '123456@qq.com', '杭州'); INSERT INTO `user` VALUES (13, 'Un13', '123456', '123456@qq.com', '广州'); INSERT INTO `user` VALUES (14, 'Un14', '123456', '123456@qq.com', '广州'); INSERT INTO `user` VALUES (15, 'Un15', '123456', '123456@qq.com', '广州');
-
在SpringBoot中配置数据库
(1.)修改文件名
(2.)添加数据库配置信息
修改用户名,密码,数据库名称
3.集成MyBatis-Plus
1.导入Mybatis-Plus依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency>
2.添加一个mybatis-plus的config配置防止全表删除更新
从官网找到对应代码段,添加到项目中
4.SpringBoot三层架构
-
Entity数据库实体层:数据库实体层是指与数据库中的表一一对应的Java类,它们定义了表中的字段、数据类型、关系等信息。这一层的主要工作是完成Java对象与数据库表之间的映射关系,以及提供对数据库的基本9操作方法。
-
Mapper数据持久层:数据持久层是指负责与数据库进行交互的代码,它们主要负责将Java对象转换为数据库中的数据,并将数据库中的数据转换为Java对象。这一层的主要工作是完成数据库的增删改查操作,以及与数据库的连接和事务管理等工作。
-
Service数据库服务层:数据库服务层是指为控制器层提供数据服务的代码,它们主要负责处理控制器层传递过来的请求,并根据请求的类型调用数据持久层完成相应的操作。这一层的主要工作是将数据持久层的操作封装成服务,以便控制器层进行调用。
-
Controller控制器层:控制器层是指负责处理用户请求的代码,它们主要负责接收用户的请求,并根据请求的类型调用数据库服务层完成相应的操作。这一层的主要工作是将用户请求转换为数据库服务层的调用,并将数据库服务层的结果返回给用户。
构建三层架构项目结构
编写 Entity层
根据数据库中表字段名来创建实体类
package com.example.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; @Data public class User { /** * 用户id */ private Integer id; /** * 用户名称 */ private String username; /** * 用户密码 */ private String password; /** * 所在城市 */ private String city; /** * 用户邮箱 */ private String email; }
编写 Mapper层
编写 mapper层,要继承mybatis-plus的类BaseMapper<T> 传入创建的实体类 User
package com.example.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.entity.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { }
编写 Service层
先创建接口,在创建实现类
创建接口 继承 mybatis-plus的 IService<T> 传入创建的实体类 User
package com.example.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.entity.User; public interface IUserService extends IService<User> { }
编写实现类 继承mybatis-plus的ServiceImpl<T> 传入创建的接口和实体类 实现 创建的Service接口
package com.example.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.entity.User; import com.example.mapper.UserMapper; import com.example.service.IUserService; @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { }
编写 Controller 层
TestController
package com.example.controller; import com.example.entity.User; import com.example.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class TestController { @Autowired private UserMapper userMapper; @GetMapping("/test") public List<User> list(){ return userMapper.selectList(null); } }
直接使用Mybatis-Plus里面的selectList方法,返回一个List<User>集合 测试项目结构
出现数据库数据,代表结构正确
5.编写增删改查接口
1). 在Service接口内编写方法
-
查询中 单条查询、分页查询、模糊查询合并
Page<User> page(Integer current,Integer size,String username);
-
新增和修改所传入的参数都为User实体类 所以可以合并成一个 saveOrUpdateById方法
boolean saveOrUpdateById(User user);
-
删除和批量删除
boolean deleteBatchIds(List<Integer> Ids);
package com.example.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.example.entity.User; import java.util.List; public interface IUserService extends IService<User> { Page<User> page(Integer current,Integer size,String username); boolean saveOrUpdateById(User user); boolean deleteBatchIds(List<Integer> Ids); }
2).方法实现
通过IDEA快捷方式,实现方法
保存修改
思路分析:保存和修改的不同之处只在于传入的实体类的 id是否为空,当传入的参数为空时为保存操作不为 空时,执行修改操作
@Override public boolean saveOrUpdateById(User user) { if (user.getId() != null){ return updateById(user); }else{ return save(user); } }
删除修改
思路分析:直接删除执行操作
@Override public boolean deleteBatchIds(List<Integer> Ids) { return deleteBatchIds(Ids); }
查询修改
思路分析:通过链式查询
获取数据方法,page()分页 list()列表
@Override public Page<User> page(Integer current, Integer size, String username) { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); if(!"".equals(username)){ wrapper.like(User::getUsername,username); } Page<User> page = page(new Page<>( current, size ), wrapper ); return page; }
6.编写Controlelr层
1)、增加 修改
@PostMapping("/save") public boolean save(@RequestBody User user){ return userService.saveOrUpdateById(user); }
2)、删除 批量删除
@PostMapping("/delete") public boolean delete(@RequestBody List<Integer> ids){ return userService.deleteBatchIds(ids); }
3)、查询,分页查询
@GetMapping("/page") public Page<User> page( @RequestParam("username") String username, // @RequestParam(defaultValue = "") String username, @RequestParam(defaultValue = "1") Integer current, @RequestParam(defaultValue = "15") Integer size ){ return userService.page(current,size,username); }
7.Postman测试APi接口
1)、新增
2)、修改
3)、单个删除
4)、批量删除
先通过新增,添加批量删除测试数据
5)、分页查询
6)、模糊查询
8.SpringBoot项目解决跨域问题
添加注解
在Controller层添加CrossOrigin注解
配置文件
在Config目录下添加CorsConfig配置类
package com.example.config;//package com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CorsConfig { // 当前跨域请求最大有效时长。这里默认1天 private static final long MAX_AGE = 24 * 60 * 60; @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 corsConfiguration.setMaxAge(MAX_AGE); source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置 return new CorsFilter(source); } }
问题总结
栈溢出
-
这个错误表示在处理请求时,出现了一个递归调用的无限循环,导致栈溢出。
在impl中的方法实现类内,定义方法时,如果方法名和内部使用的方法名相同时,会出现递归调用,
修改方法:修改两方法名中的一个
值转换
-
当分页查询时,因为usernam没有赋默认值,状态码会 400
修改方法:给username赋一个初始值
分页失效
-
当使用 MyBatis-Plus 来实现分页查询时,要安装分页插件
可见分页无效,通过MyBatis-Plus文档可知,分页查询要配置分页插件
解决方法:在config目录下的MyBatisPlusConfig配置类中配置