package org.spring.springboot;import org.mybatis.spring.annotation.MapperScan;import org.spring.springboot.dao.CityDao;import org.spring.springboot.domain.City;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/**
* Spring Boot 应用启动类
*
* Created by bysocket on 16/4/26.
*/// Spring Boot 应用的标识@SpringBootApplication// mapper 接口类扫描包配置@MapperScan("org.spring.springboot.dao")publicclassApplication{publicstaticvoidmain(String[] args){// 程序启动入口// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(Application.class,args);}}
controller
package org.spring.springboot.controller;import org.spring.springboot.domain.City;import org.spring.springboot.service.CityService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.MediaType;import org.springframework.web.bind.annotation.*;import java.util.List;/**
* Created by bysocket on 07/02/2017.
*/@RestControllerpublicclassCityRestController{@Autowiredprivate CityService cityService;@RequestMapping(value ="/api/city/{id}", method = RequestMethod.GET)public City findOneCity(@PathVariable("id") Long id){return cityService.findCityById(id);}@RequestMapping(value ="/api/city", method = RequestMethod.POST)publicvoidcreateCity(@RequestBody City city){
cityService.saveCity(city);}@RequestMapping(value ="/api/city", method = RequestMethod.PUT)publicvoidmodifyCity(@RequestBody City city){
cityService.updateCity(city);}@RequestMapping(value ="/api/city/{id}", method = RequestMethod.DELETE)publicvoidmodifyCity(@PathVariable("id") Long id){
cityService.deleteCity(id);}}
service 缓存实现
package org.spring.springboot.service.impl;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.spring.springboot.dao.CityDao;import org.spring.springboot.domain.City;import org.spring.springboot.service.CityService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.stereotype.Service;import java.util.List;import java.util.concurrent.TimeUnit;/**
* 城市业务逻辑实现类
* <p>
* Created by bysocket on 07/02/2017.
*/@ServicepublicclassCityServiceImplimplementsCityService{privatestaticfinal Logger LOGGER = LoggerFactory.getLogger(CityServiceImpl.class);@Autowiredprivate CityDao cityDao;@Autowiredprivate RedisTemplate redisTemplate;/**
* 获取城市逻辑:
* 如果缓存存在,从缓存中获取城市信息
* 如果缓存不存在,从 DB 中获取城市信息,然后插入缓存
*/public City findCityById(Long id){// 从缓存中获取城市信息
String key ="city_"+ id;
ValueOperations<String, City> operations = redisTemplate.opsForValue();// 缓存存在boolean hasKey = redisTemplate.hasKey(key);if(hasKey){
City city = operations.get(key);
LOGGER.info("CityServiceImpl.findCityById() : 从缓存中获取了城市 >> "+ city.toString());return city;}// 从 DB 中获取城市信息
City city = cityDao.findById(id);// 插入缓存
operations.set(key, city,10, TimeUnit.SECONDS);
LOGGER.info("CityServiceImpl.findCityById() : 城市插入缓存 >> "+ city.toString());return city;}@Overridepublic Long saveCity(City city){return cityDao.saveCity(city);}/**
* 更新城市逻辑:
* 如果缓存存在,删除
* 如果缓存不存在,不操作
*/@Overridepublic Long updateCity(City city){
Long ret = cityDao.updateCity(city);// 缓存存在,删除缓存
String key ="city_"+ city.getId();boolean hasKey = redisTemplate.hasKey(key);if(hasKey){
redisTemplate.delete(key);
LOGGER.info("CityServiceImpl.updateCity() : 从缓存中删除城市 >> "+ city.toString());}return ret;}@Overridepublic Long deleteCity(Long id){
Long ret = cityDao.deleteCity(id);// 缓存存在,删除缓存
String key ="city_"+ id;boolean hasKey = redisTemplate.hasKey(key);if(hasKey){
redisTemplate.delete(key);
LOGGER.info("CityServiceImpl.deleteCity() : 从缓存中删除城市 ID >> "+ id);}return ret;}}
dao
package org.spring.springboot.dao;import org.apache.ibatis.annotations.Param;import org.spring.springboot.domain.City;import java.util.List;/**
* 城市 DAO 接口类
*
* Created by bysocket on 07/02/2017.
*/publicinterfaceCityDao{/**
* 获取城市信息列表
*
* @return
*/
List<City>findAllCity();/**
* 根据城市 ID,获取城市信息
*
* @param id
* @return
*/
City findById(@Param("id") Long id);
Long saveCity(City city);
Long updateCity(City city);
Long deleteCity(Long id);}
domain
package org.spring.springboot.domain;import java.io.Serializable;/**
* 城市实体类
*
* Created by bysocket on 07/02/2017.
*/publicclassCityimplementsSerializable{privatestaticfinallong serialVersionUID =-1L;/**
* 城市编号
*/private Long id;/**
* 省份编号
*/private Long provinceId;/**
* 城市名称
*/private String cityName;/**
* 描述
*/private String description;public Long getId(){return id;}publicvoidsetId(Long id){this.id = id;}public Long getProvinceId(){return provinceId;}publicvoidsetProvinceId(Long provinceId){this.provinceId = provinceId;}public String getCityName(){return cityName;}publicvoidsetCityName(String cityName){this.cityName = cityName;}public String getDescription(){return description;}publicvoidsetDescription(String description){this.description = description;}@Overridepublic String toString(){return"City{"+"id="+ id +", provinceId="+ provinceId +", cityName='"+ cityName +'\''+", description='"+ description +'\''+'}';}}