测试帮日记-小强测试品牌旗下

使用spring boot 定时同步数据,你值得拥有

2019-11-03 10:55:00    testingbang    99    原创

点击链接加入QQ群229390571(全国招聘信息、免费公开课、视频应有尽有):https://jq.qq.com/?_wv=1027&k=5rbudQa 更多内容可以关注公众号:测试帮日记

==========================================视频


=========================================文字版

今天我们来说说怎么用spring boot框架定时同步数据

一、首先来介绍一下什么是spring boot

spring boot是一个轻量级的Java 开发框架,我们可以使用这个框架,来进行快速的开发

二、需求分解

要实现定时同步数据这个功能,需要分3个步骤:

1.创建定时任务

2.写同步数据服务

3.定时任务调用同步数据的服务

三、如何创建定时任务

Spring Boot & Scheduling

代码示例

 

 

 

cron表达式

一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。

按顺序依次为

秒(0~59)

分钟(0~59)

小时(0~23)

天(月)(0~31,但是你需要考虑你月的天数)

月(0~11)

天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)

年份(1970-2099)【可选】

一些示例:

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

0 0 12 ? * WED 表示每个星期三中午12点

"0 0 12 * * ?" 每天中午12点触发

"*/10 * * * * ?"  # 每隔10秒跑一次

"0 15 10 ? * *" 每天上午10:15触发

"0 15 10 * * ?" 每天上午10:15触发

"0 15 10 * * ? *" 每天上午10:15触发

"0 15 10 * * ? 2005" 2005年的每天上午10:15触发

"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发

"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发

"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发

"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发

"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发

"0 15 10 15 * ?" 每月15日上午10:15触发

"0 15 10 L * ?" 每月最后一日的上午10:15触发

"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发

"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发

"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

四、写同步数据服务

1、不用spring boot怎么操作数据库

JDBC访问数据库的步骤:

1)注册和加载驱动(可以省略)

2)获取连接

3)Connection获取Statement对象

4)使用Statement对象执行SQL语句

5)返回结果集

6)释放资源

2、为什么要用spring boot

程序猿只关心业务sql,所以其他操作交给spring boot框架做就好

3、如何用spring boot操作数据库

1)配置数据库链接

application.yml中配置即可

 

2)创建实体类

为什么要创建实体类,因为要用ORM思想来操作数据库

ORM思想:对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。

相当于类对应表,属性对应字段

 

@Entity

@Table(name = "usr_user")

@Data

public class UserPo implements UserDetails {

@Id

protected Long id;

 

/**

* 创建时间

*/

@JsonFormat(pattern = DateFormat.TIMESTAMP, timezone = "GMT+8")

@Column(updatable = false, nullable = false)

protected LocalDateTime creation;

 

/**

* 最后修改时间

*/

@JsonFormat(pattern = DateFormat.TIMESTAMP, timezone = "GMT+8")

@Column(nullable = false)

protected LocalDateTime lastModified;

 

/**

* 开启状态

*/

private boolean active = true;

 

/**

* 删除状态

*/

private boolean removed = false;

 

@NotNull()

@Size(min = 2, max = 100)

@Column(length = 50, unique = true)

@Pattern(regexp = "[a-zA-Z0-9_u4e00-u9fa5.@-]{2,50}")

private String account;

 

@NotNull()

@Size(min = 36, max = 150)

@Column(length = 150, nullable = false)

private String password;

@NotNull

@Size(min = 2, max = 100)

@Column(length = 45)

private String name;

@NotNull

@Size(min = 6, max = 30)

@Column(nullable = false, length = 30)

private String tel;

 

private boolean superAdmin;

 

}

 

3)创建数据仓库

数据仓库就是我们要对数据做什么操作

 

@Repository

public class UserRepository {

 

private final JdbcTemplate jdbcTemplate;

 

@PersistenceContext

private EntityManager entityManager;

 

@Autowired

public UserRepository(JdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

 

/**

* 根据账号查询用户信息。

*

* @param account 用户账号

* @return 用户信息。

*/

public UserPo findByAccount(String account) {

RowMapper<UserPo> rowMapper = new BeanPropertyRowMapper<>(UserPo.class);

return jdbcTemplate.queryForObject("select * from usr_user where account = ? ", rowMapper, account);

}

 

/**

* 删除全部用户信息

*/

public void deleteAllUser() {

this.jdbcTemplate.update("delete from usr_user");

}

 

/**

* 保存用户。

*

* @param userPo 用户实体。

*/

public void saveUser(UserPo userPo) {

this.entityManager.persist(userPo);

}

 

}

 

4)同步数据服务调数据仓库中的方法

@Service

@Transactional

public class UserSyncService {

 

private final UserRepository userRepository;

 

private final AmpUserRepository ampUserRepository;

 

@Autowired

public UserSyncService(UserRepository userRepository, AmpUserRepository ampUserRepository) {

this.userRepository = userRepository;

this.ampUserRepository = ampUserRepository;

}

 

public void userSync(){

// 1. 清空alphadesk库usr_user表中的所有数据

this.userRepository.deleteAllUser();

 

// 2. 查询amp库usr_user表中的所有数据

List<UserPo> userPoList = this.ampUserRepository.findAllUserIncludeAdmin();

 

// 3. 将amp的数据插入alphadesk库

for (UserPo userPo : userPoList) {

this.userRepository.saveUser(userPo);

}

}

 

}

 

五、定时任务调用同步数据的服务