idea新建项目 springboot2.x+mybatis+mysql+maven(controller层 service层 biz层 dao层)

1、新建项目

原来的url:​​​​​​​​​​​​​​https://start.spring.io 换成https://start.aliyun.com

这样就可以选择springboot2.x的版本号了

2、代码以及配置文件

2.1.    application.properties文件配置如下:

# 应用服务 WEB 访问端口
server.port=8080
#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.test.demo.demos.model

#连接数据库
#allowMultiQueries=true 可以批量修改
#1)useAffectedRows=true时,update语句执行多次时,只有修改成功时才会返回1,若记录的值没有变化,返回0.
#2)useAffectedRows=false时,只要记录存在,无关记录是否发生变化,都会返回1。
#serverTimezone=Asia/Shanghai 时区 上海

#如果MySQL的版本为5.7以上时,必须加上useSSL=false,直接通过用户账号和密码进行连接MySQL数据库;
#当MySQL的版本是5.7以下则不进行要求,默认使用useSSL=false。
#useSSL=false:使用用户账号密码进行连接。
#useSSL=true:一般通过证书或者令牌进行安全验证。

#useUnicode=true&characterEncoding=utf8  指定字符的编码、解码格式


spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#jdbc:mysql://数据库地址:端口号/数据库名称
spring.datasource.url= jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT&useAffectedRows=true&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root




2.2. 实体类

@Data:是 Lombok 中的一个注解,可以自动生成以下代码:

  • 所有字段的 get 和 set 方法。
  • toString() 方法,用于将对象转换成字符串形式,便于日志输出和调试。
  • hashCode() 方法,用于计算对象的哈希值。
  • equals() 方法,用于判断两个对象是否相等。
  • 会生成一个无参构造方法
@Data
public class User {
    //主键
    private String id;
    //姓名
    private String name;
    //创建时间
    private Date createTime;
    //更新时间
    private Date updateTime;
    //状态
    private int status;
}

2.3.   在Springboot启动类上面添加@MapperScan

作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类

com.test.demo.demos.dao指向dao层

@SpringBootApplication
@MapperScan("com.test.demo.demos.dao")
public class TestDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestDemoApplication.class, args);
    }

}

2.4.  dao层代码,在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类

@Mapper
public interface UserDao {
    //查询
    public User getUserById(String id);

}

2.5.  创建MyBatis的映射文件(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">

<!-- namespace绑定dao层接口的全路径 -->
<mapper namespace="com.test.demo.demos.dao.UserDao">


    <resultMap type="com.test.demo.demos.model.User" id="BaseResultMap">
        <result property="id" jdbcType="VARCHAR" column="id"/>
        <result property="name" jdbcType="VARCHAR" column="name"/>
        <result property="createTime" jdbcType="TIMESTAMP" column="create_time"/>
        <result property="updateTime" jdbcType="TIMESTAMP" column="update_time"/>
        <result property="status" jdbcType="DECIMAL" column="status"/>
    </resultMap>

    <sql id="Base_Column_List">
        id,
        name,
        create_time,
        update_time,
        status
    </sql>


    <!-- id="getUserById"对应UserDao里的方法getUserById -->
    <select id="getUserById" resultMap="BaseResultMap" >
        select
        <include refid="Base_Column_List" />
        from usertable
        where id = #{id}
    </select>


</mapper>

2.6. BIZ层代码

@Service
public class UserBiz {
    @Autowired
    private UserDao userDao;
    
    public User getUserById(String id){
        return userDao.getUserById(id);
    }
    
}

2.7  service层代码

接口:

public interface UserService {
    User getUserById(String id);
}

实现类:

@Service
public class UserServiceImpl  implements UserService {
    @Autowired
    private UserBiz userBiz;

    @Override
    public User getUserById(String id) {
        return userBiz.getUserById(id);
    }
}

2.8 controller层代码

SpringBoot开发常用注解说明_springboot get set 注解-CSDN博客

@RestController
@RequestMapping("/test")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("getUserById/{id}")
    public User getUserById(@PathVariable("id") String id){
       return userService.getUserById(id);

    }
}

2.9 利用postman调用接口

其中/test/getUserById/5 对应controller里的@RequestMapper,id为5

2.10 单元测试

https://www.cnblogs.com/heyanfeng/p/18125441#mockito使用​​​​​​​

超详细 springboot 整合 Mock 进行单元测试!本文带你搞清楚!_springboot mock-CSDN博客

controller层

单元测试之 - Spring框架提供的单元/集成测试注解_@autoconfiguremockmvc-CSDN博客


import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.Test;


@AutoConfigureMockMvc
@SpringBootTest
public class UserControllerTest {


    @MockBean
    private UserService userService;

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void getUserById() throws Exception {
        String id="1";

        User user=new User();
        user.setId("1");
        user.setName("ZhangSan");

        Mockito.when(userService.getUserById(Mockito.any())).thenReturn(user);
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/test/getUserById/"+id)
                        .contentType(MediaType.APPLICATION_JSON)
                        .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        
        User newUser = JSON.parseObject(mvcResult.getResponse().getContentAsString(),User.class);
        Assertions.assertThat(newUser).isEqualTo(user);


    }
}

service层


@SpringBootTest
public class UserServiceImplTest {
    @SpyBean
    private UserServiceImpl userService;

    @MockBean
    private UserBiz userBiz;

    @Test
    public void getStockByGoodsId(){
        User user=new User();
        user.setId("1");
        user.setName("张三");
        // 设置调用方法userDao.getUserById后的预期结果为user
        Mockito.when(userBiz.getUserById(Mockito.any())).thenReturn(user);
        //调用
        User newUser=userService.getUserById("1");
        //断言返回的值newUser与期望返回值user是否相等
        Assertions.assertThat(newUser).isEqualTo(user);
    }

biz层

@SpringBootTest
public class UserBizTest {
    // 被注入的目标对象
    @InjectMocks
    private UserBiz userBiz;

    // 创建一个UserDao的一个mock对象
    @Mock
    private UserDao userDao;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getUserById(){
        User user=new User();
        user.setId("1");
        user.setName("张三");

        // 设置调用方法userDao.getUserById后的预期结果为user
        Mockito.when(userDao.getUserById(Mockito.any())).thenReturn(user);
        //调用
        User newUser=userBiz.getUserById("1");
        //断言返回的值newUser与期望返回值user是否相等
        Assertions.assertThat(newUser).isEqualTo(user);
    }

}

3、整个项目目录以及运行查看单元测试

4、注意事项

(1)idea的右边没有maven框时点击view ->Tool Windows->maven

若该路径view ->Tool Windows->maven下找不到maven,则对pom.xml点击右键,选择add as maven

(2)@Test是import org.junit.jupiter.api.Test;

(3)单元测试的controller层里import com.alibaba.fastjson.JSON;时需要引入依赖到maven

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值