springboot中使用mybatis并进行测试

1. pom.xml

springboot中使用mybatis并进行测试_第1张图片

详细pom.xml文件参考blogger源码

其中h2的scope可以是test。

2. springboot使用mybatis进行数据库操作

使用mybatis时,需要org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3[compile]依赖。

然后创建一个接口,使用@Mapper标记,mybatis会搜索此标记,把这个接口解析为数据库操作接口。

package com.ws.product.blogger.dao;

import com.ws.product.blogger.dao.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;

@Mapper     // mybatis用于发现mapper接口
@Component  // 可以省略。主要是为了在IDEA里UserDaoTest中@Autowired时不报错
public interface UserDao {
    User getById(int id);
    User getByUsername(String username);
    // 使用java bean传递多个参数,在xml中可以直接使用bean的property name,即#{username}
    int insert(User user);
    int delete(int id);
    // 两个参数,第二个参数是java bean,使用的时候需要使用#{user.username}
    int update(int id, User user);
}

User是一个POJO,用来保存数据库中的数据:

package com.ws.product.blogger.dao.pojo;
import lombok.Data;
@Data
public class User {
    private int id;
    private String username;
    private String password;
}

然后在src/main/resources目录下新建mapper目录,再新建UserDao.xml文件,具体的SQL语句就写在这里。这个文件在哪里无所谓,之后通过application.yml配置文件中的mybatis.mapper-locations: classpath:mapper/*.xml属性找到这个文件。




    
        
        
        
    

    

    

    
        insert into t_user (username, password) values ( #{username}, #{password} )
    

    
        delete from t_user where id = #{id}
    

    
        update t_user
        
            username = #{user.username},
            password = #{user.password}
        
        where id = #{id}
    

这样,mybatis就具备了操作数据库的能力。对于单独一个DAO模块来说,这已经足够了。如果想要真正执行数据库操作,需要新建一个main函数,使用@SpringBootApplication标记,application.yml中配置spring.datasource.url, username, password, driver-class-name属性,这会自动生成一个sqlSession,mybatis会使用这个sqlSession操作数据库。不要忘了,application.yml中还需要配置mybatis.mapper-locations属性。

3. 测试mybatis

我们使用org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.1.3[test]对mybatis进行测试,使用H2数据库的内存数据库,使得数据库测试可以重复执行。

首先创建一个空的@SpringBootApplication标记的类,用以加载所有使用到的bean:

package com.ws.product.blogger.dao;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 这是一个哨兵类,需要添加@SpringBootApplication注解,让@MybatisTest可以自动加载所需的类。必不可少
 */
@SpringBootApplication
public class MapperTestApplication {
}

然后创建测试类,使用@MybatisTest标记:

package com.ws.product.blogger.dao;
import com.ws.product.blogger.dao.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.test.context.ActiveProfiles;
import static org.junit.jupiter.api.Assertions.assertEquals;

@MybatisTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)    // 使用真实的数据库,这里我们使用H2内存数据库
// @Rollback(value = false)    // 默认为true,数据库操作会回滚。改为false后,不会回滚
@ActiveProfiles("test")     // 使用appplication-test.yml作为配置文件
public class UserDaoTest {
    @Autowired
    private UserDao userDao;

    @Test
    public void test01() {
        User user = new User();
        user.setUsername("aaa");
        user.setPassword("aaa");
        int i = userDao.insert(user);
        assertEquals(1, i);
    }

    @Test
    public void test02() {
        User user = userDao.getByUsername("root");
        assertEquals(1, user.getId());
        assertEquals("root", user.getUsername());
        assertEquals("rootqqq", user.getPassword());
    }

    @Test
    public void test03() {
        User user = userDao.getById(1);
        assertEquals(1, user.getId());
        assertEquals("root", user.getUsername());
        assertEquals("rootqqq", user.getPassword());
    }

    @Test
    public void test04() {
        int i = userDao.delete(1);
        assertEquals(1, i);
    }

    @Test
    public void test05() {
        User user = new User();
        // user.setUsername("root");
        user.setPassword("root2");
        userDao.update(1, user);
        User user1 = userDao.getById(1);
        assertEquals("root", user1.getUsername());
        assertEquals("root2", user1.getPassword());
    }
}

创建配置文件src/test/resources/application-test.yml。spring.datasource.shcema和data是建表语句和铺底数据语句

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password: sa
    driver-class-name: org.h2.Driver
    schema: classpath:sql/db/schema-h2.sql
    data: classpath:sql/db/data-h2.sql

mybatis:
  mapper-locations: classpath:mapper/*.xml

schema-h2.sql中内容为:

drop table if exists t_user;
create table t_user(
    id integer not null auto_increment,
    username varchar(100) not null,
    password varchar(200) not null,
    primary key (id)
);

data-h2.sql中内容为:

insert into t_user values(1, 'root', 'rootqqq');

测试过程为:启动UserDaoTest,根据@MybatisTest找到@SpringBootApplication标记ide类,加载所有bean,加载application-test.yml。根据spring.datasource的配置创建H2内存数据库,并加载schema-h2.sql和data-h2.sql创建表和数。然后进行mybatis操作,生成UserDao实例,自动注入到UserDaoTest中,进行测试。

参考文档

你可能感兴趣的