SpringBoot——整合MyBatis实现CRUD
SpringBoot项目的持久层一般都是使用JPA或者MyBatis,我个人是比较喜欢MyBatis。
首先我们打开pom.xml,添加上mybatis需要的一些依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在resources下创建mybatis-config.xml :
<?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>
<settings>
<!-- 获取数据库自增id -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 支持别名 -->
<setting name="useColumnLabel" value="true" />
<!-- 支持驼峰命名转换,例如表字段create_time 对应实体类的createTime属性 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
建表:
CREATE TABLE `t_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT '' COMMENT '用户名',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
1
2
3
4
5
6
7
创建对应的实体类:
package com.example.demo.entity;
import java.util.Date;
public class User {
private Integer userId;
private String username;
private Date createTime;
private Date updateTime;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
创建Dao:
package com.example.demo.dao;
import com.example.demo.entity.User;
import java.util.List;
public interface UserDao {
List<User> getAll();
User find(int userId);
int insert(User user);
int delete(int userId);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
resources目录下创建mybatis目录,用于存放mapper文件,整体目录结构如下:
在application.yml配置文件中配置数据库连接信息和mybatis
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
username: root
password: root
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mybatis/*Mapper.xml
1
2
3
4
5
6
7
8
9
编写UserMapper.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.UserDao">
<select id="getAll" resultType="com.example.demo.entity.User">
select * from t_user order by user_id desc
</select>
<select id="find" resultType="com.example.demo.entity.User">
select * from t_user where user_id = #{userId}
</select>
<insert id="insert" useGeneratedKeys="true" keyProperty="userId" keyColumn="user_id" parameterType="com.example.demo.entity.User">
insert into t_user(username,create_time,update_time) values(#{username},#{createTime},#{updateTime})
</insert>
<update id="update" parameterType="com.example.demo.entity.User">
update t_user
<set>
<if test="username != null">username=#{username},</if>
<if test="updateTime != null">update_time=#{updateTime},</if>
</set>
where user_id=#{userId}
</update>
<delete id="delete">
delete from t_user where user_id=#{userId}
</delete>
</mapper>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
修改SpringBoot启动类,加上@MapperScan 注解
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
下面进行测试,打开UserDao,点击接口名UserDao,然后按alt+回车,点击create test:
选中userdao中要进行测试的方法:
选择确定,然后会自动创建UserDaoTest,编写测试方法然后右键,点击run执行测试方法
package com.example.demo.dao;
import com.example.demo.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao;
@Test
public void getAll() {
List<User> list = userDao.getAll();
assertEquals(1,list.size());
}
@Test
public void find() {
User user = userDao.find(1);
assertEquals("tom",user.getUsername());
}
@Test
public void insert() {
User user = new User();
user.setUsername("jack");
user.setCreateTime(new Date());
int num = userDao.insert(user);
assertEquals(1,num);
}
@Test
public void delete() {
int num = userDao.delete(1);
assertEquals(1,num);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
注意:
要给测试类加上@RunWith 和 @SpringBootTest 注解
如果你用的是IDEA,那么在Autowired UserDao时,可能会提示错误,原因是找不到对应的bean。UserDao是接口,找不到bean是正常的,可以不用管这个错误,运行时是不会报错的。如果你想把错误提示去掉,可以在setting设置中错误级别从Error改为Warning,具体见下图: