目录
1.添加依赖
2.在config包下创建RedisConfig.java
3.mp自动装配
4.写controller层
5.service层
5.1service层实现
6.运行
6.1查询班级,及班级所对应的学生信息
6.2查询班级,及班级所对应的学生信息并分
1.添加依赖
<!-- 加一个redis的starter组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 加一个redis的starter组件-->
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<!-- 自动生成-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3</version>
</dependency>
<!--mybatis-plus-->
<!-- 自动生成-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3</version>
</dependency>
<!-- 模板-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.在config包下创建RedisConfig.java
并在类上添加注解 @Configuration
@Configuration注解表示一个类包含了Spring应用程序所需的配置信息,用于初始化应用程序的状态
// RedisTemplate
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
/**
* 缓存处理
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
3.mp自动装配
添加一个测试类 Mp.java
并运行 控制台输入 表名
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql:///数据库名","账号","密码")
// 全局配置
.globalConfig((scanner, builder) -> builder
.author("荒野的小西瓜")
//放到哪 项目的src下
.outputDir("XXX\\src\\main\\java")
)
// 包配置
.packageConfig(
(scanner, builder) ->
builder
.parent("com.aaa")
.pathInfo(Collections.singletonMap(OutputFile.xml, "XXX\\src\\main\\resources\\mapper")))
// 策略配置
.strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个表名用逗号分隔 所有输入 all")))
.controllerBuilder().enableRestStyle().enableHyphenStyle()
.entityBuilder().enableLombok().addTableFills(
new Column("create_time", FieldFill.INSERT)
).build())
/*
模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
.templateEngine(new BeetlTemplateEngine())
.templateEngine(new FreemarkerTemplateEngine())
*/
.execute();
// 处理 all 情况
}
protected static List<String> getTables(String tables) {
return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}
4.application.properties 配置文件
spring.redis.host=端口号
spring.redis.password=密码
spring.redis.database=选择数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///数据库?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=MySQL账号
spring.datasource.password=MySQL密码
# 时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
spring.jackson.serialization.write-date-keys-as-timestamps=false
#logging.level.com.baomidou.ant.test.dao=debug
#mybatis-plus
# r_name rName setRName
mybatis-plus.configuration.map-underscore-to-camel-case=true
#日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#mybatis-plus.configuration.log-impl=
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
#逻辑删除
mybatis-plus.global-config.db-config.logic-not-delete-value=0
mybatis-plus.global-config.db-config.logic-delete-value=1
4.写controller层
需求 查询年级表对应的所有学生信息
@RestController
@RequestMapping("/grade")
public class GradeController {
@Resource
private IGradeService gradeService;
@GetMapping
private List<Grade> getGrandsAll() {
List<Grade> getGrandsAll = gradeService.getGrandsAll();
return getGrandsAll;
}
}
=================查询年级表对应的所有学生信息并分页================
@RestController
@RequestMapping("/grade")
public class GradeController {
@Resource //自动注入实例化的对象
private IGradeService gradeService;
//查询班级,及班级所对应的学生信息并分页
@GetMapping
private List<Grade> getGrandsAll(Integer page, Integer size) {
List<Grade> getGrandsAll = gradeService.getGrandsAll();
//分页操作 传两个参数 page第几页 size每页显示多少条数据
//skip(X)第几页 limit()显示几条数据
//collect(Collectors.toList())把流转为集合
int i = (page - 1) * size;
List<Grade> collect = getGrandsAll.stream().skip(i).limit(size).collect(Collectors.toList());
return collect;
//分页操作
}
}
5.service层
public interface IGradeService extends IService<Grade> {
List<Grade> getGrandsAll();
}
5.1service层实现
@Service
public class GradeServiceImpl extends ServiceImpl<GradeMapper, Grade> implements IGradeService {
@Resource
private GradeMapper gradeMapper;
@Override
//缓存注解 一般放在service层 并在启动类上加上 @EnableCaching //开启缓存
@Cacheable(value = "mygrade")
public List<Grade> getGrandsAll() {
List<Grade> getGrandsAll = gradeMapper.getGrandsAll();
return getGrandsAll;
}
}
6.mapper层
springboot启动类 需要加上注解扫描 @MapperScan("com.aaa.mapper")
public interface GradeMapper extends BaseMapper<Grade> {
List<Grade> getGrandsAll();
}
XXXMapper.xml文件
<!--一个班级有多个学生 一个学生只能在一个班级 即一对多关系
autoMapping="true" 除主键为自动
-->
<resultMap id="getGradeAndStudent" type="com.aaa.entity.Grade" autoMapping="true">
<id property="gid" column="gid"></id>
<collection property="students" ofType="com.aaa.entity.Student" autoMapping="true">
<id property="id" column="id"></id>
</collection>
</resultMap>
<select id="getGrandsAll" resultMap="getGradeAndStudent">
select g.gid,g.gname,s.sname from grade g,student s
where g.gid=s.gid
</select>
6.运行
6.1查询班级,及班级所对应的学生信息
6.2查询班级,及班级所对应的学生信息并分页
查询第一页前两行 localhost:8080/grade?page=1&size=2
查询第二页前两行 localhost:8080/grade?page=2&size=2
由于grade表只有三个数据 所有第二页有一条数据并且包含两个学生