使用Springboo和mybatis框架,连接mysql数据库,给出具体程序,程序包含Dao层,Mapper.xml文件,Service层,Service实现类,Controller层,统计本周第一天 本月第一天 本年第一天起到今天为止的中奖趋势接口 并对接口进行缓存处理 过期时间10分钟
时间: 2024-03-28 14:37:19 浏览: 12
好的,下面是一个基于 Spring Boot 和 MyBatis 的程序示例,包含 Dao 层、Mapper.xml 文件、Service 层、Service 实现类和 Controller 层。其中,统计本周第一天、本月第一天和本年第一天起到今天为止的中奖趋势接口并对接口进行缓存处理,缓存过期时间为 10 分钟。
1. 创建数据库和数据表
首先,我们需要创建一个 MySQL 数据库和相应的数据表。假设数据库名为 `lottery`,数据表名为 `t_lottery_statistics_prize`,数据表结构如下:
```sql
CREATE TABLE `t_lottery_statistics_prize` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`statistics_date` date NOT NULL COMMENT '统计日期',
`lottery_win_count` int(11) NOT NULL DEFAULT '0' COMMENT '中奖次数',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_statistics_date` (`statistics_date`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='彩票中奖统计表';
```
2. 添加 Maven 依赖
在 pom.xml 文件中添加以下 Maven 依赖:
```xml
<dependencies>
<!-- Spring Boot 相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- MyBatis 相关依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
</dependencies>
```
3. 配置数据源和 MyBatis
在 application.properties 文件中配置数据源和 MyBatis:
```properties
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/lottery?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis 配置
mybatis.mapper-locations=classpath*:mapper/*.xml
mybatis.configuration.cache-enabled=true
```
4. 编写实体类
创建一个名为 `Trend` 的实体类,用于存储中奖趋势数据:
```java
public class Trend {
private Date statisticsDate;
private int lotteryWinCount;
public Date getStatisticsDate() {
return statisticsDate;
}
public void setStatisticsDate(Date statisticsDate) {
this.statisticsDate = statisticsDate;
}
public int getLotteryWinCount() {
return lotteryWinCount;
}
public void setLotteryWinCount(int lotteryWinCount) {
this.lotteryWinCount = lotteryWinCount;
}
}
```
5. 编写 Dao 接口
创建一个名为 `TrendDao` 的 Dao 接口,用于定义查询中奖趋势数据的方法:
```java
public interface TrendDao {
List<Trend> selectTrend(Date weekBegin, Date monthBegin, Date yearBegin);
}
```
6. 编写 Mapper.xml 文件
在 resources 目录下创建 mapper 目录,并创建一个名为 `TrendMapper.xml` 的 Mapper.xml 文件。在该文件中,定义查询中奖趋势数据的 SQL 语句:
```xml
<?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.dao.TrendDao">
<select id="selectTrend" resultMap="TrendResultMap">
SELECT
DATE_FORMAT(statistics_date, '%Y-%m-%d') as statisticsDate,
COUNT(*) as lotteryWinCount
FROM
t_lottery_statistics_prize
WHERE
statistics_date BETWEEN #{weekBegin} AND NOW()
AND statistics_date >= #{monthBegin}
AND statistics_date >= #{yearBegin}
GROUP BY
DATE_FORMAT(statistics_date, '%Y-%m-%d')
ORDER BY
DATE_FORMAT(statistics_date, '%Y-%m-%d') DESC
</select>
<resultMap id="TrendResultMap" type="com.example.demo.entity.Trend">
<result column="statisticsDate" property="statisticsDate"/>
<result column="lotteryWinCount" property="lotteryWinCount"/>
</resultMap>
</mapper>
```
7. 编写 Service 接口和实现类
创建一个名为 `TrendService` 的 Service 接口,定义查询中奖趋势数据的方法:
```java
public interface TrendService {
List<Trend> getTrend();
}
```
创建一个名为 `TrendServiceImpl` 的 Service 实现类,实现 `TrendService` 接口中的方法,并添加缓存功能:
```java
@Service
public class TrendServiceImpl implements TrendService {
@Autowired
private TrendDao trendDao;
@Autowired
private CacheManager cacheManager;
@Override
@Cacheable(value = "trendCache", key = "'trend'")
public List<Trend> getTrend() {
Date weekBegin = calculateWeekBegin();
Date monthBegin = calculateMonthBegin();
Date yearBegin = calculateYearBegin();
return trendDao.selectTrend(weekBegin, monthBegin, yearBegin);
}
private Date calculateWeekBegin() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
return calendar.getTime();
}
private Date calculateMonthBegin() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 1);
return calendar.getTime();
}
private Date calculateYearBegin() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, 1);
return calendar.getTime();
}
@CacheEvict(value = "trendCache", allEntries = true)
public void clearCache() {
}
}
```
在该实现类中,使用 `@Cacheable` 注解添加缓存功能,在 `getTrend()` 方法上设置缓存名称为 `trendCache`,缓存键为 `'trend'`,缓存过期时间为 10 分钟。同时,还定义了三个方法用于计算本周第一天、本月第一天和本年第一天的值,并在 `getTrend()` 方法中调用这三个方法来获取参数值。
另外,还添加了一个名为 `clearCache()` 的方法,用于清空缓存。在该方法上使用 `@CacheEvict` 注解来清空 `trendCache` 缓存。
8. 编写 Controller 层
创建一个名为 `TrendController` 的 Controller 层,用于向客户端提供查询中奖趋势数据的接口:
```java
@RestController
@RequestMapping("/trend")
public class TrendController {
@Autowired
private TrendService trendService;
@GetMapping("/list")
public List<Trend> getTrendList() {
return trendService.getTrend();
}
}
```
在该类中,定义了一个名为 `/trend/list` 的 GET 请求接口,用于查询中奖趋势数据。在该接口中,调用 `TrendService` 中的 `getTrend()` 方法来获取中奖趋势数据。
9. 启动应用程序
现在,我们可以启动应用程序,并访问 `http://localhost:8080/trend/list` 接口来查询中奖趋势数据。
在程序启动后,第一次访问该接口会执行数据库查询操作,并将查询结果缓存到 `trendCache` 缓存中。接下来的 10 分钟内,再次访问该接口时将直接从缓存中获取结果,不再执行数据库查询操作。10 分钟后缓存过期,再次访问该接口时将重新执行数据库查询操作,并将查询结果缓存到 `trendCache` 缓存中。
注意:在开发环境下,如果需要清空缓存,可以调用 `TrendServiceImpl` 中的 `clearCache()` 方法来清空 `trendCache` 缓存。在生产环境下,可以使用 Spring Cache 的管理工具来手动清空缓存。