1.数据准备
Mysql数据库
-- ----------------------------
-- Table structure for province
-- ----------------------------
DROP TABLE IF EXISTS `province`;
CREATE TABLE `province` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`pname` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`pid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of province
-- ----------------------------
INSERT INTO `province` VALUES (1, '广东');
INSERT INTO `province` VALUES (2, '湖北');
INSERT INTO `province` VALUES (3, '湖南');
INSERT INTO `province` VALUES (4, '四川');
INSERT INTO `province` VALUES (5, '山东');
INSERT INTO `province` VALUES (6, '山西');
INSERT INTO `province` VALUES (7, '广西');
INSERT INTO `province` VALUES (8, '河北');
INSERT INTO `province` VALUES (9, '云南');
INSERT INTO `province` VALUES (10, '江西');
INSERT INTO `province` VALUES (11, '浙江');
INSERT INTO `province` VALUES (12, '辽宁');
SET FOREIGN_KEY_CHECKS = 1;
2.创建spring-boot项目 导入依赖
<properties>
<!-- jdk版本-->
<java.version>1.8</java.version>
<!-- 外部引入jar包版本-->
<mysql.version>5.1.49</mysql.version>
<mybatis.plus.version>3.4.3.1</mybatis.plus.version>
<druid.version>1.1.23</druid.version>
</properties>
<dependencies>
<!-- druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!-- aop切面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 配置索引-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<!-- 打包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
3.spring-boot配置文件
#spring 数据库配置
spring:
datasource:
url: jdbc:mysql://数据库地址:端口号/数据库名称?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false
username: 账户
password: 密码
druid:
max-active: 10
min-idle: 5
#Redis
redis:
host: redis地址
#mybatis-plus配置sql语句
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4.javabean
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor //全参构造
@NoArgsConstructor //无参构造
@TableName("province")
public class Province implements Serializable {
//声明当前属性为主键,并且为自增类型
@TableId(type = IdType.AUTO)
private Integer pid;
private String pname;
}
5. RedisConfi 配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* 设置Redis序列化规则配置类
*/
//声明当前类时spring-boot配置类
@Configuration
public class RedisConfig {
/**
* 配置序列化规则
* @param redisConnectionFactory 链接工厂
* @return RedisTemplate
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
//让当前自定义的RedisTemplate绑定链接转换工厂
template.setConnectionFactory(redisConnectionFactory);
//设置当前模板的key的序列化规则
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
//设置value的序列化规则
JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
//template.setHashValueSerializer(stringRedisSerializer);
//template.setValueSerializer(stringRedisSerializer);
template.setValueSerializer(jdkSerializationRedisSerializer);
template.setHashValueSerializer(jdkSerializationRedisSerializer);
return template;
}
}
6.Aop配置类
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
/**
* spring-boot中配置aop切面类 @Aspect
*/
@Configuration
@Aspect //声明当前类为切面类
public class MyAspectConfig {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
//@Around("execution(* com.rimi.service.impl.ProvinceServiceImpl.findAllProvince())")
@Around("execution(* com.baomidou.mybatisplus.extension.service.IService.list())")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//方法执行前(前置通知)
BoundValueOperations<String, Object> provincesOperations = redisTemplate.boundValueOps("provinces");
Object provinces = provincesOperations.get();
if (provinces != null){
return provinces;
}
System.out.println("findAll执行前");
//要增强的原方法
Object proceed = joinPoint.proceed();
//将从数据库查询的数据写入Redis缓存
//方法执行后(后置通知)
provincesOperations.set(proceed);
System.out.println("findAll执行后");
return proceed;
}
}
7.controller层
import com.rimi.bean.Province;
import com.rimi.service.ProvinceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("provinces")
public class ProvinceController {
@Autowired
private ProvinceService provinceService;
@GetMapping("")
public List<Province> getProvinces(){
//调用mybatis-plus的service-crud方法查询
return provinceService.list();
//调用mybatis-mapper-crud方法查询
//return provinceService.findAllProvince();
}
@GetMapping("/{id}")
public Province getProvinceById(@PathVariable("id") Integer pid){
//调用mybatis-plus的service-crud方法查询
return provinceService.getById(pid);
//调用mybatis-mapper-crud方法查询
//return provinceService.findProvinceById(pid);
}
}
8.service层与impl
import com.baomidou.mybatisplus.extension.service.IService;
import com.rimi.bean.Province;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public interface ProvinceService extends IService<Province> {
/**
* 查询所有省份
* @return
*/
List<Province> findAllProvince();
/**
* 根据Id查询省份
* @param pid
* @return
*/
Province findProvinceById(Integer pid);
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rimi.bean.Province;
import com.rimi.mapper.ProvinceMapper;
import com.rimi.service.ProvinceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProvinceServiceImpl extends ServiceImpl<ProvinceMapper,Province> implements ProvinceService {
@Autowired
private ProvinceMapper provinceMapper;
@Override
public List<Province> findAllProvince() {
return provinceMapper.selectList(null);
}
@Override
public Province findProvinceById(Integer pid) {
return provinceMapper.selectById(pid);
}
}
9.mapper层
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rimi.bean.Province;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ProvinceMapper extends BaseMapper<Province> {
}