SpringBoot入门笔记第三篇 | SpringBoot数据访问

admin 2022年4月13日09:34:15评论52 views字数 6727阅读22分25秒阅读模式

SpringBoot数据访问概述

Spring Boot默认采用整合SpringData的方式统一处理数据访问层,通过添加大量自动配置,引入各种数据访问模版xxxTemplate以及Repository接口,从而达到简化数据访问层的操作。

Spring Boot提供常见的数据库依赖启动器如下表:

SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220331212352959

那如果有一些比较火但官方没配置的该如何弄呢?比如MyBatis等,也有办法,步骤如下:

Spring Boot整合MyBatis

为了测试,先准备一些测试数据,建库建表添加数据

#建库
create database springbootdata;
#建表
create table `t_article`(
`id` int(20not null AUTO_INCREMENT comment '文章id',
`title` varchar(200default null comment '文章标题',
`content` longtext comment '文章内容',
PRIMARY KEY ( `id` )
)engine=InnoDB auto_increment=2 default charset=utf8;
#插入数据
insert into `t_article` values('1','springboot基础','从入门到精通...');
insert into `t_article` values('2','spring Cloud基础','从入门到精通,等等......');
#再建一张
#建表
create table `t_comment`(
`id` int(20not null AUTO_INCREMENT comment '评论id',
`content` longtext comment '评论内容',
`author` varchar(200default null comment '评论作者',
`a_id` int(20default null comment '关联的文章id',
PRIMARY KEY ( `id` )
)engine=InnoDB auto_increment=3 default charset=utf8;
#插入数据
insert into `t_comment` values('1','很全,很详细','我爱修空调','1');
insert into `t_comment` values('2','赞一个','lxflxf','1');
insert into `t_comment` values('3','很详细','tom','1');
insert into `t_comment` values('4','不错不错','张三','1');
insert into `t_comment` values('5','爱了爱了','李四','2');

创建项目,引入mysql和mybatis的依赖启动器,创建项目时,选择Spring Initializr方式创建项目,接着点击下一步,到如下界面勾选如下图。然后点击next。

SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220331230854458

使用注解方式整合MyBatis

创建接口文件Mapper,然后使用@Mapper注解,最后进行测试。

@Mapper   //表示该类是一个mybatis接口文件,是需要被Springboot进行扫描的

首先创建CommentMapper文件

增删改查如下所示

SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220410175157481

然后在测试类中进行测试,这里就测试一下查询和添加。

commentMapper.insertComment(new Comment(8,"asasaaaa","qqqqqas",55));
Comment byId = commentMapper.findById(1);
System.out.println(byId);

发现添加成功、查询成功。

Spring Data JPA基本使用

这里分为两步,第一步为编写ORM实体类,实体类与数据表进行映射,并且配置好映射关系。第二步为编写Repositor接口,根据不同的表数据操作编写各自对应的Repositor接口,并根据需要编写对应的数据操作方法。

先编写实体类

@Entity(name = "t_comment"//该注解表示当前实体类是与表有映射关系的实体类
public class Discuss {
    @Id  //表示配置该属性对应的字段为主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) //与@Id标注相同位置,用于表示属性对应主键的生成策略,可省略。
    private Integer id;
    @Column(name = "content")  //标注在属性上,当类属性与表字段名不同时,能配合name属性表示类属性对应的表字段名。
    private String content;
    @Column(name = "author")
    private String author;
    @Column(name = "a_id")
    private Integer a_id;
  //省略getXX和setXX的方法

然后编写Repository接口

public interface DiscussRespoitory extends JpaRepository<Discuss,Integer{
    //查询author非空的Discuss评论集合
    public List<Discuss> findByAuthorNotNull();
    //根据文章id查询Discuss评论集合
    @Transactional
    @Modifying
    @Query("select c from t_comment c where c.a_id = ?1")
    public List<Discuss> getDiscussPages(Integer a_id, Pageable pageable);
}

使用Spring Data JPA自定义JpaRepository接口,必须继承XXRepository<T,ID>接口,其中T表示要操作的实体类,ID表示实体类主键数据类型。上面案例代码中,我们继承了JpaRepository,现在来看一下它的类图如下:

SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220411095418343

我们发现Repository为顶级父接口,而CurdRepository接口是Repository的继承接口之一,包含一些基本的CRUD方法。而我们上方的例子中使用的JpaRepository接口同时继承了QueryRepository接口和PagingAndSortingRepository接口,并提供了一些数据操作方法,所以自定义Repository接口文件时,通常会直接选择继承Repository接口。可以看一下Repository接口如下:

SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220411101334895

这里还有一点需要注意一下,在自定义的Repository接口中,针对数据的变更操作,无论是否使用了@Query注解,都必须在方法上方添加@Transactional注解进行事物管理,否则程序出错。如果使用了@Query注解进行数据的变更操作,除了要使用@Query注解,还必须添加@Modifying注解表示数据变更。

现在进行一下测试,调用findByAuthorNotNull接口查询作者不为空,并遍历输出

List<Discuss> byAuthorNoNull = discussRespoitory.findByAuthorNotNull();
for (Discuss discuss : byAuthorNoNull) {
    System.out.println(discuss);
}

输出结果如下

SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220411103144030

Spring Boot整合Redis

Redis简介

Redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,并提供多种语言的API。

Redis有如下优点

  • 存取速度快
  • 支持丰富的数据类型
  • 操作具有原子性
  • 提供多种功能

Redis是开源的,可以去GitHub下载,下载连接:https://github.com/redis/redis/releases。可以自行下载。

如何安装呢?这里以Mac系统举例,安装过程如下:

Mac安装Redis

使用Homebrew安装Redis

1、没有安装Homebrew,首先安装npm国内的吧,快一些。

打开终端输入以下命令:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220406103131502

2、使用Homebrew安装命令

brew install redis

执行上述命令后出现以下,则成功安装:

SpringBoot入门笔记第三篇 | SpringBoot数据访问

3、 查看安装及配置文件位置

  • Homebrew安装的软件会默认在/usr/local/Cellar/路径下
  • redis的配置文件redis.conf存放在/usr/local/etc路径下

4、启动redis服务

注意:如果通过brew启动redis,则需要通过brew关闭(否则每次关掉Redis/杀掉pid,就守护进程就会立马起一个新的pid)

#方式一:使用brew帮助我们启动软件
brew services start redis
#方式二
redis-server /usr/local/etc/redis.conf

执行以下命令

redis-server
SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220406103527630

5、查看redis服务进程

我们可以通过下面命令查看redis是否正在运行

ps axu | grep redis

6、redis-cli连接redis服务

redis默认端口号6379,默认auth为空,输入redis-cli -h 127.0.0.1 -p 6379命令即可连接。这里需要特别强调一下,Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样将会将 Redis服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以登录目标服务器、添加计划任务、写入Webshell等操作,如果想要详细了解redis未授权访问的可以阅读我的这篇文章漏洞复现 | Redis未授权访问

7、启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。

$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG

在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。

8、关闭redis服务

通过brew关闭redis服务

#查看服务列表
brew services list
#关闭redis服务
brew services stop redis

正确停止Redis的方式应该是向Redis发送SHUTDOWN命令

redis-cli shutdown

强行终止redis

sudo pkill redis-server

9、redis.conf 配置文件详解

redis默认是前台启动,如果我们想以守护进程的方式运行(后台运行),可以在redis.conf中将daemonize no,修改成yes即可。

以上呢是对Redis介绍和安装。接下来说一下,Spring Boot如何整合Redis。

Spring Boot整合Redis

步骤大体是先在POM文件中添加Spring Data Redis依赖启动器、编写实体类、编写Repository接口、在全局配置文件中添加Redis数据库连接配置、进行测试。

先做第一步,添加如下依赖

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

编写实体类

@RedisHash("persons")
public class Person {
    @Id   //标识实体类主键
    private String id;
    @Indexed  //用于标识该属性会在redis数据库中生成二级索引
    private String firstname;
    @Indexed
    private String lastname;
    private Address address;
    private List<Family> familyList;

这里需要留意几个注解,解释如下:

@RedisHash("persons"//表明在redis数据库中开启一个persons的内存空间,所有person操作相关的数据均保存在此空间(redis是内存数据库)
@Id   //标识实体类主键
@Indexed  //用于标识该属性会在redis数据库中生成二级索引

然后在全局配置文件中添加Redis数据库连接配置,如下:

#Redis数据库配置
spring.redis.host=127.0.0.1
spring.redis.port=6379

编写测试类

@Autowired
private PersonRepository personRepository;

@Test
public void savePerson(){

    Person person = new Person();
    person.setFirstname("lxflxf");
    person.setLastname("clcl");

    Family family = new Family();
    family.setType("father");
    family.setUsername("lxf");

    Family family2 = new Family();
    family2.setType("mother");
    family2.setUsername("cl");

    ArrayList<Family> families = new ArrayList<>();
    families.add(family);
    families.add(family2);
    person.setFamilyList(families);
  //保存
    personRepository.save(person);

运行测试类,打开redis的GUI界面查看,如下

SpringBoot入门笔记第三篇 | SpringBoot数据访问
image-20220412204506753

关于SpringBoot数据访问概述就说到这里,下期不见不散。

- END -

【往期推荐】

漏洞复现 | CVE-2022-24990信息泄露+RCE(POC已公开)

漏洞复现 | CVE-2022-0847内核提权漏洞(POC已公开)

漏洞监控平台——Monitor(源码在文末)

使用poste搭建自己的邮件服务器

实战 | 一次杀猪盘的拿shell经历

DC-1靶机实战和分析

实战|一个表白墙引发的“血案”

原文始发于微信公众号(小艾搞安全):SpringBoot入门笔记第三篇 | SpringBoot数据访问

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月13日09:34:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SpringBoot入门笔记第三篇 | SpringBoot数据访问http://cn-sec.com/archives/905154.html

发表评论

匿名网友 填写信息