springboot(四)_springboot集成mybatis并添加定时任务

源码地址

SpringBoot集成mybatis

之前写 RESTful 接口使用的是 jpa,这里使用 mybatis 来实现对数据库的操作。

添加依赖

首先新建一个名为 springboot-mybatis的工程,在 pom.xml 中添加 mybatis-spring-boot-starter,mysql-connector-java的依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置文件

在 application.properties 中添加数据库的连接,以及关于 mybatis 的配置

1
2
3
4
5
6
7
8
spring.datasource.url=jdbc:mysql://localhost:3306/users?verifyServerCertificate=false&useSSL=false&requireSSL=false&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#扫描的实体类包
mybatis.typeAliasesPackage=top.zhyee.springbootmybatis.entity
#mapper文件所在位置
mybatis.mapperLocations=classpath:mapper/*.xml

建表

在上面配置中连接的数据库里新建 sys_user 表

1
2
3
4
5
6
7
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

使用工具自动生成文件

自动生成代码的工具可以自己从网上下载(两个jar包,注意版本),generator.xml 文件如下

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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 数据库驱动包位置 -->
<classPathEntry location="/users/zhiyi/desktop/mybatis/mysql-connector-java-5.1.34.jar" /> <!-- 1 -->
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 数据库链接URL、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/users?characterEncoding=utf8" userId="root" password="ROOT"> <!-- 2 -->
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成模型的包名和位置 --> <!-- 3 -->
<javaModelGenerator targetPackage="top.zhyee.springbootmybatis.entity" targetProject="/users/zhiyi/desktop/mybatis/target">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成的映射文件包名和位置 --> <!-- 4 -->
<sqlMapGenerator targetPackage="com.mapper" targetProject="/users/zhiyi/desktop/mybatis/target">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成DAO的包名和位置 --> <!-- 5 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="top.zhyee.springbootmybatis.dao" targetProject="/users/zhiyi/desktop/mybatis/target">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 要生成那些表(更改tableName和domainObjectName就可以) --><!-- 6 -->
<table tableName="sys_user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
</context>
</generatorConfiguration>

进入到 mybatis-generator-core 包所在的目录下,在命令行运行

1
java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite

然后可以在 xml 中配置的路径下找到生成好的代码,包含mapper.xml,dao层的mapper接口,以及实体类,贴到项目里就可以啦。(生成的代码过多,可以根据自己的需要进行删减)

添加 Controller

这里只添加了 controller ,没有使用 service 层。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @author zhyee
* @date 2018/7/20 下午6:18
*/
@RequestMapping("/users")
@RestController
public class UserController {

private UserMapper userMapper;

@Autowired
public UserController(UserMapper userMapper) {
this.userMapper = userMapper;
}

@PostMapping
public void createUser(@RequestBody User user){
userMapper.insert(user);
}
}

到目前为止的项目结构如下

P8F4gA.png

配置启动类扫描路径

在启动类上添加 @MapperScan 注解,使其可以扫描到我们的 dao 层接口

1
2
3
4
5
6
7
@SpringBootApplication
@MapperScan("top.zhyee.springbootmybatis.dao")
public class SpringbootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisApplication.class, args);
}
}

配置完成,启动项目,再使用postman发送请求

P8Pgr6.md.png

可以看到数据库已经成功插入数据啦

P8P2qK.png

使用@Schedul实现定时任务

开启定时任务

在 springboot 启动类添加 @EnableScheduling 注解开启定时任务

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@MapperScan("top.zhyee.springbootmybatis.dao")
@EnableScheduling
public class SpringbootMybatisApplication {

public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisApplication.class, args);
}
}

创建任务

这里为了偷懒,直接在controller创建任务了~,每30秒查询一次数据库

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
/**
* @author zhyee
* @date 2018/7/20 下午6:18
*/
@RequestMapping("/users")
@RestController
public class UserController {

private UserMapper userMapper;

@Autowired
public UserController(UserMapper userMapper) {
this.userMapper = userMapper;
}

@PostMapping
public void createUser(@RequestBody User user){
userMapper.insert(user);
}

@Scheduled(fixedRate = 30000)
public void task(){
System.out.println(userMapper.selectByPrimaryKey(1).getName());//之前添加的数据
}
}

然后运行项目,可以看到控制台打印出的内容

P8knDx.png

关于@Scheduled的使用

  • @Scheduled(fixedRate = 5000:上一次开始执行时间点之后5秒再执行
  • @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
  • @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
  • @Scheduled(cron=”/5 “) :通过cron表达式定义规则,cron有7位,按顺序为 秒,分,小时,日期,月份,星期,年份。