咨询QQ:2083503238、1684129674、480934277(请勿重复咨询) 咨询微信:qiangfans
使用spring boot 定时同步数据,你值得拥有
- 2019-11-03 10:55:00
- testingbang
- 原创 2204 投稿得红包
点击链接加入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);
}
}
}
五、定时任务调用同步数据的服务