我们学习的springboot微服务框架已经开发了很多次项目了,不过那些大多数我们用的技术方法与思路都是之前开发ssm框架留下来的老旧的思想,已经之前没有发现的毛病都留下来,最近我在开发企业项目之余打算好好的整理一下以前各种测试留下的问题,防止给自己留坑!
1.数据库登录等查询的方法,不能用select * from xxx where xxx = #{xxx} ....
如果数据库表已经设置了索引,最好通过索引搜索某一列的值,直接通过值与值的比对确定登录结果,如果数据库的数据有很大的话你又没有配置redis缓存,那么一旦有很多用户登录,那么数据库的压力就会非常大。
2.mybatis默认的驼峰命名,但是mybatisplus框架国人改造后悔默认将驼峰改成下划线格式
会不断的报出某一列user_id找不到,数据库语法异常。
3.前后端分离的项目,后端通常会定义返回结果封装类,响应码等
4.thymeleaf要想实现静态资源跳转需要在yml文件自动配置前后缀以及静态资源映射的路径(一般springboot由于约定大于配置的规则会默认注意查看是否具有出入)
5.mapper层的问题通常在你的yml文件配置里的问题导致 (比如?serverTimezone=UTC你没有配置)
6.lombok插件的作用可以在官方上好好查一查,不仅仅局限于实体类开发的简化(个人不推荐使用逆向工程代码生成器生成实体类,原因是我觉得很复杂就不想看了,但是我还是把它认真学了一遍,不是很难,但是代码量大)
自带的log日志功能可以调试提示信息
7.端口打不开或者正在显示端口被占用就在黑窗口将进程杀死
cmd命令自行网络查询
一、填写application.yml文件配置
spring:
application:
name: sprintBootDemo
mvc:
static-path-pattern: /static/**
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cop?serverTimezone=UTC
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
thymeleaf:
servlet:
content-type: text/html
cache: false
mode: HTML
prefix: /templates/
suffix: .html
server:
port: 8080
mybatis-plus:
configuration:
# 默认的驼峰转下划线的设置,该key为true表示启动转换
map-underscore-to-camel-case: false
二、创建数据库表
use cop;
create table user(
`userId` int(0) auto_increment comment '用户id',
`userName` varchar(12) not null comment '姓名',
`userAccount` varchar(11) not null comment '账号',
`userAge` int not null comment '年龄',
`userSex` varchar(2) default '男' comment '年龄',
`userPhone` varchar(11) not null comment '电话',
`userAddress` varchar(32) not null comment '地址',
`password` varchar(11) not null comment '密码',
unique index (userAccount),
primary key (userId,userAccount,userPhone)
);
三、实体类
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private Integer userId;
private String userName;
private String userAccount;
private Integer userAge;
private String userSex;
private String userPhone;
private String userAddress;
private String password;
}
四、mapper层与service层
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hlc.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
import com.baomidou.mybatisplus.extension.service.IService;
import com.hlc.entity.User;
public interface UserService extends IService<User> {
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hlc.entity.User;
import com.hlc.mapper.UserMapper;
import com.hlc.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService {
}
五、controller层
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.hlc.common.R;
import com.hlc.entity.User;
import com.hlc.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 登录
* POST/GetMapping取决于前端请求方式
*
* @param request
* @param user
* @return R
*/
@PostMapping("/login")
public R<User> login(HttpServletRequest request, @RequestBody User user) {
/*1.将密码进过后端的MD5加密*/
String password = user.getPassword();
DigestUtils.md5DigestAsHex(password.getBytes());
/*2.根据名称查询数据库*/
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
/*这里的索引约束唯一的就是我们的用户的账户*/
queryWrapper.eq(User::getUserAccount,user.getUserAccount());
User result = userService.getOne(queryWrapper);
/*3.判断查询数据库是否成功*/
if (result == null){
return R.error("账户不存在!登录失败!");
}
/*4.密码比对,不一致返回登录失败*/
if (!result.getPassword().equals(password)){
return R.error("密码错误!登录失败!");
}
/*5.登录验证成功,将用户账号存入session*/
request.getSession().setAttribute("user",result.getUserAccount());
return R.success(result);
}
}
六、通用结果封装类(最为响应体发送给前端,严格的前后端分离)
port lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
* 通用结果封装类
*
* @param <T>
*/
@Data
public class R<T> {
private Integer code;
private String msg;
private T data;
private Map map = new HashMap();
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R<T> r = new R<T>();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
七、小程序测试页面发送请求携带数据,测试响应体内容
js
Page({
data: {
msg: "",
},
tes01(){
let th = this;
wx.request({
url: 'http://192.168.100.216:8080/user/login/',
method:"POST",
data:{
userAccount:'1234555',
password:'1234555'
},
header: {
一定要这么写,不然会报问题
"Content-Type": "application/json;charset=utf-8"
},
success(res){
console.log(res.data),
th.setData({
msg: JSON.stringify(res.data.data)
})
}
})
}
})
wxml
<button type="primary" bindtap="tes01">点我测试</button>
<div wx:if="{{msg != null}}">{{msg}}</div>
测试结果
我们发现小程序访问springboot应用程序的测试难度远远比我们的前端要简单,前几天新学的ajax之后还要结合jq学习其他的前端技术,这样对我们后端开发人员来说有点不友好。
这个项目第一步用户登录也就测试完成了,之后我们将会在一周的时间内完成一个前后端分离的企业级开发模式的项目,如果有兴趣可以持续关注我的文章!