目录树
零时尚商城-后端项目搭建
本篇任务:
1.在博客1的基础上,完成整合Mybatis
2.单元测试
3.整合Driud
4.项目整合的测试
1.整合Mybatis
1.4.1 common子工程
- lombok
1.4.2 beans子工程
- lombok
1.4.3 mybatis子工程–整合mybatis
- 在mapper子工程的pom文件中,新增mybatis所需的依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--spring-boot-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.4</version>
</dependency>
<!--mybatis-starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
- 在
mapper子工程
的resources目录创建application.yml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/zerofashion_boot?characterEncording=utf-8
username: root
password: 123456
mybatis:
mapper-locations: classpath:mappers/*Mapper.xml
type-aliases-package: com.yty.zeromall.entity
这里注意,这个·实体类·别名路径是在beans模块下,我这里是mapper模块进行其别名配置,既然我这里引用了这个路径,那么beans模块的实体类的路径应该和这里一样才能调用成功!
- 在api子工程的启动类通过
@MapperScan
声明dao包的路径
@SpringBootApplication
@MapperScan("com.yty.zeromall.dao")
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}
这里和上面同理。
2.单元测试
先去mapper子模块加test的依赖
<!--要进行单元测试就得加这个-->
<!--mybatis-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
1.beans
User
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int userId;
private int userName;
private int userAge;
}
2.mapper
UserDao
public interface UserDao {
//通过姓名查询
public User queryUserByName(String name);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yty.zeromall.dao.UserDao">
<resultMap id="userMapYTY" type="User">
<id column="user_id" property="userId"></id>
<result column="user_name" property="userName"></result>
<result column="user_age" property="userAge"></result>
</resultMap>
<!--查询-->
<select id="queryUserByName" resultMap="userMapYTY">
select user_id,user_name,user_age
from users
where user_name=#{name};
</select>
</mapper>
3.测试
在要测试的dao下,然后直接alt+insert(Fn)
然后:
点击OK后,就会是:
然后修改:
运行报 初始化 错误:
2.1 解决方法
这是因为springboot的单元测试需要运行一个
main
方法,也就是启动类,通过启动类加载配置。
所以要让@SpringBootTest去指定启动类。
启动类在api模块中,也就是controller模块中,但是我的mapper模块又没依赖api,所以只能将测试放到api里面去进行,并将依赖也加进去。
如图:直接将文件夹复制过去
然后DeBug测试一下:
然后继续运行:
值得注意
是:我上面查询的是‘CURRY’,所以查询结果为null,这是由于数据库中没有这条数据。改成已有的数据,就能查出来全部数据了。
至此,单元测试成功!
3. 整合Druid
因为数据源肯定是和mapper打交道,也就是mybatis,所以在mapper模块中添加druid依赖。
默认是Hikara数据源,我们改成Druid数据源。
3.1 添加druid-starter依赖
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
3.2.修改yml文件
3.3运行启动类测试
控制台发现已经:初始化druid数据源了
4.项目整合测试
用登录来进行整合的测试。
4.1 UserService
因为之前单元测试的时候没有加入数据库中user_pwd字段,在这里补上。实体,mapper.xml中都要加入对应的。
UserService
public interface UserService {
//1.登录
public User checkLogin(String name,String pwd);
}
UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
//1.登录
@Override
public User checkLogin(String name, String pwd) {
//1.1 根据账号查询用户信息
User user = userDao.queryUserByName(name);
//1.2 判断
if (user == null){
//用户名不存在
}else {
//1.3 对输入的密码pwd进行加密
//使用加密后的密码 和 user中的密码进行匹配
if (user.getUserPwd().equals(pwd)){
//验证成功
}else {
//密码错误
}
}
return null;
}
}
此代码为伪代码,中文字处少了对应的代码。
4.2 VO对象
那我们怎么把上述这些信息返回给前端呢?这个时候我们就不再返回user对象,而是返回一个自定义的vo对象。
因为user包含我们要的用户信息,但是它并不包含提示用户的信息。而vo就可以。
ResultVO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResultVO {
//响应给前端的状态码
private int code;
//响应给前端的提示信息
private String msg;
//响应给前端的数据
private Object data;
}
因此我们的UserService就不用返回对象user了,而是对象ResultVO了
UserSerice
public interface UserService {
//1.登录
public ResultVO checkLogin(String name, String pwd);
}
UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
//1.登录
@Override
public ResultVO checkLogin(String name, String pwd) {
//1.1 根据账号查询用户信息
User user = userDao.queryUserByName(name);
//1.2 判断
if (user == null){
//用户名不存在
return new ResultVO(10001,"用户名不存在!",null);
}else {
//1.3 对输入的密码pwd进行加密
//使用加密后的密码 和 user中的密码进行匹配
if (user.getUserPwd().equals(pwd)){
//验证成功
return new ResultVO(10000,"登录成功!",user);
}else {
//密码错误
return new ResultVO(10001,"密码错误",null);
}
}
}
}
此时,我们返回给前端的就是一个vo对象。
4.3 UserController
前后端分离我们都是:异步。所以直接在类上加@ResponseBody–代表这个controller所有的请求都是异步请求,返回的都是json数据。
controller就做一件事,那就是接收请求,响应转给service。由service进行业务操作。
@Controller
@ResponseBody//表这个controller所有的请求都是异步请求,返回的都是json数据。
@RequestMapping("/user")//窄化请求
public class UserController {
@Resource
private UserService userService;
//1.登录
@RequestMapping("/login")
public ResultVO login(String name,String pwd){
return userService.checkLogin(name, pwd);
}
}
4.4 启动测试!
因为现在是一个聚合工程,特点:要想运行启动类,就要先进行打包。开发环境是可以直接运行的,但是在最后的时候最好在父工程中进行一个打包。
测试:
1.数据库表数据:
2.输入正确的用户和密码
3.输入错误的密码
4.输入不存在的用户
5.总结
发现每种不同的情况,都能对应我们VO对象,这就是VO的好处,能给到提示信息!
同时,项目整合没问题!