缓存(本地缓存)
在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计。
- 常用的缓存分两种:本地缓存和分布式缓存。
- 常用的本地缓存是guava cache,本文主要介绍guava cache在项目中的使用,首先来了解下为什么使用缓存,以数据库(如MYSQL)、本地缓存(如guava cache)及分布式缓存(如redis)的区别来讲:
一、数据库、本地缓存及分布式缓存的区别
1、存储位置:
- 数据库:任何机器硬盘,开关机时,数据不丢失
- 本地缓存:本机内存,一旦关机,之前的数据丢失
- 分布式缓存(如redis):存在redis所在机器的内存,一旦redis所在机器关机,数据丢失
2、持久化:
- 数据库:可以持久化
- 本地缓存:不可以持久化
- 分布式缓存(如redis):不可以持久化
3、访问速度:
- 数据库:慢
- 本地缓存:最快
- 分布式缓存:快
4、扩展性:
- 数据库:可扩展,可存在其他机器的硬盘
- 本地缓存:不可扩展,只能存在本机内存
- 分布式缓存:可扩展,可存在其他机器的内存
5、使用场景:
- 数据库:需要实现持久化保存
- 本地缓存:需要快速访问,但需要考虑内存大小
- 分布式缓存:1)需要快速访问,不需要考虑内存大小
2)需要实现持久化,但会丢失一些数据
3)需要让缓存集中在一起,访问任一机器上内存中的数据都可以从缓存中得到
二、实例
基于SSMM框架整合步骤,连接(SSMM(spring+springmvc+maven+mybatis)框架整合)的flowershop项目。
1、启动MYSQL
2、创建mvn项目
- 配置pom.xml文件(这里直接给出已经配置好的)
-
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.wn</groupId> 8 <artifactId>flowershop</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 <name>flowershop</name> 11 <packaging>war</packaging> 12 <properties> 13 <java.version>1.8</java.version> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 16 <spring.version>4.2.4.RELEASE</spring.version> 17 <mybatis.version>3.2.8</mybatis.version> 18 <mybatis-spring.version>1.2.2</mybatis-spring.version> 19 <jackson.version>2.6.4</jackson.version> 20 <servlet-api.version>3.1.0</servlet-api.version> 21 </properties> 22 <dependencies> 23 <!-- servlet --> 24 <dependency> 25 <groupId>javax.servlet</groupId> 26 <artifactId>javax.servlet-api</artifactId> 27 <version>${servlet-api.version}</version> 28 <scope>provided</scope> 29 </dependency> 30 <!-- 引入spring --> 31 <dependency> 32 <groupId>org.springframework</groupId> 33 <artifactId>spring-core</artifactId> 34 <version>${spring.version}</version> 35 </dependency> 36 <dependency> 37 <groupId>org.springframework</groupId> 38 <artifactId>spring-beans</artifactId> 39 <version>${spring.version}</version> 40 </dependency> 41 <dependency> 42 <groupId>org.springframework</groupId> 43 <artifactId>spring-context</artifactId> 44 <version>${spring.version}</version> 45 </dependency> 46 <!-- spring mvc --> 47 <dependency> 48 <groupId>org.springframework</groupId> 49 <artifactId>spring-web</artifactId> 50 <version>${spring.version}</version> 51 </dependency> 52 <dependency> 53 <groupId>org.springframework</groupId> 54 <artifactId>spring-webmvc</artifactId> 55 <version>${spring.version}</version> 56 </dependency> 57 <!-- 数据库相关 --> 58 <dependency> 59 <groupId>org.springframework</groupId> 60 <artifactId>spring-jdbc</artifactId> 61 <version>${spring.version}</version> 62 </dependency> 63 <!-- java连mysql必须的包 --> 64 <dependency> 65 <groupId>mysql</groupId> 66 <artifactId>mysql-connector-java</artifactId> 67 <version>5.1.27</version> 68 <scope>runtime</scope> 69 </dependency> 70 <!-- 数据源 --> 71 <dependency> 72 <groupId>org.apache.tomcat</groupId> 73 <artifactId>tomcat-jdbc</artifactId> 74 <version>7.0.47</version> 75 </dependency> 76 <!-- 引入mybatis --> 77 <dependency> 78 <groupId>org.mybatis</groupId> 79 <artifactId>mybatis</artifactId> 80 <version>${mybatis.version}</version> 81 </dependency> 82 <!-- mybatis与spring进行集成的包 --> 83 <dependency> 84 <groupId>org.mybatis</groupId> 85 <artifactId>mybatis-spring</artifactId> 86 <version>${mybatis-spring.version}</version> 87 </dependency> 88 <!-- json --> 89 <dependency> 90 <groupId>com.fasterxml.jackson.core</groupId> 91 <artifactId>jackson-annotations</artifactId> 92 <version>${jackson.version}</version> 93 </dependency> 94 <dependency> 95 <groupId>com.fasterxml.jackson.core</groupId> 96 <artifactId>jackson-core</artifactId> 97 <version>${jackson.version}</version> 98 </dependency> 99 <dependency> 100 <groupId>com.fasterxml.jackson.core</groupId> 101 <artifactId>jackson-databind</artifactId> 102 <version>${jackson.version}</version> 103 </dependency> 104 <!-- guwa cache --> 105 <dependency> 106 <groupId>com.google.guava</groupId> 107 <artifactId>guava</artifactId> 108 <version>14.0.1</version> 109 </dependency> 110 </dependencies> 111 <build> 112 <plugins> 113 <plugin> 114 <groupId>org.apache.maven.plugins</groupId> 115 <artifactId>maven-compiler-plugin</artifactId> 116 <configuration> 117 <source>1.8</source> 118 <target>1.8</target> 119 <encoding>utf-8</encoding> 120 </configuration> 121 </plugin> 122 </plugins> 123 </build> 124 </project>
这里用到guava cache,所以别忘了引入依赖guava cache
-
1 <!-- guwa cache --> 2 <dependency> 3 <groupId>com.google.guava</groupId> 4 <artifactId>guava</artifactId> 5 <version>14.0.1</version> 6 </dependency>
- 引入mysql库配置(src/main/resources)
jdbc.properties
1 jdbc.driverClassName = com.mysql.jdbc.Driver 2 jdbc.url = jdbc:mysql://localhost:3306/wn 3 jdbc.username = root 4 jdbc.password = 123456
- 引入spring配置文件(src/main/resources)
spring.xml
-
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:mvc="http://www.springframework.org/schema/mvc" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context-3.2.xsd 9 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 10 11 <!-- 注解扫描 --> 12 <context:component-scan base-package="com.wn" /> 13 <!-- 启动jackson --> 14 <mvc:annotation-driven /> 15 <!-- 引入属性文件 --> 16 <context:property-placeholder location="classpath:jdbc.properties" /> 17 18 <!-- 引入数据源 --> 19 <bean id="flowerDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 20 destroy-method="close"> 21 <property name="driverClassName" value="${jdbc.driverClassName}" /> 22 <property name="url" value="${jdbc.url}" /> 23 <property name="username" value="${jdbc.username}" /> 24 <property name="password" value="${jdbc.password}" /> 25 </bean> 26 27 <!-- 引入mybatis --> 28 <bean id="flowerSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 29 <property name="dataSource" ref="flowerDataSource" /> 30 <property name="mapperLocations"> 31 <list> 32 <value>classpath*:mapper/*Mapper.xml</value> 33 </list> 34 </property> 35 </bean> 36 <bean id="flowerMapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 37 <property name="basePackage" value="com.wn.mapper" /> 38 <property name="sqlSessionFactoryBeanName" value="flowerSqlSessionFactory" /> 39 </bean> 40 </beans>
-
创建基本包(package)结构(controller、service、dao、mapper、model)
- 创建src/main/resources/mapper的folder包,用于放置*Mapper.xml
-
配置web.xml,使spring生效
-
1 <?xml version="1.0" encoding="utf-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 5 <servlet> 6 <servlet-name>dispatcherServlet</servlet-name> 7 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 8 <init-param> 9 <param-name>contextConfigLocation</param-name> 10 <param-value>classpath*:spring*.xml</param-value> 11 </init-param> 12 <load-on-startup>1</load-on-startup> 13 </servlet> 14 <servlet-mapping> 15 <servlet-name>dispatcherServlet</servlet-name> 16 <url-pattern>/</url-pattern> 17 </servlet-mapping> 18 19 <filter> 20 <filter-name>encodingFilter</filter-name> 21 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 22 <init-param> 23 <param-name>encoding</param-name> 24 <param-value>UTF-8</param-value> 25 </init-param> 26 <init-param> 27 <param-name>forceEncoding</param-name> 28 <param-value>true</param-value> 29 </init-param> 30 </filter> 31 <filter-mapping> 32 <filter-name>encodingFilter</filter-name> 33 <url-pattern>/*</url-pattern> 34 </filter-mapping> 35 </web-app>
3、使用mybatis-generator创建mybatis的xml文件、mapper层接口、model层
- 将生成的类、接口、xml拷贝到项目中
- FlowerMapper.xml
-
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 3 <mapper namespace="com.wn.mapper.FlowerMapper"> 4 <resultMap id="BaseResultMap" type="com.wn.model.Flower"> 5 <id column="id" property="id" jdbcType="INTEGER" /> 6 <result column="type" property="type" jdbcType="VARCHAR" /> 7 <result column="colour" property="colour" jdbcType="VARCHAR" /> 8 <result column="number" property="number" jdbcType="INTEGER" /> 9 <result column="price" property="price" jdbcType="DECIMAL" /> 10 <result column="florescence" property="florescence" jdbcType="INTEGER" /> 11 </resultMap> 12 <sql id="Base_Column_List"> 13 id, type, colour, number, price, florescence 14 </sql> 15 <select id="selectByPrimaryKey" resultMap="BaseResultMap" 16 parameterType="java.lang.Integer"> 17 select 18 <include refid="Base_Column_List" /> 19 from t_flower 20 where id = #{id,jdbcType=INTEGER} 21 </select> 22 <select id="selectByColour" resultMap="BaseResultMap" 23 parameterType="java.lang.String"> 24 select 25 <include refid="Base_Column_List" /> 26 from t_flower 27 where colour=#{colour,jdbcType=VARCHAR} 28 </select> 29 <!-- 实现条件不定查询 --> 30 <select id="selectByCondition" resultMap="BaseResultMap" 31 parameterType="java.lang.Integer"> 32 select 33 <include refid="Base_Column_List" /> 34 from t_flower 35 <where> 36 <if test="type!=null"> 37 type=#{type,jdbcType=VARCHAR} 38 </if> 39 <if test="colour!=null"> 40 AND colour=#{colour,jdbcType=VARCHAR} 41 </if> 42 <if test="number!=null"> 43 AND number=#{number,jdbcType=INTEGER} 44 </if> 45 <if test="price!=null"> 46 AND price=#{price,jdbcType=DECIMAL} 47 </if> 48 <if test="florescence!=null"> 49 AND florescence=#{florescence,jdbcType=INTEGER} 50 </if> 51 </where> 52 <!-- 按照单价降序排列,并实现分页展示功能 --> 53 </select> 54 <select id="selectLimit" resultMap="BaseResultMap" 55 parameterType="java.lang.Integer"> 56 select 57 <include refid="Base_Column_List" /> 58 from t_flower 59 order by price DESC limit #{start}, #{size} 60 </select> 61 <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> 62 delete from 63 t_flower 64 where id = #{id,jdbcType=INTEGER} 65 </delete> 66 <insert id="insert" parameterType="com.wn.model.Flower"> 67 insert into t_flower (id, 68 type, colour, 69 number, price, florescence 70 ) 71 values 72 (#{id,jdbcType=INTEGER}, #{type,jdbcType=VARCHAR}, 73 #{colour,jdbcType=VARCHAR}, 74 #{number,jdbcType=INTEGER}, 75 #{price,jdbcType=DECIMAL}, #{florescence,jdbcType=INTEGER} 76 ) 77 </insert> 78 <insert id="insertSelective" parameterType="com.wn.model.Flower"> 79 insert into t_flower 80 <trim prefix="(" suffix=")" suffixOverrides=","> 81 <if test="id != null"> 82 id, 83 </if> 84 <if test="type != null"> 85 type, 86 </if> 87 <if test="colour != null"> 88 colour, 89 </if> 90 <if test="number != null"> 91 number, 92 </if> 93 <if test="price != null"> 94 price, 95 </if> 96 <if test="florescence != null"> 97 florescence, 98 </if> 99 </trim> 100 <trim prefix="values (" suffix=")" suffixOverrides=","> 101 <if test="id != null"> 102 #{id,jdbcType=INTEGER}, 103 </if> 104 <if test="type != null"> 105 #{type,jdbcType=VARCHAR}, 106 </if> 107 <if test="colour != null"> 108 #{colour,jdbcType=VARCHAR}, 109 </if> 110 <if test="number != null"> 111 #{number,jdbcType=INTEGER}, 112 </if> 113 <if test="price != null"> 114 #{price,jdbcType=DECIMAL}, 115 </if> 116 <if test="florescence != null"> 117 #{florescence,jdbcType=INTEGER}, 118 </if> 119 </trim> 120 </insert> 121 <update id="updateByPrimaryKeySelective" parameterType="com.wn.model.Flower"> 122 update t_flower 123 <set> 124 <if test="type != null"> 125 type = #{type,jdbcType=VARCHAR}, 126 </if> 127 <if test="colour != null"> 128 colour = #{colour,jdbcType=VARCHAR}, 129 </if> 130 <if test="number != null"> 131 number = #{number,jdbcType=INTEGER}, 132 </if> 133 <if test="price != null"> 134 price = #{price,jdbcType=DECIMAL}, 135 </if> 136 <if test="florescence != null"> 137 florescence = #{florescence,jdbcType=INTEGER}, 138 </if> 139 </set> 140 where id = #{id,jdbcType=INTEGER} 141 </update> 142 <update id="updateByPrimaryKey" parameterType="com.wn.model.Flower"> 143 update t_flower 144 set type = #{type,jdbcType=VARCHAR}, 145 colour = 146 #{colour,jdbcType=VARCHAR}, 147 number = #{number,jdbcType=INTEGER}, 148 price = 149 #{price,jdbcType=DECIMAL}, 150 florescence = 151 #{florescence,jdbcType=INTEGER} 152 where id = #{id,jdbcType=INTEGER} 153 </update> 154 </mapper>
- Flower
-
1 package com.wn.model; 2 3 public class Flower { 4 private Integer id; 5 6 private String type; 7 8 private String colour; 9 10 private Integer number; 11 12 private Long price; 13 14 private Integer florescence; 15 16 public Integer getId() { 17 return id; 18 } 19 20 public void setId(Integer id) { 21 this.id = id; 22 } 23 24 public String getType() { 25 return type; 26 } 27 28 public void setType(String type) { 29 this.type = type == null ? null : type.trim(); 30 } 31 32 public String getColour() { 33 return colour; 34 } 35 36 public void setColour(String colour) { 37 this.colour = colour == null ? null : colour.trim(); 38 } 39 40 public Integer getNumber() { 41 return number; 42 } 43 44 public void setNumber(Integer number) { 45 this.number = number; 46 } 47 48 public Long getPrice() { 49 return price; 50 } 51 52 public void setPrice(Long price) { 53 this.price = price; 54 } 55 56 public Integer getFlorescence() { 57 return florescence; 58 } 59 60 public void setFlorescence(Integer florescence) { 61 this.florescence = florescence; 62 } 63 }
- FlowerMapper.java
-
1 package com.wn.mapper; 2 3 import java.util.List; 4 5 import org.apache.ibatis.annotations.Param; 6 7 import com.wn.model.Flower; 8 9 public interface FlowerMapper { 10 int deleteByPrimaryKey(Integer id); 11 12 int insert(Flower record); 13 14 int insertSelective(Flower record); 15 16 Flower selectByPrimaryKey(Integer id); 17 18 List<Flower> selectByCondition(Flower record); 19 20 List<Flower> selectLimit(@Param("start") int start, @Param("size") int size); 21 22 int updateByPrimaryKeySelective(Flower record); 23 24 int updateByPrimaryKey(Flower record); 25 26 List<Flower> selectByColour(String colour); 27 }
4、编写dao、service、controller
- FlowerDao
-
1 package com.wn.dao; 2 3 import java.util.List; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Repository; 7 8 import com.wn.mapper.FlowerMapper; 9 import com.wn.model.Flower; 10 11 @Repository 12 public class FlowerDao { 13 @Autowired 14 private FlowerMapper flowerMapper; 15 16 public boolean add(Flower flower) { 17 return flowerMapper.insert(flower) == 1 ? true : false; 18 } 19 20 public Flower getById(Integer id) { 21 return flowerMapper.selectByPrimaryKey(id); 22 } 23 24 public boolean deleteById(Integer id) { 25 return flowerMapper.deleteByPrimaryKey(id) == 1 ? true : false; 26 } 27 28 public boolean update(Flower flower) { 29 return flowerMapper.updateByPrimaryKey(flower) == 1 ? true : false; 30 } 31 32 public boolean update2(Flower flower) { 33 return flowerMapper.updateByPrimaryKeySelective(flower) == 1 ? true : false; 34 } 35 36 /* 37 * 实现条件不定查询 38 */ 39 public List<Flower> getByCondition(Flower flower) { 40 return flowerMapper.selectByCondition(flower); 41 } 42 43 /* 44 * 传入开始显示记录的索引,即显示记录的条数,实现分页显示功能 45 */ 46 public List<Flower> selectLimit(int start, int size) { 47 return flowerMapper.selectLimit(start, size); 48 } 49 50 public List<Flower> selectByColour(String colour) { 51 return flowerMapper.selectByColour(colour); 52 } 53 }
- FlowerService
-
1 package com.wn.service; 2 3 import java.util.List; 4 import java.util.concurrent.ExecutionException; 5 import java.util.concurrent.TimeUnit; 6 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.stereotype.Service; 9 10 import com.google.common.cache.CacheBuilder; 11 import com.google.common.cache.CacheLoader; 12 import com.google.common.cache.LoadingCache; 13 import com.wn.dao.FlowerDao; 14 import com.wn.model.Flower; 15 16 @Service 17 public class FlowerService { 18 @Autowired 19 private FlowerDao flowerDao; 20 21 public boolean addFlower(String type, String colour, Integer number, long price, Integer florescence) { 22 Flower flower = new Flower(); 23 flower.setType(type); 24 flower.setColour(colour); 25 flower.setNumber(number); 26 flower.setPrice(price); 27 flower.setFlorescence(florescence); 28 return flowerDao.add(flower); 29 } 30 31 public Flower getFlower(Integer id) { 32 return flowerDao.getById(id); 33 } 34 35 public boolean deleteFlower(Integer id) { 36 return flowerDao.deleteById(id); 37 } 38 39 public boolean updateFlower(Integer id, String type, String colour, Integer number, Long price, 40 Integer florescence) { 41 Flower flower = flowerDao.getById(id); 42 flower.setType(type); 43 flower.setColour(colour); 44 flower.setNumber(number); 45 flower.setPrice(price); 46 flower.setFlorescence(florescence); 47 return flowerDao.update(flower); 48 } 49 50 public boolean updateFlower2(Integer id, String type, String colour, Integer number, Long price, 51 Integer florescence) { 52 Flower flower = flowerDao.getById(id); 53 flower.setType(type); 54 flower.setColour(colour); 55 flower.setNumber(number); 56 flower.setPrice(price); 57 flower.setFlorescence(florescence); 58 return flowerDao.update2(flower); 59 } 60 61 public List<Flower> getFlowerByCondition(String type, String colour, Integer number, Long price, 62 Integer florescence) { 63 Flower flower = new Flower(); 64 flower.setColour(colour); 65 flower.setType(type); 66 flower.setNumber(number); 67 flower.setPrice(price); 68 flower.setFlorescence(florescence); 69 return flowerDao.getByCondition(flower); 70 } 71 72 public List<Flower> selectLimit(Integer start, Integer size) { 73 return flowerDao.selectLimit(start, size); 74 } 75 76 /**本地缓存-guava cache的流程: 77 * 1、从guava cache中获取 -- flowerCache.get(colour) 78 * 2、如果存在,直接返回数据给controller 79 * 3、如果不存在,调用load方法(先从mysql获取,再存入guava cache,最后从guava 80 * cache读出该数据,返回给controller) 81 */ 82 public List<Flower> getFlowerWithCache(String colour) { 83 List<Flower> flowerList = null; 84 try { 85 flowerList = flowerCache.get(colour); 86 } catch (ExecutionException e) { 87 e.printStackTrace(); 88 } 89 return flowerList; 90 } 91 LoadingCache<String, List<Flower>> flowerCache = CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.MINUTES) 92 .maximumSize(200).build(new CacheLoader<String, List<Flower>>() { 93 public List<Flower> load(String colour) { 94 System.out.println("从数据库查"); 95 return flowerDao.selectByColour(colour); 96 } 97 }); 98 }
- FlowerController
-
1 package com.wn.controller; 2 3 import java.util.List; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.web.bind.annotation.PathVariable; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestMethod; 9 import org.springframework.web.bind.annotation.RequestParam; 10 import org.springframework.web.bind.annotation.RestController; 11 12 import com.wn.model.Flower; 13 import com.wn.service.FlowerService; 14 15 @RestController 16 @RequestMapping("/flower") 17 public class FlowerController { 18 @Autowired 19 private FlowerService flowerService; 20 21 @RequestMapping(value = "/add", method = RequestMethod.POST) 22 public boolean addFlower(@RequestParam("type") String type, @RequestParam("colour") String colour, 23 @RequestParam("number") Integer number, @RequestParam("price") Long price, 24 @RequestParam("florescence") Integer florescence) { 25 return flowerService.addFlower(type, colour, number, price, florescence); 26 } 27 28 @RequestMapping(value = "/get", method = RequestMethod.GET) 29 public Flower getFlower(Integer id) { 30 return flowerService.getFlower(id); 31 } 32 33 @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE) 34 public boolean deleteFlower(@PathVariable("id") Integer id) { 35 return flowerService.deleteFlower(id); 36 } 37 38 @RequestMapping(value = "/update", method = RequestMethod.PUT) 39 public boolean updateFlower(@RequestParam(value = "id") Integer id, 40 @RequestParam(value = "type", required = false) String type, 41 @RequestParam(value = "colour", required = false) String colour, 42 @RequestParam(value = "number", required = false) Integer number, 43 @RequestParam(value = "price", required = false) Long price, 44 @RequestParam(value = "florescence", required = false) Integer florescence) { 45 46 return flowerService.updateFlower(id, type, colour, number, price, florescence); 47 } 48 49 @RequestMapping(value = "/update2", method = RequestMethod.PUT) 50 public boolean updateFlower2(@RequestParam(value = "id") Integer id, 51 @RequestParam(value = "type", required = false) String type, 52 @RequestParam(value = "colour", required = false) String colour, 53 @RequestParam(value = "number", required = false) Integer number, @RequestParam(value = "price") Long price, 54 @RequestParam(value = "florescence", required = false) Integer florescence) { 55 return flowerService.updateFlower2(id, type, colour, number, price, florescence); 56 } 57 58 @RequestMapping(value = "/getFlowerByConditon", method = RequestMethod.GET) 59 public List<Flower> getFlowerByCondition(@RequestParam(value = "type", required = false) String type, 60 @RequestParam(value = "colour", required = false) String colour, 61 @RequestParam(value = "number", required = false) Integer number, 62 @RequestParam(value = "price", required = false) Long price, 63 @RequestParam(value = "florescence", required = false) Integer florescence) { 64 return flowerService.getFlowerByCondition(type, colour, number, price, florescence); 65 } 66 67 @RequestMapping(value = "/getFlowerByLimit", method = RequestMethod.GET) 68 public List<Flower> getFlowerByLimit(@RequestParam("start") Integer start, @RequestParam("size") Integer size) { 69 return flowerService.selectLimit(start, size); 70 } 71 72 // 从本地缓存获取数据,若本地缓存没有,再从数据库获取 73 @RequestMapping(value = "/getWithCache", method = RequestMethod.GET) 74 public List<Flower> getWithCache(@RequestParam("colour") String colour) { 75 return flowerService.getFlowerWithCache(colour); 76 } 77 }
每天坚持进步一点点。