最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Mysql和Redis的詳細(xì)過程

 更新時間:2022年02月23日 15:52:05   作者:路上的追夢人  
這篇文章主要介紹了SpringBoot整合Mysql和Redis的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、項目創(chuàng)建 

1.1 創(chuàng)建項目

在IDEA中,F(xiàn)ile--New--Project--Spring Initializer
名稱為springboot-mysql-redis

1.2 目錄結(jié)構(gòu)

1.3 pom.xml配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
    username: root
    password: 1234
    
  redis:
    host: localhost
    port: 6379
 
server:
  port: 8080
mybatis:
  mapper-locations: classpath:mapper/*xml
  type-aliases-package: com.xsbc.entity
  # 開啟駝峰命名
  configuration:
    map-underscore-to-camel-case: true

二、初始化數(shù)據(jù)庫

drop database if exists blog;
create database blog;
user blog;
drop table if exists user;
create table user(
	id int(11) not null,
	name varchar(255) DEFAULT "",
	age int(11) DEFAULT 0,
	PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
 
insert into user values(1,'小王',20);
insert into user values(2,'老李',23);

三、初始化代碼

3.1 實(shí)體類entity

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
}

3.2 Mapper接口類

@Mapper
public interface UserMapper {
    List<User> getAllUsers();
    int updateUser(Integer id);
}

 xml映射文件

<?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.xsbc.mapper.UserMapper">
    <select id="getAllUsers" resultType="com.xsbc.entity.User">
        select * from user
    </select>
    
    <!--   User類的id參數(shù)是int類型,mysql默認(rèn)是Integer -->
    <update id="updateUserAgeById" parameterType="java.lang.Integer">
        update user set age=age+2 where id=#{id}
    </update>
</mapper>

3.3 Redis工具類

1)config包創(chuàng)建類

Redis常量類RedisConstant

public class RedisConstant {
    public static String ALL_USER_KEY="allUser";
}

Redis配置類RedisConfig

@Configuration
public class RedisConfig {
    @Resource
    private RedisTemplate redisTemplate;
 
    @Bean
    public RedisTemplate redisTemplateInit(){
        //序列化key的實(shí)例化對象
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //序列化value的實(shí)例化對象
        redisTemplate.setValueSerializer(
            new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}

2)util包下創(chuàng)建類

@Component
public class RedisUtil {
    @Resource
    private RedisTemplate<String,Object> redisTemplate;
 
    public void setRedisTemplate(RedisTemplate<String,Object> redisTemplate){
        this.redisTemplate=redisTemplate;
    }
    // 指定緩存失效時間
    public boolean expire(String key,long time) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    // 根據(jù)key獲取過期時間
    public long getExpire(String key){
        return redisTemplate.getExpire(key,TimeUnit.SECONDS);
    // 判斷key是否存在
    public boolean hasKey(String key){
            return redisTemplate.hasKey(key);
        }catch(Exception e){
    // 刪除緩存
    @SuppressWarnings("unchecked")
    public void del(String... key){
        if (key!=null&&key.length> 0){
            if (key.length==1) {
                redisTemplate.delete(key[0]);
            }else{
              redisTemplate.delete(
                (Collection<String>)CollectionUtils.arrayToList(key));
    // 普通緩存獲取
    public Object get(String key){
        return key==null?null:redisTemplate.opsForValue().get(key);
    // 普通緩存放入
    public boolean set(String key,Object value){
            redisTemplate.opsForValue().set(key,value);
    // 普通緩存放入并設(shè)置時間
    public boolean set(String key,Object value,long time){
        try{
            if(time>0){
                redisTemplate.opsForValue()
                             .set(key,value,time,TimeUnit.SECONDS);
                set(key,value);
    // 遞增
    public long incr(String key,long delta){
        if(delta<0){
            throw new RuntimeException("遞增因子必須大于0");
        return redisTemplate.opsForValue().increment(key,delta);
    // 遞減
    public long decr(String key, long delta){
            throw new RuntimeException("遞減因子必須大于0");
        return redisTemplate.opsForValue().increment(key,-delta);
    // HashGet
    public Object hget(String key,String item){
        return redisTemplate.opsForHash().get(key,item);
    // 獲取hashKey對應(yīng)的所有鍵值
    public Map<Object, Object> hmget(String key){
        return redisTemplate.opsForHash().entries(key);
    // HashSet
    public boolean hmset(String key,Map<String, Object> map){
            redisTemplate.opsForHash().putAll(key,map);
    // HashSet 并設(shè)置時間
    public boolean hmset(String key,Map<String, Object> map,long time){
            redisTemplate.opsForHash().putAll(key, map);
            if (time>0){
                expire(key,time);
    // 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
    public boolean hset(String key,String item,Object value){
            redisTemplate.opsForHash().put(key,item,value);
    public boolean hset(String key,String item,Object value,long time){
    // 刪除hash表中的值
    public void hdel(String key,Object... item) {
        redisTemplate.opsForHash().delete(key,item);
    // 判斷hash表中是否有該項的值
    public boolean hHasKey(String key,String item) {
        return redisTemplate.opsForHash().hasKey(key,item);
    // hash遞增 如果不存在,就會創(chuàng)建一個 并把新增后的值返回
    public double hincr(String key,String item,double by) {
        return redisTemplate.opsForHash().increment(key,item,by);
    // hash遞減
    public double hdecr(String key,String item,double by) {
        return redisTemplate.opsForHash().increment(key,item,-by);
    // 根據(jù)key獲取Set中的所有值
    public Set<Object> sGet(String key) {
            return redisTemplate.opsForSet().members(key);
            return null;
    // 根據(jù)value從一個set中查詢,是否存在
    public boolean sHasKey(String key,Object value) {
            return redisTemplate.opsForSet().isMember(key,value);
    // 將數(shù)據(jù)放入set緩存
    public long sSet(String key,Object... values) {
            return redisTemplate.opsForSet().add(key,values);
            return 0;
    // 將set數(shù)據(jù)放入緩存
    public long sSetAndTime(String key,long time,Object... values){
            Long count=redisTemplate.opsForSet().add(key,values);
            if (time> 0)expire(key, time);
            return count;
    // 獲取set緩存的長度
    public long sGetSetSize(String key){
            return redisTemplate.opsForSet().size(key);
    // 移除值為value的
    public long setRemove(String key,Object... values){
            Long count=redisTemplate.opsForSet().remove(key,values);
    // 獲取list緩存的內(nèi)容
    public List<Object> lGet(String key,long start,long end){
            return redisTemplate.opsForList().range(key,start,end);
    // 獲取list緩存的長度
    public long lGetListSize(String key){
            return redisTemplate.opsForList().size(key);
    // 通過索引 獲取list中的值
    public Object lGetIndex(String key,long index){
            return redisTemplate.opsForList().index(key,index);
    // 將list放入緩存
    public boolean lSet(String key, Object value){
            redisTemplate.opsForList().rightPush(key,value);
    public boolean lSet(String key,Object value,long time){
            if (time > 0) expire(key, time);
    public boolean lSet(String key, List<Object> value){
            redisTemplate.opsForList().rightPushAll(key,value);
    public boolean lSet(String key,List<Object> value,long time){
            if(time>0) expire(key, time);
    // 根據(jù)索引修改list中的某條數(shù)據(jù)
    public boolean lUpdateIndex(String key,long index,Object value){
            redisTemplate.opsForList().set(key,index,value);
    // 移除N個值為value
    public long lRemove(String key,long count,Object value){
            Long remove=redisTemplate.opsForList().remove(key,count,value);
            return remove;
}

3.4 Service層

1)UserService接口類

public interface UserService {
    public List<User> getAllUsers();
    public void updateUserAge();
}

2)接口實(shí)現(xiàn)類

@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
 
    @Autowired
    private RedisUtil redisUtil;
    @Override
    public List<User> getAllUsers() {
        List<User> users=(List<User>)redisUtil
                            .get(RedisConstant.ALL_USER_KEY);
        if(CollectionUtils.isEmpty(users)){
            users=userMapper.getAllUsers();
            redisUtil.set(RedisConstant.ALL_USER_KEY,users);
        }
        return users;
    }
    @Transactional
    public void updateUserAge() {
        redisUtil.del(RedisConstant.ALL_USER_KEY);
        userMapper.updateUserAgeById(1);
        userMapper.updateUserAgeById(2);
}

3.5 Controller層

@Controller
public class UserController {
    @Autowired
    private UserService userService;
    
    @RequestMapping("/getAll")
    @ResponseBody
    public List<User> getUsers(){
        return userService.getAllUsers();
    }
 
    @RequestMapping("/update")
    @ResponseBody
    public int updateUser(){
        userService.updateUserAge();
        return 1;
    }
}

四、單元測試

4.1 Respository和Service層單元測試

@SpringBootTest
class SpringbootMysqlRedisApplicationTests {
 
    @Autowired
    private UserMapper userMapper;
    private UserService userService;
    @Test
    void testUserMapper(){
        userMapper.updateUserAgeById(1);
        List<User> users=userMapper.getAllUsers();
        for(User user:users){
            System.out.println(user);
        }
    }
    void testUserService(){
        userService.updateUserAge();
        List<User> users=userService.getAllUsers();
}

4.2 Controller層接口測試

到此這篇關(guān)于SpringBoot整合Mysql、Redis的文章就介紹到這了,更多相關(guān)SpringBoot整合Mysql、Redis內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java編程使用卡片布局管理器示例【基于swing組件】

    Java編程使用卡片布局管理器示例【基于swing組件】

    這篇文章主要介紹了Java編程使用卡片布局管理器,結(jié)合實(shí)例形式分析了java基于swing組件的卡片布局管理器具體實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2018-01-01
  • Java類初始化順序詳解

    Java類初始化順序詳解

    這篇文章主要介紹了Java類初始化順序詳解,java語言在使用過程中最先開始就是初始化,在工作中如果遇到什么問題需?要定位往往到最后也可能是初始化的問題,因此掌握初始化的順序很重要,需要的朋友可以參考下
    2023-08-08
  • Java-Io-RandomAccessFile任意位置讀寫數(shù)據(jù)的操作小結(jié)

    Java-Io-RandomAccessFile任意位置讀寫數(shù)據(jù)的操作小結(jié)

    RandomAccessFile類支持隨機(jī)訪問方式,可以跳轉(zhuǎn)到文件的任意位置讀寫數(shù)據(jù),這個類在文件隨機(jī)讀取時有很大的優(yōu)勢,可利用多線程完成對一個大文件的讀寫,本文給大家介紹Java-Io-RandomAccessFile(任意位置讀寫數(shù)據(jù))的相關(guān)知識,需要的朋友可以參考下
    2022-05-05
  • Java的字符串常量池StringTable詳解

    Java的字符串常量池StringTable詳解

    這篇文章主要介紹了Java的字符串常量池StringTable詳解,JVM為了提高性能和減少內(nèi)存開銷,在實(shí)例化字符串常量的時候進(jìn)行了一些優(yōu)化,為 了減少在JVM中創(chuàng)建的字符串的數(shù)量,字符串類維護(hù)了一個字符串池,需要的朋友可以參考下
    2023-11-11
  • 基于Spring的Maven項目實(shí)現(xiàn)發(fā)送郵件功能的示例

    基于Spring的Maven項目實(shí)現(xiàn)發(fā)送郵件功能的示例

    這篇文章主要介紹了基于Spring的Maven項目實(shí)現(xiàn)發(fā)送郵件功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 業(yè)務(wù)系統(tǒng)的Prometheus實(shí)踐示例詳解

    業(yè)務(wù)系統(tǒng)的Prometheus實(shí)踐示例詳解

    這篇文章主要為大家介紹了業(yè)務(wù)系統(tǒng)的Prometheus實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java 添加和刪除PDF圖層的示例代碼

    Java 添加和刪除PDF圖層的示例代碼

    本文將介紹如何使用Spire.PDF for Java來添加和刪除PDF圖層,本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-02-02
  • 詳解Spring Boot 中實(shí)現(xiàn)定時任務(wù)的兩種方式

    詳解Spring Boot 中實(shí)現(xiàn)定時任務(wù)的兩種方式

    這篇文章主要介紹了Spring Boot 中實(shí)現(xiàn)定時任務(wù)的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 利用java實(shí)現(xiàn)單詞倒序排列

    利用java實(shí)現(xiàn)單詞倒序排列

    這篇文章就是利用java實(shí)現(xiàn)單詞倒序排列,感覺像是在變魔術(shù),感興趣的小伙伴來見證一下
    2015-07-07
  • Mybatis自定義typeHandle過程解析

    Mybatis自定義typeHandle過程解析

    這篇文章主要介紹了Mybatis自定義typeHandle過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04

最新評論

九江县| 富源县| 临泽县| 突泉县| 长顺县| 洛宁县| 延长县| 年辖:市辖区| 阿拉善盟| 阿勒泰市| 紫阳县| 丰顺县| 彩票| 炎陵县| 合作市| 屏南县| 琼结县| 和龙市| 嘉善县| 新余市| 桃源县| 清远市| 丹寨县| 康乐县| 吕梁市| 安国市| 海伦市| 尤溪县| 阳东县| 郯城县| 克东县| 曲阳县| 静宁县| 衡东县| 金山区| 邯郸县| 达孜县| 湄潭县| 瑞昌市| 道真| 福贡县|