用redis缓存完成点赞功能,以及查询redis缓存中的数据. 第一次接触redis什么也不懂, 借鉴大佬分享的, 各种方法都有, 目前写出来的只有这个 低级方法, 大佬忽略!!
eclipse maven工程
SSM框架(spring MVC, spring和mybatis框架的整合, 是MVC模式, 整个系统划分为表现层, controller层, service层, mapper层四层)
spring MVC负责请求的转发和视图管理
spring实现业务对象管理
mybatis作为数据对象的持久化引擎
主要的步骤都在controller了, 其他的是调用一些方法
package com.hp.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hp.entity.Item;
import com.hp.service.JedisService;
import com.hp.service.ShopService;
import com.hp.util.JsonUtils;
/**
* 用户controller层
* @author 11501
*
*/
@Controller
@Scope("prototype")
public class ShopController {
//注入service层
@Autowired
private ShopService shopService;
//注入redis的service接口
@Autowired
private JedisService jedisService;
/**
* redis缓存商品列表查询
* @param model
* @return
*/
@RequestMapping("/shoplist")
public String shoplist(Model model) {
List<Item> list = new ArrayList<Item>();
//获取redis中的数据
Map<String, String> getAll = jedisService.hGetAll(1+"");
//判断数据是否存在
if (getAll != null && getAll.size() > 0) {
//如果数据存在,遍历
for (String key : getAll.keySet()) {
//把每一条数据转换成类的对象
String s = getAll.get(key);
Item item = JsonUtils.jsonToPojo(s, Item.class);
//再把类的对象存到集合中
list.add(item);
//通过model传到前端
model.addAttribute("list", list);
}
} else {
Map<String, Object> map = new HashMap<String, Object>();
//如果数据不存在,查询数据
list = shopService.shoplist(map);
for (Item item : list) {
//遍历把每一条数据数据转化成json字符串
String s = JsonUtils.objectToJson(item);
//存到redis中
jedisService.hSet(1+"", item.getId()+"", s);
}
}
return "shop/shoplist";
}
/**
* redis缓存的点赞功能
* @param id
* @return
*/
@RequestMapping("/praise")
public String praise(int id) {
//根据前端传的id查询json信息
String hGet = jedisService.hGet(1+"", id+"");
//把查询的信息转化成类的对象
Item item = JsonUtils.jsonToPojo(hGet, Item.class);
//进行+1操作
int praise = item.getPraise()+1;
item.setPraise(praise);
//删除原来的信息
jedisService.hDel(1+"", id+"");
//再把类的对象转化成json字符串
String s = JsonUtils.objectToJson(item);
//操作后把值存到redis中
jedisService.hSet(1+"", id+"", s);
//重定向商品查询
return "redirect:shoplist.action";
}
}
package com.hp.service;
import java.util.List;
import java.util.Map;
import com.hp.entity.Item;
/**
* 用户service层接口
* @author 11501
*
*/
public interface ShopService {
//商品列表查询
List<Item> shoplist(Map<String, Object> map);
}
package com.hp.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.hp.entity.Item;
import com.hp.mapper.ShopMapper;
import com.hp.service.ShopService;
/**
* 用户service层接口的实现类
* @author 11501
*
*/
@Service
@Repository("shopService")
@Transactional
public class ShopServiceImpl implements ShopService {
//注入mapper层
@Autowired
private ShopMapper shopMapper;
//商品列表查询
@Override
public List<Item> shoplist(Map<String, Object> map) {
return shopMapper.shoplist(map);
}
}
package com.hp.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import com.hp.entity.Item;
/**
* 用户mapper层接口
* @author 11501
*
*/
@Mapper
public interface ShopMapper {
//商品列表
List<Item> shoplist(Map<String, Object> map);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hp.mapper.ShopMapper">
<!-- 商品列表 -->
<select id="shoplist" parameterType="map" resultType="item">
select s.id,s.goods,s.goods_price,s.creat_data,s.goods_details,d.type_name,s.praise
from goods s,goodtype d
where s.goods_type_id = d.id
</select>
</mapper>
以上的是整体查询功能的流程
*功能的完成:
实体类entity,定义对象的属性, (参照数据库中表的字段来设置)
Mapper.xml(Mybatis), 定义功能, 对应对数据库进行的操作, 比如 insert、selectAll、selectById、delete、update等
Mapper.java, 将Mapper.xml中的操作按照id映射成Java函数
Service.java, 为控制层提供服务,接受控制层的参数,完成相应的功能,并返回给控制层
Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。
JSP页面调用,请求哪些参数,需要获取什么数据。
DataBase ===> Entity ===> Mapper.xml ===> Mapper.Java ===> ServiceImpl.java ===> Service.java ===> Controller.java ===> Jsp.
上面controller层中已经包含了jedis的调用,下面附上代码
package com.hp.service;
import java.util.Map;
public interface JedisService {
//获取redis中的某一条数据
public String hGet(String key, String field);
//删除redis非关系型数据库中的一条数据
public long hDel(String key, String fields);
//往redis非关系型数据库中插入一条数据
public long hSet(String key, String field,String value);
//获取redis非关系型数据库中的所有数据库数据信息
public Map<String, String> hGetAll(String key);
}
package com.hp.service.impl;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.hp.service.JedisService;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
@Service
@Repository("jedisService")
@Transactional
public class JedisServiceImpl implements JedisService{
//注入jedispool连接池
@Autowired
private JedisPool jedisPool;
@Override
public String hGet(String key, String field) {
Jedis jedis = jedisPool.getResource();
return jedis.hget(key, field);
}
@Override
public long hDel(String key, String fields) {
Jedis jedis = jedisPool.getResource();
return jedis.hdel(key, fields);
}
@Override
public long hSet(String key, String field,String value) {
Jedis jedis = jedisPool.getResource();
return jedis.hset(key, field, value);
}
@Override
public Map<String, String> hGetAll(String key) {
Jedis jedis = jedisPool.getResource();
return jedis.hgetAll(key);
}
}
在controller层中, redis存取json格式的数据, 用到了一个工具类(JsonUtils), 主要是把json字符串转化为pojo, 把pojo转化为字符串等.
package com.hp.util;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 商城自定义响应结构
*/
public class JsonUtils {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 将对象转换成json字符串。
* Title: pojoToJson
* Description:
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将json结果集转化为对象
* @param jsonData json数据
* @param clazz 对象中的object类型
* @return
*/
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将json数据转换成pojo对象list
* Title: jsonToList
* Description:
* @param jsonData
* @param beanType
* @return
*/
public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}