springboot集成mybatis增删除改查的单元测试

首先,我们需要添加必要的依赖项,这里使用Maven来管理项目:

<!-- Spring Boot -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

<!-- JUnit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

接下来,我们需要编写一个MyBatis配置文件mybatis-config.xml,用于指定MyBatis的一些配置信息,例如数据库连接信息、映射器等。这里我们只需要指定映射器的位置即可:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

然后,我们创建一个实体类User,该实体类对应数据库中的用户表:

public class User {
    private Long id;
    private String name;
    private Integer age;

    // getters and setters
}

接下来,我们编写一个MyBatis的映射器UserMapper.xml,用于定义与用户表相关的SQL语句:

<?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.example.demo.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.demo.entity.User">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
    </resultMap>

    <select id="findById" resultMap="BaseResultMap">
        SELECT *
        FROM user
        WHERE id=#{id}
    </select>

    <insert id="save" parameterType="com.example.demo.entity.User">
        INSERT INTO user(name, age)
        VALUES(#{name}, #{age})
    </insert>

    <update id="update" parameterType="com.example.demo.entity.User">
        UPDATE user
        SET name=#{name}, age=#{age}
        WHERE id=#{id}
    </update>

    <delete id="deleteById" parameterType="Long">
        DELETE FROM user
        WHERE id=#{id}
    </delete>
</mapper>

然后,我们创建一个UserMapper接口,用于调用上述的SQL语句:

@Mapper
public interface UserMapper {
    User findById(Long id);
    void save(User user);
    void update(User user);
    void deleteById(Long id);
}

接下来,我们创建一个UserService类,该类通过调用UserMapper接口来实现增删改查操作:

@Service
@Transactional
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User findById(Long id) {
        return userMapper.findById(id);
    }

    public void save(User user) {
        userMapper.save(user);
    }

    public void update(User user) {
        userMapper.update(user);
    }

    public void deleteById(Long id) {
        userMapper.deleteById(id);
    }
}

最后,我们编写一个JUnit测试类UserServiceTest,用于测试UserService类的增删改查操作:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void testFindById() {
        User user = new User();
        user.setName("John");
        user.setAge(18);
        userService.save(user);

    Long id = user.getId();

    User savedUser = userService.findById(id);

    assertEquals("John", savedUser.getName());
    assertEquals(Integer.valueOf(18), savedUser.getAge());

    userService.deleteById(id);
}

@Test
public void testUpdate() {
    User user = new User();
    user.setName("John");
    user.setAge(18);
    userService.save(user);

    Long id = user.getId();

    user.setName("Tom");
    user.setAge(20);
    userService.update(user);

    User updatedUser = userService.findById(id);

    assertEquals("Tom", updatedUser.getName());
    assertEquals(Integer.valueOf(20), updatedUser.getAge());

    userService.deleteById(id);
}

@Test
public void testDeleteById() {
    User user = new User();
    user.setName("John");
    user.setAge(18);
    userService.save(user);

    Long id = user.getId();

    userService.deleteById(id);

    User deletedUser = userService.findById(id);

    assertNull(deletedUser);
}
}

在这个测试类中,我们使用JUnit框架的`@Test`注解来标记每个测试方法。在每个测试方法中,我们首先创建一个`User`对象,并调用`UserService`类的相应方法,然后断言上述操作是否正确执行。需要注意的是,在测试删除用户的方法中,我们通过调用`findById`方法来测试用户是否已被删除。由于JUnit测试是独立运行的,因此在该方法中无法访问之前测试中创建的用户对象。因此,我们需要在测试删除用户之前先创建该用户。以上就是一个简单的Spring Boot + MyBatis单元测试示例,代码注释详细,能够覆盖XML映射文件的所有内容

问题一:userMapper.xml中jdbcType一定要写吗?有多少种类型

在MyBatis中,jdbcType是用于指定JDBC类型的一个属性。当在SQL语句中使用占位符时,MyBatis会根据Java类型自动推断出相应的JDBC类型。但有些情况下,可能需要手动指定JDBC类型,例如当Java类型和JDBC类型不一致时,或者需要显式地告诉MyBatis要使用哪种JDBC类型。

以下是MyBatis支持的所有JDBC类型和对应的Java类型:

JDBC类型

Java类型

ARRAY

java.sql.Array

BIGINT

long/Long

BINARY

byte[]

BIT

boolean/Boolean

BLOB

byte[]/java.sql.Blob

BOOLEAN

boolean/Boolean

CHAR

String

CLOB

String/java.sql.Clob

DATALINK

java.net.URL

DATE

java.util.Date/java.sql.Date

DECIMAL

java.math.BigDecimal

DISTINCT

N/A

DOUBLE

double/Double

FLOAT

float/Float

INTEGER

int/Integer

JAVA_OBJECT

Object

LONGNVARCHAR

String

LONGVARBINARY

byte[]

LONGVARCHAR

String

NCHAR

String

NCLOB

java.sql.NClob

NULL

N/A

NUMERIC

java.math.BigDecimal

NVARCHAR

String

OTHER

N/A

REAL

float/Float

REF

java.sql.Ref

ROWID

java.sql.RowId

SMALLINT

short/Short

SQLXML

java.sql.SQLXML

STRUCT

java.sql.Struct

TIME

java.util.Date/java.sql.Time

TIMESTAMP

java.util.Date/java.sql.Timestamp

TINYINT

byte/Byte

VARBINARY

byte[]

VARCHAR

String

需要注意的是,在大多数情况下,MyBatis可以自动推断出正确的JDBC类型。因此,在实际开发中,我们不必在每个SQL语句中都显式地指定JDBC类型。只有在遇到无法自动推断的情况时,才需要手动指定JDBC类型。

通常情况下,MyBatis可以自动推断出大部分Java类型对应的JDBC类型。因此,在绝大多数情况下,我们不需要显式地指定jdbcType属性。

以下是一些需要显式指定jdbcType属性的情况:

  1. 当Java类型和数据库表列的数据类型不匹配时,需要指定jdbcType属性。例如,当Java实体类中声明的属性类型为java.math.BigDecimal时,而数据库表中的列类型为NUMERIC时,需要在映射文件中将该属性的jdbcType设置为NUMERIC

  1. 当使用<foreach>标签进行批量操作时,如果集合中的元素类型为自定义类型,则需要手动指定jdbcType。例如,假设我们要批量插入一个包含用户信息的列表,其中User类有一个名为birthday的属性,其类型为java.util.Date,则需要在SQL语句中使用${item.birthday, jdbcType=DATE}占位符,并手动指定JDBC类型为DATE

总之,只有在无法自动推断出正确的JDBC类型时,才需要手动指定jdbcType属性。否则,MyBatis会自动根据Java类型来推断相应的JDBC类型。

问题二:java类型中的String对应着jdbc的类型有多少种?他们区别分别是什么

在JDBC中,String类型对应着多种不同的数据库类型。下表列出了一些常见的String类型及其相应的JDBC类型:

Java类型

JDBC类型

描述

长度/可存储量

String

VARCHAR

可变长度字符串

最大65535个字节

String

CHAR

定长字符串

固定长度,最大255个字节

String

LONGVARCHAR

长文本类型

最大2GB

String

CLOB

字符型大对象

最大2GB

这些JDBC类型之间的差异如下:

  • VARCHAR和CHAR是两种不同的字符串类型,其中VARCHAR表示可变长度的字符串,而CHAR则表示固定长度的字符串。VARCHAR通常用于存储较短的字符串数据,而CHAR适用于存储长度固定且相对较短的字符串数据。

  • LONGVARCHAR也是一个可变长度的字符串类型,但它可以存储更长的字符串数据(通常是超过255个字符)。与VARCHAR不同,LONGVARCHAR是一个较少使用的数据类型,因为它可能会导致性能问题。

  • CLOB是一个特殊的字符串类型,用于存储非常长的字符串文本。CLOB通常用于存储大文本文件或其他需要大容量存储的数据。

注意:实际上,不同的数据库厂商对这些类型的定义可能略有不同,因此具体情况可能有所不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spider Cat 蜘蛛猫

你的鼓励将会是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值