目录

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查询班级,及班级所对应的学生信息

springboot 统计网页浏览量_springboot 统计网页浏览量

6.2查询班级,及班级所对应的学生信息并分页

查询第一页前两行  localhost:8080/grade?page=1&size=2

springboot 统计网页浏览量_spring_02

查询第二页前两行  localhost:8080/grade?page=2&size=2

由于grade表只有三个数据 所有第二页有一条数据并且包含两个学生

springboot 统计网页浏览量_spring_03