在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计。
- 常用的缓存分两种:本地缓存和分布式缓存。
- 常用的本地缓存是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>
- View Code
这里用到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>
- 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>
- View Code
- 创建基本包(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>
- View Code
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>
- View Code
- 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 }
- View Code
- 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 }
- View Code
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 }
- View Code
- 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 }
- View Code
- 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 }
每天坚持进步一点点。