首先,我们需要添加必要的依赖项,这里使用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属性的情况:
当Java类型和数据库表列的数据类型不匹配时,需要指定jdbcType属性。例如,当Java实体类中声明的属性类型为java.math.BigDecimal时,而数据库表中的列类型为NUMERIC时,需要在映射文件中将该属性的jdbcType设置为NUMERIC。
当使用<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通常用于存储大文本文件或其他需要大容量存储的数据。
注意:实际上,不同的数据库厂商对这些类型的定义可能略有不同,因此具体情况可能有所不同。