springboot整合mybatis和redis

本文是针对初学者的快速入门

springboot整合mybatis和redis

1.创建测试表

sql如下:

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) DEFAULT NULL,
`password` VARCHAR(50) DEFAULT NULL,
`address` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '北京');
INSERT INTO `user` VALUES ('2', 'lisi', '123', '上海');

2.搭建工程

1.创建maven工程
引入依赖:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.mydemo</groupId>
    <artifactId>springboot_integration</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_integration</name>
    <description>SpringBoot集成测试</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
            </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3.创建实体类

package com.mydemo.integration.domain;

public class User {
    private Integer id;
    private String username;//用户名
    private String password;//密码
    private String name;//姓名
    //getter setter...
    //toString
}

4.创建controller层

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserService userService;
    /***
     * 查询所有用户
     * @return
     */
    @GetMapping("/selectAll")
    public List<User> selectAll(){
        return userService.selectAll();
    }
}

5.创建service层

1.创建service接口

public interface UserService {
    /***
     * 查询所有
     * @return
     */
    List<User> selectAll();
}

2.生成实现类

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    /**
     * 查询所有
     * @return
     */
    @Override
    public List<User> selectAll() {
        return userMapper.selectAll();
    }
}

6.创建dao层mapper接口和xml文件

@Mapper
public interface UserMapper {
    /**
     * 查询所有用户
     * @return
     */
    List<User> selectAll();
}

映射文件

<?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.itheima.mapper.UserMapper">
    <!--查询所有用户-->
    <select id="selectAll" resultType="user">
        SELECT * FROM user
    </select>

映射文件放在resource文件类,路径与mapper接口位置同级(用过mybatis的应该都知道,这个是mybatis源码决定的,不然的话需要去指定映射文件的路径)

7.配置application.properties

#配置数据库连接信息
#datasource亦可以配置成自己想要的数据源,比如说druid
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
#填写自己的mysql的用户名和密码
spring.datasource.username=root 
spring.datasource.password=root

#配置Mybatis
#-别名包扫描
mybatis.type-aliases-package=com.mydemo.integration.domain
#-映射文件加载
mybatis.mapper-locations=classpath:/mapper/*.xml

#配置日志输出-主要是输出sql语句
logging.level.com.itheima.integration.mapper=debug

大功告成,这样一个简单的springboot整合mybatis就完成了,可以编写一个springboot的主类启动这个项目测试了。不配置servlet的话,默认端口是8080

springboot整合redis

1.引入spring data redis

SpringDataRedis是spring大家族的一部分,提供了在spring应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。
SpringDataRedis针对Jedis提供了如下功能:
1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类
2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作
在pom文件中引入

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

2.在application中配置redis

#配置自己的Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379

3.案例(优化整合mybatis的代码)

@Override
public List<User> selectAll() {
    //1、先查询缓存,简单的k-v
    List<User> userList = (List<User>) redisTemplate.boundValueOps("userList").get();
    //2、缓存没有查询数据库,并把数据加入缓存
    if(userList == null || userList.size() < 1){
        userList = userMapper.findAll();
        //把数据加入缓存
        redisTemplate.boundValueOps("userList").set(userList);
    }else{
        System.out.println("从缓存中读取了用户列表...");
    }
    return userList;
}

注意:若要使用user类存入redis中,需要将user类实现Serializable接口。
拓展:redis序列化机制:
1.默认的情况下redisTemplate操作key vlaue的时候 必须要求 key一定实现序列化 value 也需要实现序列化
2.默认的情况下redisTemplate使用JDK自带的序列化机制:JdkSerializationRedisSerializer
3.JDK自带的序列化机制中要求需要key 和value 都需要实现Serializable接口
4.RedisTemplate支持默认以下几种序列化机制:机制都实现了RedisSerializer接口。

OxmSerializer:xml格式存储
GenericJackson2JsonRedisSerializer:跟JacksonJsonRedisSerializer实际上是一样的
GenericToStringSerializer:可以将任何对象泛化为字符串并序列化
StringRedisSerializer:简单的字符串序列化
JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
Jackson2JsonRedisSerializer:序列化object对象为json字符串

我们可以进行自定义序列化机制:例如:我们定义key 为字符串序列化机制,value:为JDK自带的方式则,应当处理如下:

@SpringBootApplication
public class SpringbootIntegrationApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootIntegrationApplication.class, args);
    }

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(
            RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        //设置key的值为字符串序列化方式 那么在使用过程中key 一定只能是字符串
        template.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化机制为JDK自带的方式
        template.setValueSerializer(new JdkSerializationRedisSerializer());
        return template;
    }
}

springboot的测试类的编写

1.添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2.编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootJpaApplicationTests {

    @Autowired
    private UserService userService;

    @Test
    public void testSelectAll() {
        List<User> all = userService.selectAll();
        for (User user : all) {
            System.out.println(user);
        }
    }

    @Test
    public void testSelectById() {
        User user = userService.selectById(1);
        System.out.println(user);
    }

}

总结:看到这里,其实springboot比我们单用spring来整合方便太多,也少些了太多的xml配置文件,让我们的重心放在业务的编码而减少对程序本身的一些组件和依赖的考虑,这也是为什么大多数公司都选择springboot来管理我们的项目依赖和组件了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值