chengfengjie / chengfengjie.github.io

我叫MT
1 stars 0 forks source link

mybatis & mysql & redis #25

Open chengfengjie opened 6 years ago

chengfengjie commented 6 years ago

sprint-boot 集成mybatis

maven添加依赖如下

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>

application.properties配置文件中配置如下

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/hms?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true&useSSL=false
spring.datasource.username=xxx  #数据库用户吗
spring.datasource.password=xxx  #数据库密码

mybatis.mapper-locations=classpath:/com/redis/demo/mapper/**/*.xml
mybatis.type-aliases-package=com.redis.demo.model;com.redis.demo.model.*;

如果mapper.xml文件是存放在java包中的,那么需要在pom.xml中配置资源路径,否则会报错找不到mapper.xml,配置pom.xml如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

一个简单的mapper如下:

<?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.redis.demo.repository.estate.EstateRepository">

    <select id="queryEstateById" resultType="java.util.Map">
        SELECT * FROM Estate_BasicInfo WHERE estateID = #{estateID}
    </select>

</mapper>

Repository如下:

package com.redis.demo.repository.estate;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.Map;

@Repository
@Mapper
public interface EstateRepository {

    /**
     * 通过楼盘ID查询楼盘信息
     * @param estateID 楼盘ID
     * @return
     */
    Map queryEstateById(Integer estateID);

}
chengfengjie commented 6 years ago

spring-boot 集成redis

pom.xml添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.properties配置redis相关

spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
chengfengjie commented 6 years ago

java中redis存储对象(map, list)

创建序列化类:

public class RedisObjectSerializer implements RedisSerializer<Object> {

    static final byte[] EMPTY_ARRAY = new byte[0];

    private Converter<Object, byte[]> serializer = new SerializingConverter();

    private Converter<byte[], Object> deserializer = new DeserializingConverter();

    @Override
    public byte[] serialize(Object o) throws SerializationException {
        if (o == null) {
            return EMPTY_ARRAY;
        }
        try {
            return serializer.convert(o);
        } catch (Exception e) {
            throw new SerializationException(e.getLocalizedMessage());
        }
    }

    @Override
    public Object deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        try {
            return deserializer.convert(bytes);
        } catch (Exception e) {
            throw new SerializationException(e.getLocalizedMessage());
        }
    }
}

配置序列化bean

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Map> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Map> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new RedisObjectSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new RedisObjectSerializer());
        return template;
    }

}

使用,如果数据已经在redis中,直接获取,否则从数据库获取然后存入redis中

@Service
public class EstateService {

    @Autowired
    private EstateRepository estateRepository;
    @Autowired
    private RedisTemplate<String, Map> redisTemplate;

    public Object queryEstateById(Integer estateID) {

        Object val = redisTemplate.opsForHash().get("estate", estateID.toString());
        if (val == null) {
            Map estateInfo = estateRepository.queryEstateById(estateID);
            redisTemplate.opsForHash().put("estate", estateID.toString(), estateInfo);
            return estateInfo;
        } else {
            return val;
        }
    }

}