Use mybatis in spring boot and test it

1. pom.xml

Detailed POM XML file reference blogger source code

Where h2's scope can be test.

2. Spring boot uses mybatis for database operation

When using mybatis, you need org mybatis. spring. boot:mybatis-spring-boot-starter:2.1. 3 [compile] dependency.

Then create an interface and use the @ Mapper tag. mybatis will search for this tag and parse this interface into a database operation interface.

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 is used to discover the mapper interface
@Component  // Can be omitted. This is mainly to avoid error reporting when @ Autowired is in UserDaoTest in IDEA
public interface UserDao {
    User getById(int id);
    User getByUsername(String username);
    // Using Java beans to pass multiple parameters, you can directly use the bean's property name, namely #{username}, in xml
    int insert(User user);
    int delete(int id);
    // Two parameters. The second parameter is a java bean. You need to use #{user.username}
    int update(int id, User user);
}

User is a POJO used to save data in the database:

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

Then create a new mapper directory under src/main/resources directory, and then create a new userdao XML file, and the specific SQL statements are written here. It doesn't matter where this file is, and then through application Mybatis. In the YML configuration file mapper-locations: classpath:mapper/*. The XML attribute found the file.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ws.product.blogger.dao.UserDao"><!--namespace yes java interface and xml Matching relationship of-->
    <resultMap id="UserMap" type="com.ws.product.blogger.dao.pojo.User">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="username" property="username" jdbcType="VARCHAR"/>
        <result column="password" property="password" jdbcType="VARCHAR"/>
    </resultMap>

    <select id="getById" resultMap="UserMap">
        select * from t_user where id = #{id}
    </select>

    <select id="getByUsername" resultMap="UserMap">
        select * from t_user where username = #{username}
    </select>

    <insert id="insert" parameterType="com.ws.product.blogger.dao.pojo.User">
        insert into t_user (username, password) values ( #{username}, #{password} )
    </insert>

    <delete id="delete">
        delete from t_user where id = #{id}
    </delete>

    <update id="update">
        update t_user
        <set>
            <if test="user.username != null">username = #{user.username},</if>
            <if test="user.password != null">password = #{user.password}</if>
        </set>
        where id = #{id}
    </update>
</mapper>

In this way, mybatis has the ability to operate the database. This is sufficient for a single DAO module. If you want to really perform database operations, you need to create a new main function, use the @ SpringBootApplication tag, application Configuring spring.com in YML datasource. URL, username, password and driver class name attributes, which will automatically generate an sqlSession, which mybatis will use to operate the database. Don't forget, application In YML, you also need to configure mybatis Mapper locations property.

3. Test mybatis

We use org mybatis. spring. boot:mybatis-spring-boot-starter-test:2.1. 3 [test] test mybatis and use the memory database of H2 database to make the database test repeatable.

First, create an empty @ SpringBootApplication tagged class to load all used bean s:

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

/**
 * This is a sentinel class. You need to add the @ SpringBootApplication annotation so that @ MybatisTest can automatically load the required classes. essential
 */
@SpringBootApplication
public class MapperTestApplication {
}

Then create a test class and use the @ MybatisTest tag:

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)    // Using a real database, here we use H2 memory database
// @Rollback(value = false) / / the default value is true, and the database operation will be rolled back. If it is changed to false, it will not be rolled back
@ActiveProfiles("test")     // Use appplication test YML as configuration file
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());
    }
}

Create the configuration file Src / test / resources / application test yml. spring.datasource.shcema and data are table building statements and preliminary data statements

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. The contents in SQL are:

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. The contents in SQL are:

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

The test process is as follows: start UserDaoTest, find the @ SpringBootApplication tag ide class according to @ MybatisTest, load all bean s, and load application test yml. According to spring Create an H2 memory database according to the configuration of datasource, and load schema-h2 SQL and data-h2 SQL creates tables and tables. Then, perform the mybatis operation to generate the UserDao instance, which is automatically injected into the UserDaoTest for testing.

Reference documents

Keywords: Mybatis Spring Boot db

Added by sri2002 on Mon, 27 Dec 2021 14:05:50 +0200