1、SQL

1、数据源的自动配置-HikariDataSource

1、导入JDBC场景

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jdbc</artifactId>
  4. </dependency>

包含以下:
HikariCP是数据库连接池(数据源)

image.png

数据库驱动?
为什么导入JDBC场景,官方不导入驱动?因为官方不知道我们接下要操作什么数据库。
手动引入MySQL驱动:
数据库版本和驱动版本对应
maven的三大原则:依赖传递原则,依赖就近原则(最短路径原则),声明优先原则

  1. 默认版本:<mysql.version>8.0.22</mysql.version>
  2. 两种修改引用数据库驱动的方式:
  3. 1、直接依赖引入具体版本(maven的就近依赖原则)
  4. 2、重新声明版本(maven的属性的就近优先原则)
  5. 1、
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>5.1.49</version>
  10. </dependency>
  11. 2、
  12. <properties>
  13. <java.version>1.8</java.version>
  14. <mysql.version>5.1.49</mysql.version>
  15. </properties>

2、分析自动配置

1、自动配置的类

  • DataSourceAutoConfiguration : 数据源的自动配置
    • 修改数据源相关的配置:spring.datasource开始的配置
    • 数据库连接池的配置,是自己容器中没有DataSource才自动配置的
      • @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
    • 底层默认自动配置好的连接池是:HikariDataSource
  1. @Configuration(proxyBeanMethods = false)
  2. @Conditional(PooledDataSourceCondition.class)
  3. @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
  4. @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
  5. DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
  6. DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
  7. protected static class PooledDataSourceConfiguration
  • DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置
  • JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行crud
  • JndiDataSourceAutoConfiguration: jndi的自动配置
  • XADataSourceAutoConfiguration: 分布式事务相关的自动配置

3、在配置文件中修改数据源相关配置项

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/db_account
  4. username: root
  5. password: 123456
  6. driver-class-name: com.mysql.jdbc.Driver

新版本的驱动类为:com.mysql.cj.jdbc.Driver
时区报错的可以在设置MySQL时区为东八区:set global time_zone=’+8:00’
然后查看时间是否与系统时间一致:select now();

4、测试

  1. @Slf4j
  2. @SpringBootTest
  3. class Boot05WebAdminApplicationTests {
  4. @Autowired
  5. JdbcTemplate jdbcTemplate; // JdbcTemplate自动注入
  6. @Test
  7. void contextLoads() {
  8. // jdbcTemplate.queryForObject("select * from account_tbl")
  9. // jdbcTemplate.queryForList("select * from account_tbl",)
  10. Long aLong = jdbcTemplate.queryForObject("select count(*) from account_tbl", Long.class);
  11. log.info("记录总数:{}",aLong);
  12. }
  13. }

2、使用Druid数据源(第三方)

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。配置好后登录即可查看相关数据
image.png

1、druid官方github地址

官方文档地址

整合第三方技术的两种方式

  • 自定义
  • 找starter(推荐)

2、自定义方式

1、创建数据源

1.引入数据源

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid</artifactId>
  4. <version>1.1.17</version>
  5. </dependency>

2.编写配置类,也就是将之前的xml中的bean通过方法实现
编写配置类后原来默认的自动配置数据源开始不生效,当前编写配置类生效
我们需要set各种配置,为了减少代码更改,可以将配置写在配置文件上,然后用@ConfigurationProperties(“spring.datasource”)绑定配置
image.png

  1. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
  2. destroy-method="close">
  3. <property name="url" value="${jdbc.url}" />
  4. <property name="username" value="${jdbc.username}" />
  5. <property name="password" value="${jdbc.password}" />
  6. <property name="maxActive" value="20" />
  7. <property name="initialSize" value="1" />
  8. <property name="maxWait" value="60000" />
  9. <property name="minIdle" value="1" />
  10. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  11. <property name="minEvictableIdleTimeMillis" value="300000" />
  12. <property name="testWhileIdle" value="true" />
  13. <property name="testOnBorrow" value="false" />
  14. <property name="testOnReturn" value="false" />
  15. <property name="poolPreparedStatements" value="true" />
  16. <property name="maxOpenPreparedStatements" value="20" />

2、配置StatViewServlet监控

配置_StatViewServlet配置

StatViewServlet的用途包括:

  • 提供监控信息展示的html页面
  • 提供监控信息的JSON API

image.png

  1. <servlet>
  2. <servlet-name>DruidStatView</servlet-name>
  3. <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>DruidStatView</servlet-name>
  7. <url-pattern>/druid/*</url-pattern>
  8. </servlet-mapping>

3、配置StatFilter

Druid的监控统计功能是通过filter-chain扩展实现,如果你要打开监控统计功能,配置StatFilter,具体看这里:
配置_StatFilter

用于统计监控信息;如SQL监控、URI监控

  1. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  2. ... ...
  3. StatFilter可以和其他的Filter配置使用
  4. 需要给数据源中配置如下属性;可以允许多个filter,多个用,分割;如:
  5. <property name="filters" value="stat,slf4j" />
  6. </bean>

如果我们用spring boot在配置类中配置代码为:
image.png
系统中所有filter:

别名 Filter类名
default com.alibaba.druid.filter.stat.StatFilter
stat com.alibaba.druid.filter.stat.StatFilter
mergeStat com.alibaba.druid.filter.stat.MergeStatFilter
encoding com.alibaba.druid.filter.encoding.EncodingConvertFilter
log4j com.alibaba.druid.filter.logging.Log4jFilter
log4j2 com.alibaba.druid.filter.logging.Log4j2Filter
slf4j com.alibaba.druid.filter.logging.Slf4jLogFilter
commonlogging com.alibaba.druid.filter.logging.CommonsLogFilter

4、配置WebStatFilter

WebStatFilter用于采集web-jdbc关联监控的数据。
他的web.xml配置为:

  1. <filter>
  2. <filter-name>DruidWebStatFilter</filter-name>
  3. <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  4. <init-param>
  5. <param-name>exclusions</param-name>
  6. <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>DruidWebStatFilter</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

如果我们用spring boot在配置类中配置代码为:
image.png

慢SQL记录配置

  1. <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
  2. <property name="slowSqlMillis" value="10000" />
  3. <property name="logSlowSql" value="true" />
  4. </bean>
  5. 使用 slowSqlMillis 定义慢SQL的时长

3、使用官方starter方式

1、引入druid-starter

Druid Spring Boot Starter

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid-spring-boot-starter</artifactId>
  4. <version>1.1.17</version>
  5. </dependency>

2、分析自动配置

  • 扩展配置项 spring.datasource.druid

    1. spring.datasource.url=
    2. spring.datasource.username=
    3. spring.datasource.password=
    4. # ...其他配置(可选,不是必须的,使用内嵌数据库的话上述三项也可省略不填)
  • DruidSpringAopConfiguration.class, 监控SpringBean的;配置项:spring.datasource.druid.aop-patterns

  • DruidStatViewServletConfiguration.class, 监控页的配置:spring.datasource.druid.stat-view-servlet;默认开启
  • DruidWebStatFilterConfiguration.class, web监控配置;spring.datasource.druid.web-stat-filter;默认开启
  • DruidFilterConfiguration.class}) 所有Druid自己filter的配置

相关的filter配置项

  1. private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";
  2. private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
  3. private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
  4. private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";
  5. private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";
  6. private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
  7. private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
  8. private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall"; // 防火墙

3、配置示例

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/db_account
  4. username: root
  5. password: 123456
  6. driver-class-name: com.mysql.jdbc.Driver
  7. druid:
  8. aop-patterns: com.atguigu.admin.* #监控SpringBean
  9. filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)
  10. stat-view-servlet: # 配置监控页功能
  11. enabled: true
  12. login-username: admin
  13. login-password: admin
  14. resetEnable: false
  15. web-stat-filter: # 监控web
  16. enabled: true
  17. urlPattern: /*
  18. exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
  19. filter:
  20. stat: # 对上面filters里面的stat的详细配置
  21. slow-sql-millis: 1000
  22. logSlowSql: true
  23. enabled: true
  24. wall:
  25. enabled: true
  26. config:
  27. drop-table-allow: false

SpringBoot配置示例
https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

配置项列表链接

3、整合MyBatis操作

https://github.com/mybatis
starter
SpringBoot官方的Starter:spring-boot-starter-
第三方的:
-spring-boot-starter

  1. <dependency>
  2. <groupId>org.mybatis.spring.boot</groupId>
  3. <artifactId>mybatis-spring-boot-starter</artifactId>
  4. <version>2.1.4</version>
  5. </dependency>

image.png

1、方法一:配置模式

  • 全局配置文件
  • SqlSessionFactory: 自动配置好了
  • SqlSession:自动配置了 SqlSessionTemplate 组合了SqlSession
  • @Import(AutoConfiguredMapperScannerRegistrar.class);
  • Mapper: 只要我们写的操作MyBatis的接口标注了 @Mapper 就会被自动扫描进来
  1. @EnableConfigurationProperties(MybatisProperties.class) MyBatis配置项绑定类。
  2. @AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
  3. public class MybatisAutoConfiguration{}
  4. @ConfigurationProperties(prefix = "mybatis")
  5. public class MybatisProperties

可以修改配置文件中 mybatis 开始的所有;
MyBatis入门文档

  1. 导入starter并配置mybatis配置项:

image.png

  1. # 配置mybatis规则
  2. mybatis:
  3. config-location: classpath:mybatis/mybatis-config.xml #全局配置文件位置
  4. mapper-locations: classpath:mybatis/mapper/*.xml #sql映射文件位置
  1. 编写官网的mybatis-config.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <environments default="development">
    7. <environment id="development">
    8. <transactionManager type="JDBC"/>
    9. <dataSource type="POOLED">
    10. <property name="driver" value="${driver}"/>
    11. <property name="url" value="${url}"/>
    12. <property name="username" value="${username}"/>
    13. <property name="password" value="${password}"/>
    14. </dataSource>
    15. </environment>
    16. </environments>
    17. <mappers>
    18. <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    19. </mappers>
    20. </configuration>
  2. 声明数据库表对应的mapper接口(别忘了mapper注解, 只要我们写的操作MyBatis的接口标注了 @Mapper 就会被自动扫描进来

image.png

  1. 绑定Mapper XML映射文件:Mapper映射用于数据库操作

    1. Mapper接口--->绑定Xml AccountMapper.xml
    2. <?xml version="1.0" encoding="UTF-8" ?>
    3. <!DOCTYPE mapper
    4. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    5. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    6. <mapper namespace="com.atguigu.admin.mapper.AccountMapper">
    7. <!-- public Account getAcct(Long id); 查询 -->
    8. <select id="getAcct" resultType="com.atguigu.admin.bean.Account">
    9. select * from account_tbl where id=#{id}
    10. </select>
    11. </mapper>
  2. 定义service实现接口服务:

image.png
controller请求:
image.png

配置 private Configuration configuration; mybatis.configuration下面的所有,就是相当于改mybatis全局配置文件中的值
在yaml中配置,相当于在mybatis-config.xml(MyBatis全局配置文件)中配置。

  1. # 配置mybatis规则
  2. mybatis:
  3. # config-location: classpath:mybatis/mybatis-config.xml 不写全局配置文件
  4. mapper-locations: classpath:mybatis/mapper/*.xml
  5. configuration:
  6. map-underscore-to-camel-case: true //开启数据库字段下划线向驼峰命名的转换 如数据库中为user_id,controller中为userId
  7. 可以不写全局;配置文件,所有全局配置文件的配置都放在configuration配置项中即可
  • 在application.yaml中指定Mapper配置文件的位置,以及指定全局配置文件的信息 (推荐;配置在mybatis.configuration

2、方法二:注解模式

只需修改下面内容,其他和配置模式一样

  1. @Mapper
  2. public interface CityMapper {
  3. @Select("select * from city where id=#{id}") // 将mapper.xml的映射直接用注解实现,不需要Mapper.xml文件了,
  4. public City getById(Long id); // 再加上用yaml配置mybatis配置项,MyBatis-config.xml也可以去掉
  5. public void insert(City city);
  6. }

3、混合模式

简单的语句推荐用注解模式,如果是很复杂的sql语句,可以用配置文件模式降低业务层代码复杂度
如下面insert方法如果用注解模式:
image.png
getById方法是用的注解模式,insert是用的配置文件模式
编写insert方法的映射xml文件,useGeneratedKeys=”true” keyProperty=”id” 设置主键id自增,设置后自增的id会自动的返回到作用域的city model中
image.png

  1. @Mapper
  2. public interface CityMapper {
  3. @Select("select * from city where id=#{id}")
  4. public City getById(Long id); // 将mapper.xml的映射直接用注解实现,不需要Mapper.xml文件了
  5. public void insert(City city); // city中的id请求是为Null,保存数据库后变为自增的id
  6. }

实现insert服务
image.png
controller调用服务:
image.png
结果:
image.png

最佳实战步骤:

  • 引入mybatis-starter
  • 配置application.yaml中,指定mapper-location位置即可
  • 编写Mapper接口并标注@Mapper注解
  • service实现接口
  • 简单方法直接注解方式
  • 复杂方法编写mapper.xml进行绑定映射
  • 在主程序上面标@MapperScan(“com.atguigu.admin.mapper”) 简化(不是特别推荐),系统会自动默认该路径下都是Mapper, 其他的接口就可以不用标注@Mapper注解

4、整合 MyBatis-Plus 完成CRUD

1、什么是MyBatis-Plus

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
mybatis plus 官网
建议安装 MybatisX 插件

2、整合MyBatis-Plus快速开始

mybatis plus 快速开始

  1. 引入 mybatis-plus-boot-starter 他里面包含mybatis和jdbc的相关依赖,这两个的starter就不需要引入了

    1. <dependency>
    2. <groupId>com.baomidou</groupId>
    3. <artifactId>mybatis-plus-boot-starter</artifactId>
    4. <version>3.4.1</version>
    5. </dependency>
  2. 配置数据源

    1. # DataSource Config
    2. spring:
    3. datasource:
    4. driver-class-name: org.h2.Driver
    5. schema: classpath:db/schema-h2.sql
    6. data: classpath:db/data-h2.sql
    7. url: jdbc:h2:mem:test
    8. username: root
    9. password: test
  3. 在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹 ```java @SpringBootApplication @MapperScan(“com.baomidou.mybatisplus.samples.quickstart.mapper”) public class Application {

    public static void main(String[] args) {

    1. SpringApplication.run(Application.class, args);

    }

}

  1. 4. 编写实体类User.java
  2. ```java
  3. @Data
  4. public class User {
  5. private Long id;
  6. private String name;
  7. private Integer age;
  8. private String email;
  9. }

@TableField(exist= false)表示该User中的该属性在数据库表中不存在
image.png
@TableName(“user”)用来指定数据库表名,如果没有,则默认为小写类名

  1. 编写Mapper接口类UserMapper.java
  • 只需要我们的Mapper继承 BaseMapper 就可以拥有crud能力 ```java public interface UserMapper extends BaseMapper {

}

  1. 6. 开始测试
  2. 添加测试类,进行功能测试:
  3. ```java
  4. @SpringBootTest
  5. public class SampleTest {
  6. @Autowired
  7. private UserMapper userMapper;
  8. @Test
  9. public void testSelect() {
  10. System.out.println(("----- selectAll method test ------"));
  11. List<User> userList = userMapper.selectList(null);
  12. Assert.assertEquals(5, userList.size());
  13. userList.forEach(System.out::println);
  14. }
  15. }
  1. 输出结果
    1. User(id=1, name=Jone, age=18, email=test1@baomidou.com)
    2. User(id=2, name=Jack, age=20, email=test2@baomidou.com)
    3. User(id=3, name=Tom, age=28, email=test3@baomidou.com)
    4. User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
    5. User(id=5, name=Billie, age=24, email=test5@baomidou.com)
    自动配置
  • MybatisPlusAutoConfiguration 配置类,里面的MybatisPlusProperties 配置项绑定。mybatis-plus:xxx 就是对mybatis-plus的定制
  • SqlSessionFactory 自动配置好。底层是容器中默认的数据源
  • mapperLocations 自动配置好的。有默认值。为classpath:*/mapper//*.xml;任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。建议以后sql映射文件,放在 mapper下**
  • 容器中也自动配置好了 SqlSessionTemplate
  • @Mapper 标注的接口也会被自动扫描;建议直接 @MapperScan(“com.atguigu.admin.mapper”) 批量扫描就行

优点:

  • 只需要我们的Mapper继承 BaseMapper 就可以拥有crud能力

    3、请求调用一般流程

    controller方法(自动注入的是service的各个service接口) —-> 调用service(service有各个service接口和对应的impl实现类来实现接口方法,impl实现类加@Service注入到容器中)—-> 调用mapper(接口)
    service接口及实现:
    image.png
    image.png
    controller:
    image.png

    3、MyBatis-Plus简化Service层

    在MyBatis-Plus中,IService 是一个顶级Service(接口) T泛型表示需要CRUD操作的对象类, 他里面规定了超多的CRUD方法
    ServiceImpl类继承 IService,继承并实现了超多CRUD方法,我们只需继承ServiceImpl就可以满足我们绝大部分CRUD需求
    ServiceImpl, T>是超多CRUD方法的实现类,第一个参数是需要实现的Mapper接口, 第二个参数是要操作的对象类 ```java @Service public class UserServiceImpl extends ServiceImpl implements UserService {

}

  1. 实现方法:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2462488/1642779667210-9089c549-264e-44d3-92e3-5d2087ab0a8e.png#clientId=u4b52046c-74cf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=538&id=uec092896&margin=%5Bobject%20Object%5D&name=image.png&originHeight=673&originWidth=876&originalType=binary&ratio=1&rotation=0&showTitle=false&size=307920&status=done&style=none&taskId=u59d5496a-071a-47bc-bd2c-f30b7b85b2a&title=&width=700.8)
  2. <a name="a2baa7bf"></a>
  3. ### 4、CRUD功能
  4. ```java
  5. @GetMapping("/user/delete/{id}")
  6. public String deleteUser(@PathVariable("id") Long id,
  7. @RequestParam(value = "pn",defaultValue = "1")Integer pn,
  8. RedirectAttributes ra){
  9. userService.removeById(id);
  10. ra.addAttribute("pn",pn);
  11. return "redirect:/dynamic_table";
  12. }
  13. @GetMapping("/dynamic_table")
  14. public String dynamic_table(@RequestParam(value="pn",defaultValue = "1") Integer pn,Model model){
  15. //表格内容的遍历
  16. // response.sendError
  17. // List<User> users = Arrays.asList(new User("zhangsan", "123456"),
  18. // new User("lisi", "123444"),
  19. // new User("haha", "aaaaa"),
  20. // new User("hehe ", "aaddd"));
  21. // model.addAttribute("users",users);
  22. //
  23. // if(users.size()>3){
  24. // throw new UserTooManyException();
  25. // }
  26. //从数据库中查出user表中的用户进行展示
  27. //构造分页参数
  28. Page<User> page = new Page<>(pn, 2);
  29. //调用page进行分页 在前端获取page中的属性
  30. Page<User> userPage = userService.page(page, null);
  31. // userPage.getRecords()
  32. // userPage.getCurrent()
  33. // userPage.getPages()
  34. // 保存到model中供前端获取
  35. model.addAttribute("users",userPage);
  36. return "table/dynamic_table";
  37. }

前端遍历生成数据:
image.png
分页功能需要配置MyBatis中的分页插件

  1. //Spring boot方式
  2. @Configuration
  3. @MapperScan("com.baomidou.cloud.service.*.mapper*")
  4. public class MybatisPlusConfig {
  5. // 旧版
  6. @Bean
  7. public PaginationInterceptor paginationInterceptor() {
  8. PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  9. // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
  10. // paginationInterceptor.setOverflow(false);
  11. // 设置最大单页限制数量,默认 500 条,-1 不受限制
  12. // paginationInterceptor.setLimit(500);
  13. // 开启 count 的 join 优化,只针对部分 left join
  14. paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
  15. return paginationInterceptor;
  16. }
  17. // 最新版
  18. @Bean
  19. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  20. // 配置并添加分页拦截器
  21. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  22. // 配置分页拦截器:可以配置分页大小等
  23. // interceptor.setXxxxx();
  24. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
  25. return interceptor;
  26. }
  27. }

Thymeleaf中的: ${#numbers.sequence(from,to)} 和 ${#numbers.sequence(from,to,step)}可以创建一个从from到to的int数组
下面是生成后赋值给num用来显示页面
image.png
image.png
添加判断当前页和动态跳转链接
image.png

5、删除

前端动态生成每一条数据的删除链接,包含删除数据的id和当前页,以便于删除完后还重定向到当前页
image.png
控制器方法删除数据, RedirectAttributers 用来传递重定向参数
image.png

2、NoSQL

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

1、Redis自动配置

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

image.png

自动配置:

  • RedisAutoConfiguration 自动配置类。RedisProperties 属性类 —> spring.redis.xxx是对redis的配置
  • 连接工厂是准备好的。LettuceConnectionConfiguration(默认)、JedisConnectionConfiguration
  • 自动注入了RedisTemplate<Object, Object> Object分别为 key:value: xxxTemplate;用于操作
  • 自动注入了StringRedisTemplate;k:v都是String
  • 底层只要我们使用 StringRedisTemplate、RedisTemplate就可以操作redis

redis环境搭建
1、阿里云按量付费redis。选经典网络便宜
2、申请redis的公网连接地址,用于直接连接
image.png
3、修改白名单 允许0.0.0.0/0 访问,也就是允许所有地址访问
4、创建账号,用于访问
image.png
5、通过客户端测试连接公网地址(默认密码是”账号:密码”)
image.png
6、Yaml配置redis,其他配置项可以在相应的RedisPropertis.class中找到对应的属性、方法及说明,其他组件的配置也是这样找或者官网找
RedisPropertis.class可以在对应的AutoConfig中找到
image.png
7、测试代码

  1. @Autowired
  2. StringRedisTemplate redisTemplate;
  3. @Test
  4. void testRedis(){
  5. ValueOperations<String, String> operations = redisTemplate.opsForValue();
  6. operations.set("hello","world");
  7. String hello = operations.get("hello");
  8. System.out.println(hello);
  9. }

2、RedisTemplate与Lettuce

RedisTemplate默认用的Lettuce连接工厂

3、切换至jedis

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <!-- 导入jedis-->
  6. <dependency>
  7. <groupId>redis.clients</groupId>
  8. <artifactId>jedis</artifactId>
  9. </dependency>

配置jedis

  1. spring:
  2. redis:
  3. host: r-bp1nc7reqesxisgxpipd.redis.rds.aliyuncs.com
  4. port: 6379
  5. password: lfy:Lfy123456
  6. client-type: jedis
  7. jedis:
  8. pool:
  9. max-active: 10

4、使用实例

统计后台页面访问次数(通过拦截器实现)

  1. Filter和Interceptor的区别

image.png

  1. 编写拦截器,实现统计访问次数

image.png

  1. 在拦截器配置中添加拦截器

因为在RedisUrlCountInterceptor中我们自己注入了对象(StringRedisTemplate对象),所有这里我们不能直接add一个新的RedisUrlCountInterceptor对象,需要从容器中取RedisUrlCountInterceptor对象。因为只有容器中的组件,spring才会解析这个对象的Spring相关注解(如@Autowired)
从容器中自动注入获取RedisUrlCountInterceptor对象
image.png

image.png

  1. 拦截器自动统计访问次数存在redis中

image.png

  1. 将redis数据传到前端

redisTemplate在上面声明并自动注入(@Autowired)
image.png

不用阿里云redis时记得在控制台释放掉,因为选择的是按量付费