springboot 整合 Mybatis、JPA、Redis「建议收藏」

springboot 整合 Mybatis、JPA、Redis「建议收藏」引言在springboot项目中,我们是用ORM框架来操作数据库变的非常方便。下面我们分别整合mysql,springdatajpa以及redis。让我们感受下快车道。我们首先创建一个springboot项目,创建好之后,我们来一步步的实践。使用mybatis引入依赖:<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

引言

在springboot 项目中,我们是用ORM 框架来操作数据库变的非常方便。下面我们分别整合mysql ,spring data jpa 以及redis 。让我们感受下快车道。

我们首先创建一个springboot 项目,创建好之后,我们来一步步的实践。

使用mybatis

引入依赖

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

增加配置

application.properties 中增加连接数据库的配置。

# Mysql数据库连接配置 : com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

创建sql

接下来,我们创建sql 语句。方便我们后面测试吧。

# 创建数据库
 CREATE DATABASE springbootdata;
 # 选择使用数据库
  USE springbootdata;
 # 创建表t_article并插入相关数据
 DROP TABLE IF EXISTS t_article;
  CREATE TABLE t_article (
   id int(20) NOT NULL AUTO_INCREMENT COMMENT '文章id',
   title varchar(200) DEFAULT NULL COMMENT '文章标题',
    content longtext COMMENT '文章内容',
    PRIMARY KEY (id)
  ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 INSERT INTO t_article VALUES ('1', 'Spring Boot基础入门', '从入门到精通讲解...');
 INSERT INTO t_article VALUES ('2', 'Spring Cloud基础入门', '从入门到精通讲解...');
  # 创建表t_comment并插入相关数据
 DROP TABLE IF EXISTS t_comment;
 CREATE TABLE t_comment (
   id int(20) NOT NULL AUTO_INCREMENT COMMENT '评论id',
    content longtext COMMENT '评论内容',
   author varchar(200) DEFAULT NULL COMMENT '评论作者',
   a_id int(20) DEFAULT NULL COMMENT '关联的文章id',
   PRIMARY KEY (id)
 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
 INSERT INTO t_comment VALUES ('1', '很全、很详细', 'luccy', '1');
 INSERT INTO t_comment VALUES ('2', '赞一个', 'tom', '1');
 INSERT INTO t_comment VALUES ('3', '很详细', 'eric', '1');
 INSERT INTO t_comment VALUES ('4', '很好,非常详细', '张三', '1');
 INSERT INTO t_comment VALUES ('5', '很不错', '李四', '2');

创建实体

再接下来,我们需要创建 一个实体类,我们就创建一个 t_comment 表对应的实体类吧。


public class Comment {

    private Integer id;  //评论id
    private String content; //评论内容
    private String author; //评论作者
    private Integer aId; //外键:表示当前这条评论是属于那篇文章
    
    //getter()/setter()

创建mapper

上面都做好后,我们当然是来创建一个mapper 接口,来操作数据库啦,这里我们来一个最简单的,使用注解的方式。

//标识该接口是mybatis的接口文件,并且让springboot能够扫描到该接口,生成该接口的代理对象,存到容器中
@Mapper
public interface CommentMapper {
    //根据id查询对应评论信息
    @Select("select * from t_comment where id = #{id}")
    Comment findById(Integer id);
}

创建测试

上面这样其实就已经完成了springboot 与mybatis 的整合,我们接下来测试一下。

在pom.xml 文件中引入:

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

在测试类中编写:

@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootQuickstartApplicationTests {

    @Autowired
    private CommentMapper commentMapper;

    @Test
    void contextLoads() {
        Comment comment = commentMapper.findById(1);
        System.out.println(comment);
    }
}

效果:

springboot 整合 Mybatis、JPA、Redis「建议收藏」
证明整合mybatis 是成功的。是不是很简单,只用引入一个starter 就可以正常使用mybatis 的功能。

基于xml 方式

上面的是基于注解的,我们也可以基于xml。我们在mapper 中不写sql ,而放到xml 中编写。这里 ArticleMapper 为例

@Mapper
public interface ArticleMapper {

    //根据id查询对应的文章
    public Article selectArticle(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="cn.quellanan.springbootquickstart.mapper.ArticleMapper">

    <select id="selectArticle" parameterType="int" resultType="article">
        select * from t_article where id = #{id}
    </select>
</mapper>

这里我们需要在配置文件中指定我们mapper.xml 的位置,如果不指定,就需要和mapper 同目录才行。resultType 可以在配置文件中指定别名。

#开启驼峰命名匹配映射mapper
mybatis.configuration.map-underscore-to-camel-case=true

#配置mybatis的xml映射配置文件路径
mybatis.mapper-locations=classpath:mapper/*.xml
#配置mybatis映射配置文件中实体类别名
mybatis.type-aliases-package=cn.quellanan.springbootquickstart.pojo

我们再写个测试方法测试下。

@Autowired
    private ArticleMapper articleMapper;
    @Test
    public void selectArticle(){
        Article article = articleMapper.selectArticle(1);
        System.out.println(article);
    }

image-20200617155958167

这样springboot 整合mybatis 基本的就ok 啦。

使用jpa

上面我们springboot整个mybatis 需要自己写sql ,接下来我们偷偷懒,整合一下springData JPA。之前说过,springboot data jpa 是一种规范,必须使用实现这种规范的框架,所以前面用了 hibernate 。但是在springboot 中就不用这么麻烦啦,也不用引入 hibernate 相关的jar .我们也可以使用。下面我们来看看。

引入依赖

第一步还是需要在pom 文件中引入依赖。

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

建立实体类和表的关系

引入依赖后,我们需要将实体类和表以及表属性建立联系。我们还是以 Comment 这个类。进行修改。

@Entity
@Table(name = "t_comment")
public class Comment {

    @Id //表明映射主键id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;  //评论id
    private String content; //评论内容
    private String author; //评论作者
    @Column(name = "a_id")
    private Integer aId; //外键:表示当前这条评论是属于那篇文章
    
    //getter()/setter()
}
  • 首先需要 @Entity 标识这个实体类,可以被处理
  • @Table() 注解指定数据库对应的表名
  • @Id 用来指定表的主键。
  • @GeneratedValue() 用来指定主键的类型
  • @Column 用来指定这个属性对应的表的列名,如果类属性和表列名一致可不指定,不一致就需要指定。

创建一个接口

我们接下来创建一个接口来使用它,继承JpaRepository 。有两个参数,第一个参数是是对应的实体类对象,第二个参数主键数据类型。

public interface CommentRepository extends JpaRepository<Comment, Integer> {
}

测试

接下来,我们就可以进行测试啦

@Autowired
    private CommentRepository commentRepository;

    @Test
    public void selectComment(){
        Optional<Comment> byId = commentRepository.findById(1);
        System.out.println(byId.get());
    }

springboot 整合 Mybatis、JPA、Redis「建议收藏」

所以如果不想使用mybatis ,那springboot 整合jpa 也是一种不错的选择。

使用redis

上面不管是mybatis 还是 springdatajpa 都是基于关系型数据库操作的,我们上面操作的就是mysql 数据库。现在redis 也经常在项目中使用,那springboot 整合使用redis 也很方便。

引入依赖

一样的,我们首先需要引入依赖。

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

配置redis 连接信息

在application.propertis 中增加redis 的相关配置

#redis服务器地址
spring.redis.host=127.0.0.1
#redis服务器连接端口
spring.redis.port=6379
#redis服务器连接密码
spring.redis.password=

其实到现在,我们就已经整合好了,可以在项目中操作redis 数据库啦。

我们来写一个测试方法,分别是插入和查找。

@Autowired
    private StringRedisTemplate redisTemplate;

    @Test
    public void insert(){
        redisTemplate.opsForValue().set("quellanan","程序员爱酸奶");
    }

    @Test
    public void select(){
        String quellanan = redisTemplate.opsForValue().get("quellanan");
        System.out.println(quellanan);
    }

springboot 整合 Mybatis、JPA、Redis「建议收藏」

springboot 整合 Mybatis、JPA、Redis「建议收藏」
可以看到我们直接用的 StringRedisTemplate 。这个就相当于 JdbcTemplate 操作数据库一样。兄弟们现在明白了吧,相当于是没有使用mybatis 或者jpa 这些框架,而是简单粗暴的操作数据库了。

现在很多公司使用数据库也是直接使用 StringRedisTemplate 或者 RedisTemplate 来操作的redis 的数据库的,因为基于redis 的持久层框架还不流行。当然我们也可以使用,接下来我们来点骚的。

创建一个实体类。

@RedisHash(value = "persons") //指定实体类对象在redis中的存储空间
public class Person {

    @Id // 用来标识实体类主键  字符串形式的hashkey标识唯一的实体类对象id
    private String id;
    @Indexed // 用来标识对应属性在redis中生成二级索引
    private String firstname;
    @Indexed
    private String lastname;
    private Address address;
}
  • @RedisHash 用来指定类的储存类型,这里使用的的是RedisHash 表示在数据库中使用hash 存储。值得注意的是只有@RedisHash 这个注解来作用于实体类上,这个persons 更像是文件夹,key 的前缀。
  • @Id 表明主键,其实就是redis 中hash 结构的和前缀组成 key
  • @Indexed,用来标识redis 数据库生成二级索引,方便条件查询,一样的和前缀以及属性名组成key。

创建一个接口。

这里继承的是CrudRepository 。并且也是基于jpa 范式的,感兴趣的可以试试。

public interface PersonRepository extends CrudRepository<Person, String> {

    // 根据城市信息查询对应的人
    List<Person> findByAddress_City(String name);
}

测试方法。

我们接下来,写一个测试方法。

	@Autowired
    private PersonRepository personRepository;

    @Test
    public void savePerson(){
        Person person = new Person();
        person.setFirstname("张");
        person.setLastname("三");

        Address address = new Address();
        address.setCity("北京");
        address.setCountry("中国");
        person.setAddress(address);

        // 向redis数据库中添加了数据
        personRepository.save(person);

    }

    @Test
    public void selectPerson(){
        List<Person> list = personRepository.findByAddress_City("北京");
        for (Person person : list) {
            System.out.println(person);
        }
    }

image-20200617170016290

我们在看看redis 数据库。

image-20200617170128929

springboot 整合 Mybatis、JPA、Redis「建议收藏」

我们在来看下。这些key 都是什么类型存储的。除了key 为persons:916b5570-5c7f-4a96-b25f-98c9a2f1f43e 是hash 其他的都是set

image-20200617172445543

springboot 整合 Mybatis、JPA、Redis「建议收藏」

说明我们创建的索引,都是使用set 来存储的,并且这些索引只是存放了一个key 值,也就是我们真正存数据的地方。

而 persons:916b5570-5c7f-4a96-b25f-98c9a2f1f43e:idx 存放的是其他索引的key .

image-20200617172723012

这样我们也可以通过jpa 这种操作特别是比较负责的对象,我们也能很好的处理啦。

总结

到这就结束啦,知道在springboot 中怎么是用mybatis,spring data jpa,redis 就可以啦。

image-20200611183827618

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179845.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月20日 下午5:00
下一篇 2022年10月20日 下午5:16


相关推荐

  • C++之vector 初始化指定大小容量[通俗易懂]

    C++之vector 初始化指定大小容量[通俗易懂]1.一维vector<int>obj(size);或vector<int>obj;obj.resize(size);2.二维vector<vector<int>>obj(rsize,vector<int>(lsize,0));或vector<vector<int>>ob…

    2025年12月16日
    7
  • Wireshark抓包——ICMP协议分析

    Wireshark抓包——ICMP协议分析内容:使用Wireshark抓包,分析较简单的数据包。环境:Windows7,Wireshark。ping是用来测试网络连通性的命令。一旦发出ping命令,主机会发出连续的测试数据包到网络中,在通常的情况下,主机会收到回应数据包,ping采用的是ICMP协议。例1:对pingwww.baidu.com进行抓包和分析,过程如下:第一步,确定目标地址,选择www.b…

    2022年7月12日
    18
  • 通达信DLL函数开发

    通达信DLL函数开发官方样例 https www tdx com cn products userdoc E9 80 9A E8 BE BE E4 BF A1DLL E5 87 BD E6 95 B0 E7 BC 96 E7 A8 8B E8 A7 84 E8 8C 83 rarVisualStu 安装 DesktopC 打开官方 dsp 文件 如果生成报错 Gm 打开项目属性 关闭 Gm 注意 一定要用 Win32 将生成的 dll 文件拷贝到主程序的 T0002 dlls 目录

    2026年3月19日
    2
  • 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-K ( ZOJ 3829 ) Known Notation

    2014ACM/ICPC亚洲区域赛牡丹江站现场赛-K ( ZOJ 3829 ) Known Notation

    2021年12月15日
    50
  • linux下修改文件内容[通俗易懂]

    linux下修改文件内容[通俗易懂]前言因为今天用了linux的复制文件功能以及修改文件内容的指令,所以刚好整理一下以备之后学习。复制文件到指定目录cp+文件名(可带路径)+目标路径(带路径)如:cpstart.sh/home/deploy/test/yirigong1就是将start.sh文件复制到指定的yirigong1目录下面。修改文件内容复制文件过去之后当然就是要修改文件的内容。catstart…

    2022年7月26日
    9
  • spring beanutils.copyproperties_bean property

    spring beanutils.copyproperties_bean property背景最近项目中在和第三方进行联调一个接口,我们这边发送http请求给对方,然后接收对方的回应,代码都是老代码。根据注释,对方的SDK中写好的Request类有一个无法序列化的bug,所以这边重新写了一个Request类,基本属性都是相同的,但是重点是有一个属性是静态内部类,还有两个是list属性,类似于下面这样:privateListorders;privateAddRequest.Tick…

    2026年4月16日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号