<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
### mybatis配置
mybatis.mapper-locations=classpath:/mappers/*Mapper.xml
mybatis.type-aliases-package=cn.stevekung.dao
package cn.stevekung.dao;
import cn.stevekung.pojo.AyUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface AyUserDao {
/**
* 描述:通过用户名和密码查询用户
* @param name
* @param password
*/
AyUser findByNameAndPassword(@Param("name") String name,
@Param("password") String password);
}
<?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="cn.stevekung.dao.AyUserDao">
<resultMap id="UserResultMap" type="cn.stevekung.pojo.AyUser">
<id column="id" property="id" jdbcType="VARCHAR"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
<result column="mail" property="mail" jdbcType="VARCHAR"/>
</resultMap>
<select id="findByNameAndPassword" resultMap="UserResultMap" parameterType="String">
select * from ay_user u
<where>
u.name = #{name}
AND u.password = #{password}
</where>
</select>
</mapper>
package cn.stevekung.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
@Entity
@Table(name = "ay_user")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AyUser implements Serializable{
@Id
private String id;
private String name;
private String password;
private String mail;
}
package cn.stevekung.service;
import cn.stevekung.pojo.AyUser;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.Collection;
import java.util.List;
public interface AyUserService {
// 基本crud操作
AyUser findById(String id); // 查
List<AyUser> findAll(); // 查
AyUser save(AyUser ayUser);// 增 改
void delete(String id); // 删
// 分页
Page<AyUser> findAll(Pageable pageable);
// 自定义查询方法
List<AyUser> findByName(String name);
List<AyUser> findByNameLike(String name);
List<AyUser> findByIdIn(Collection<String> ids);
// mybatis
AyUser findByNameAndPassword(String name, String password);
}
package cn.stevekung.service.impl;
import cn.stevekung.dao.AyUserDao;
import cn.stevekung.pojo.AyUser;
import cn.stevekung.repository.AyUserRepository;
import cn.stevekung.service.AyUserService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@Service
@Transactional
public class AyUserServiceImpl implements AyUserService {
// private static final Logger log = LoggerFactory.getLogger(AyUserServiceImpl.class);
Logger log = LogManager.getLogger(this.getClass());
@Autowired
AyUserRepository ayUserRepository;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Autowired
ObjectMapper objectMapper;
@Autowired
AyUserDao ayUserDao;
private static final String ALL_USER = "ALL_USER_LIST";
@Override
public AyUser findById(String id) {
AyUser ayUser = new AyUser();
try {
//step.1 查询Redis缓存中的所有数据
List<String> redisStrings = stringRedisTemplate.opsForList().range(ALL_USER, 0, -1);
List<AyUser> ayUserList = new ArrayList<>();
for (String redisString : redisStrings) {
AyUser user = objectMapper.readValue(redisString, AyUser.class);
ayUserList.add(user);
}
if (null != ayUserList && ayUserList.size() > 0){
for (AyUser user : ayUserList) {
if (user.getId().equals(id)){
return user;
}
}
}
//step.2 查询数据库中的数据
ayUser = ayUserRepository.findById(id).get();
if (ayUser != null){
//step.3 将数据插入到Redis缓存中
stringRedisTemplate.opsForList().rightPush(ALL_USER, objectMapper.writeValueAsString(ayUser));
}
} catch (Exception e) {
log.info("AyUserServiceImpl + findById() error");
e.printStackTrace();
}
return ayUser;
}
@Override
public List<AyUser> findAll() {
List<AyUser> result = ayUserRepository.findAll();
return result;
}
@Override
@Transactional
public AyUser save(AyUser ayUser) {
// 更新 和 保存
AyUser save = new AyUser();
try {
// 先更新数据库
save = ayUserRepository.save(ayUser);
// 测试事务回滚
String error = null;
error.split("/");
// 再更新缓存 (即删除缓存 设置缓存)
List<String> redisStrings = stringRedisTemplate.opsForList().range(ALL_USER, 0, -1);
for (String redisString : redisStrings) {
AyUser user = objectMapper.readValue(redisString, AyUser.class);
if (user.getName().equals(ayUser.getName())){
stringRedisTemplate.opsForList().remove(ALL_USER,1, redisString);
}
}
stringRedisTemplate.opsForList().rightPush(ALL_USER, objectMapper.writeValueAsString(save));
} catch (Exception e) {
log.info("AyUserServiceImpl + save() error");
e.printStackTrace();
}
return save;
}
@Override
public void delete(String id) {
try {
// 先更新数据库
ayUserRepository.deleteById(id);
log.info("userId:" + id + "用户被删除");
// 再删除缓存
List<String> redisStrings = stringRedisTemplate.opsForList().range(ALL_USER, 0, -1);
for (String redisString : redisStrings) {
AyUser user = objectMapper.readValue(redisString, AyUser.class);
if (user.getId().equals(id)){
stringRedisTemplate.opsForList().remove(ALL_USER, 1, redisString);
}
}
} catch (Exception e) {
log.info("AyUserServiceImpl + delete() error");
e.printStackTrace();
}
}
// 分页
@Override
public Page<AyUser> findAll(Pageable pageable) {
return ayUserRepository.findAll(pageable);
}
@Override
public List<AyUser> findByName(String name) {
return ayUserRepository.findByName(name);
}
@Override
public List<AyUser> findByNameLike(String name) {
return ayUserRepository.findByNameLike(name);
}
@Override
public List<AyUser> findByIdIn(Collection<String> ids) {
return ayUserRepository.findByIdIn(ids);
}
// mybatis
@Override
public AyUser findByNameAndPassword(String name, String password) {
return ayUserDao.findByNameAndPassword(name, password);
}
}