SpringBoot开发实用篇2---与数据层技术有关的替换和整合

news2024/11/23 11:47:20

四、数据层解决方案

1.SQL

现有数据层解决方案技术选型:Druid+MyBatis-plus+MySQL
数据源:DruidDataSource
持久化技术:MyBatis-plus/MyBatis
数据库:MySql
内置数据源:
SpringBoot提供了3种内嵌的数据源对象供开发者选择:
HikariCP:默认内置数据源对象;
Tomcat提供DataSource:HikariCP不可用的情况下,且在web环境中,将使用tomcat服务器配置的数据源对象;
Commons DBCP:Hikari不可用,tomcat数据源也不可用,将使用dbcp数据源。
在这里插入图片描述
使用方式:先使用默认配置,再使用个性化配置。
通用配置无法设置具体的数据源配置信息,仅提供基本的连接相关配置,如需配置,在下一级配置中设置具体设定。
在这里插入图片描述
JdbcTemplate:Spring提供的默认的持久化技术(几乎没人用)
操作数据库的模板技术。
pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
@Autowired
    private JdbcTemplate jdbcTemplate;
    @Test
    void testJdbcTemplate(){
        String sql="select * from tbl_book";
        RowMapper<Book> rm=new RowMapper<Book>() {
            @Override
            public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
                Book temp=new Book();
                //查出来的放到结果集中,从结果集中得到,在set到对象中
                temp.setId(rs.getInt("id"));
                temp.setName(rs.getString("name"));
                temp.setType(rs.getString("type"));
                temp.setDescription(rs.getString("description"));
                return temp;
            }
        };
        List<Book> list = jdbcTemplate.query(sql, rm);
        System.out.println(list);
    }
    
    @Test
    void testJdbcTemplateSave(){
        String sql="insert into tbl_book values(null,'springboot','springboot','springboot')";
        jdbcTemplate.update(sql);
    }

H2数据库:
SpringBoot提供了3种内嵌数据库供开发者选择,提高开发测试效率:
H2
HSQL
Derby
伴随着内存启动而启动的数据库,比较小巧。
pom.xml中:

<!--演示H2数据库-->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

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

配置文件中:
在这里插入图片描述
开启服务后,在浏览器中就可以访问:
在这里插入图片描述
可以和持久层框架Mybatis-plus、JdbcTemplate搭配使用。

2.NoSQL

(1)Redis

市面上常见的NoSQL解决方案:
Redis
MongoDB
ES
上述技术通常在Linux系统中安装部署。
在Windows安装,方便整合(整合都是一样的)。
Redis是一款key-value存储结构的内存级NoSQL数据库:
支持多种数据存储格式
支持持久化
支持集群
Redis的安装与启动(Windows版)
Windows解压安装或一键式安装
服务端启动命令

redis-server.exe redis.windows.conf

客户端启动命令

redis-cli.exe

具体操作:先打开服务器,再用客户端去连接。
在这里插入图片描述
在这里插入图片描述
SpringBoot整合Redis:
导入redis对应的starter,在创建工程的时候勾选。

配置Redis(采用默认配置)
在这里插入图片描述
提供操作Redis接口对象RedisTemplate:

@SpringBootTest
class Springboot16RedisApplicationTests {
    @Resource
    private RedisTemplate redisTemplate;

    @Test
    void set() {
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("age",41);
    }
    @Test
    void get(){
        ValueOperations ops = redisTemplate.opsForValue();
        Object age = ops.get("age");
        System.out.println(age);
    }

    @Test
    void hset() {
        HashOperations ops = redisTemplate.opsForHash();
        ops.put("info","a","aa");
    }
    @Test
    void hget(){
        HashOperations ops = redisTemplate.opsForHash();
        Object val = ops.get("info", "a");
        System.out.println(val);
    }
}

客户端:RedisTemplate以对象作为key和value,内部对数据进行序列化。
StringRedisTemplate以字符串作为key和value,与Redis客户端操作等效。

@SpringBootTest
public class StringRedisTemplateTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Test
    void get(){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        String name = ops.get("name");
        System.out.println(name);
    }
}

客户端使用jedis,加坐标,改配置文件。
在这里插入图片描述
在这里插入图片描述
lettcus和jedis的区别:
jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用,这样整体性能就会大受影响。
lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用。当然lettcus也支持多连接实例一起工作。

(2)MongoDB

需求:既能存储结构化数据,又高性能。数据有着很高的修改需求
MongoDB是一个开源、高性能、无模式的文档型数据库。NoSQL数据库产品的一种,是最像关系型数据库的非关系型数据库。
启动mongoDB服务:
在这里插入图片描述
在客户端连接MongoDB服务:

mongo --host=127.0.0.1 --port=27017

在这里插入图片描述
在这里插入图片描述
或者使用可视化客户端:
在这里插入图片描述
基础CRUD操作:
在这里插入图片描述
在这里插入图片描述
SpringBoot整合MongoDB:
1.导入Mongodb对应的starter:

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

2.配置mongodb访问uri:
在这里插入图片描述
3.提供操作Mongodb接口对象MongoTemplate

@SpringBootTest
class Springboot17MongdbApplicationTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    void contextLoads() {
        Book book=new Book();
        book.setId(1);
        book.setName("springboot");
        book.setType("springboot");
        book.setDescription("springboot");
        mongoTemplate.save(book);
    }

    /**
     * 类型转换的问题  把数据库中不是int的删了
     */
    @Test
    void find(){
        List<Book> all = mongoTemplate.findAll(Book.class);
        System.out.println(all);
    }

}

(3)ES Elasticsearch

相关概念:
Elasticsearch是一个分布式全文搜索引擎。(分布式:架构可以做成分布式的)
要想做全文搜索:
1.通过所提供的数据进行分词,将关联数据保存起来。就有了一个一个的id对应一个一个的简要数据。
2.分词查出来先匹配一个一个的id,id再得到数据。(实际上查询的时候,是将输入这个id的数据展示出来)。
这种方式大幅度的提高了查询速度。
传统的索引:根据id查数据。
ES的索引(倒排索引):根据关键字(数据)查id,再根据id查数据。
一条:关键字—>1—>数据 对应的是一个文档,每一条都需要提前建立起来。当使用关键字后,就能找到对应的数据了。

基础操作:
打开ES服务:双击这个批处理文件:
在这里插入图片描述
启动后,可以在浏览器直接创建。
创建/查询/删除索引:
PUT:http://localhost:9200/books
GET:http://localhost:9200/books
DELETE:http://localhost:9200/books

在这里插入图片描述
目前创建的这个索引是不支持分词的。要支持分词添加IK插件。再重启服务。
在这里插入图片描述
创建一个有分词功能的索引:
在这里插入图片描述
查看这个索引:
在这里插入图片描述
ES文档操作:
添加一条文档,相当于给数据库中添加一条数据,不需要指定表结构。文档结构是无模式的。

使用_doc添加一个文档信息,id是自动生成的。
在这里插入图片描述
使用_create添加文档信息,后面需要加id号。
在这里插入图片描述
_doc后也可以加id号。
在这里插入图片描述查询文档:查询id为1的文档
在这里插入图片描述
查询所有文档:
在这里插入图片描述
使用条件查询:
在这里插入图片描述
在这里插入图片描述
删除文档:
删除一个已经存在的:
在这里插入图片描述
删除一个不存在的:
在这里插入图片描述
修改一个文档:
在这里插入图片描述
查询一下刚才修改的文档,发现只有name,是全覆盖。
在这里插入图片描述
如果不想全部修改,只想修改某一条属性信息:使用文档属性进行修改的。就不会覆盖其他的属性。
在这里插入图片描述
再次查询一下,只有修改的变了。
在这里插入图片描述
ElasticSearch(ES)总结:
创建文档:有三种方式。

POST  http://localhost:9200/books/_doc  #使用系统生成id
POST  http://localhost:9200/books/_create/1  #使用指定id
POST  http://localhost:9200/books/_doc/1  #使用指定id,不存在创建,存在更新(版本递增)

查询文档:

GET  http://localhost:9200/books/_doc/1  #查询单个文档
GET  http://localhost:9200/books/_search  #查询全部文档

条件查询:

GET http://localhost:9200/books/_search?q=name:springboot

删除文档:

DELETE http://localhost:9200/books/_doc/1

修改文档(全量修改)

PUT  http://localhost:9200/books/_doc/1

修改文档(部分修改):对文档中的某个属性,不是对整个文档进行操作(其余都是对一整个文档进行操作的)。

POST  http://localhost:9200/books/_update/1

SpringBoot整合ES客户端:
直接整合高级别的客户端:
先导入starter

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

再写配置文件:配置文件不用写,采用的是硬编码的方式。
在SpringBoot里创建ES客户端:

@Test
    void testCreateIndex() throws IOException {
         //创建客户端
        HttpHost host=HttpHost.create("http://localhost:9200");
        RestClientBuilder builder=RestClient.builder(host);
        client= new RestHighLevelClient(builder);

        //使用客户端发送了一个请求,创建了一个名称为books的索引
        CreateIndexRequest request=new CreateIndexRequest("books");
        client.indices().create(request, RequestOptions.DEFAULT);

        //关闭客户端
        client.close();
    }

在SpringBoot中创建索引:

@Test
    void testCreateIndexByIk() throws IOException {
        //创建客户端
        HttpHost host=HttpHost.create("http://localhost:9200");
        RestClientBuilder builder=RestClient.builder(host);
        client= new RestHighLevelClient(builder);

        //使用客户端发送了一个请求,创建了一个名称为books的索引
        CreateIndexRequest request=new CreateIndexRequest("books");
        String json="{\n" +
                "    \"mappings\":{\n" +
                "        \"properties\":{\n" +
                "            \"id\":{\n" +
                "                \"type\":\"keyword\"\n" +
                "            },\n" +
                "            \"name\":{\n" +
                "                \"type\":\"text\",\n" +
                "                \"analyzer\":\"ik_max_word\",\n" +
                "                \"copy_to\":\"all\"\n" +
                "            },\n" +
                "            \"type\":{\n" +
                "                \"type\":\"keyword\"\n" +
                "            },\n" +
                "            \"description\":{\n" +
                "                \"type\":\"text\",\n" +
                "                \"analyzer\":\"ik_max_word\",\n" +
                "                \"copy_to\":\"all\"\n" +
                "            },\n" +
                "            \"all\":{\n" +
                "                \"type\":\"text\",\n" +
                "                \"analyzer\":\"ik_max_word\"\n" +
                "            }\n" +
                "        }\n" +
                "    }\n" +
                "}";
        //设置请求中的参数
        request.source(json, XContentType.JSON);
        client.indices().create(request, RequestOptions.DEFAULT);

        //关闭客户端
        client.close();
    }

添加单个文档:

//添加文档
    @Test
    void testCreateDoc() throws IOException {
        //创建客户端
        HttpHost host=HttpHost.create("http://localhost:9200");
        RestClientBuilder builder=RestClient.builder(host);
        client= new RestHighLevelClient(builder);


        Book book = bookDao.selectById(1);

        IndexRequest request=new IndexRequest("books").id(book.getId().toString());
        String json= JSON.toJSONString(book);
        request.source(json,XContentType.JSON);
        client.index(request,RequestOptions.DEFAULT);
        //关闭客户端
        client.close();
    }

添加多个文档:

//添加全部文档
    @Test
    void testCreateDocAll() throws IOException {
        //创建客户端
        HttpHost host=HttpHost.create("http://localhost:9200");
        RestClientBuilder builder=RestClient.builder(host);
        client= new RestHighLevelClient(builder);
        //把所有东西都查出来,造一个批处理请求的容器
        List<Book> bookList = bookDao.selectList(null);
        BulkRequest bulk=new BulkRequest();

        for (Book book : bookList) {
            IndexRequest request=new IndexRequest("books").id(book.getId().toString());
            String json= JSON.toJSONString(book);
            request.source(json,XContentType.JSON);
            bulk.add(request);
        }
        client.bulk(bulk,RequestOptions.DEFAULT);

        //关闭客户端
        client.close();
    }

查询文档:

//按id查询
    @Test
    void testGet() throws IOException {
        //创建客户端
        HttpHost host=HttpHost.create("http://localhost:9200");
        RestClientBuilder builder=RestClient.builder(host);
        client= new RestHighLevelClient(builder);

        GetRequest request=new GetRequest("books","1");
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        String json = response.getSourceAsString();
        System.out.println(json);


        //关闭客户端
        client.close();
    }


    //按条件查询
    @Test
    void testSearch() throws IOException {
        //创建客户端
        HttpHost host=HttpHost.create("http://localhost:9200");
        RestClientBuilder builder=RestClient.builder(host);
        client= new RestHighLevelClient(builder);

        //查books索引
        SearchRequest request=new SearchRequest("books");

        //设置条件  如果还有条件继续往里排就行
        SearchSourceBuilder builder1=new SearchSourceBuilder();
        builder1.query(QueryBuilders.termQuery("all","1"));
        request.source(builder1);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //查询到的结果如何显示出来
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
//            System.out.println(source);
            Book book = JSON.parseObject(source, Book.class);
            System.out.println(book);
        }

        //关闭客户端
        client.close();
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年数据治理企业老板为啥都让员工考CDGA/CDGP证书?

企业老板让员工考取CDGA证书一般有以下几个原因: 提升数据治理能力 CDGA认证是一种全球通用的数据治理认证&#xff0c;可以帮助员工提升数据治理的技能和能力更好地管理、保护和分析企业的数据。 增强员工竞争力 随着数据治理在企业中的重要性越来越高&#xff0c;拥有CDGA…

day01_单元测试_配置文件

一、软件的生命周期 **软件的可行性分析:**分析该软件是否值的研发,会消耗多少成本,能带来多少的利益等分析 **需求分析:**分析该软件具体该具备有那些功能,产品经理与客户一起讨论 **软件设计:**该软件应该使用什么样的架构,用什么样的数据库,每个模块的具体功能 **程序编…

Github Copilot 的补强工具Github Copilot Labs的常用功能介绍

一、什么是Github Copilot Labs Github Copilot Labs是由GitHub推出的一款基于人工智能技术的代码协作工具&#xff0c;旨在协助开发者更加快速、高效地编写代码。该工具使用了机器学习技术&#xff0c;通过学习大量的开源代码和编写实践&#xff0c;提供了对于代码变量、函数…

物理删除与逻辑删除

目录 一、物理删除与逻辑删除 二、逻辑删除实现 三、API使用方法 四、全局配置参数 一、物理删除与逻辑删除 物理删除&#xff1a;指文件存储所用到的磁存储区域被真正的擦除或清零&#xff0c;这样删除的文件是不可以恢复的&#xff0c;物理删除是计算机处理数据时的一个概…

怎样的年轻化法则,让这个品牌四年净利润复合增速达30%

年轻世代消费者的崛起&#xff0c;从消费层面讲&#xff0c;为市场带来活跃的同时&#xff0c;给品牌带来的是如何转型升级的问题&#xff0c;在众多转型的品牌中&#xff0c;年轻化策略与方式不尽相同。 在2019年至2022年期间&#xff0c;报喜鸟营收复合增速达10%&#xff0c…

iptables防火墙(2)

iptables防火墙&#xff08;2&#xff09; 一、SNATSNAT应用环境SNAT原理SNAT转换前条件扩展 二、DNATDNAT应用环境DNAT原理DNAT转换前提条件扩展 三、防火墙规则的备份和还原导出&#xff08;备份&#xff09;所有表的规则导入&#xff08;还原&#xff09;规则 一、SNAT SNA…

线性回归和预测

目录 1、线性回归 2、R-Squared 1、线性回归 在机器学习和统计建模中&#xff0c;这种关系用于预测未来事件的结果 线性回归使用数据点之间的关系在所有数据点之间画一条直线 这条线可以用来预测未来的值 在机器学习中&#xff0c;预测未来非常重要。比如房价、股票等预测 …

分布式全局唯一id实现-4 springCloud-MyBatis-Plus集成美团分布式全局id(leaf)

前言&#xff1a;美团的leaf集成了db分段生成id和雪花算法生成分布式id&#xff0c;本文对其实现部分细节展开讨论&#xff0c;leaf 的具体实现请参考&#xff1a;https://tech.meituan.com/MT_Leaf.html&#xff1b; 1 使用db分段id&#xff1a; leaf 的分段id本质上是使用了…

5。STM32裸机开发(5)

嵌入式软件开发学习过程记录&#xff0c;本部分结合本人的学习经验撰写&#xff0c;系统描述各类基础例程的程序撰写逻辑。构建裸机开发的思维&#xff0c;为RTOS做铺垫&#xff08;本部分基于库函数版实现&#xff09;&#xff0c;如有不足之处&#xff0c;敬请批评指正。 &…

二本4年测试经验,3面阿里艰苦经历(定薪25K),上岸那天我哭了...

前言 4月准备跳槽&#xff0c;先后面试了各大小公司&#xff0c;拿了一些小offer&#xff0c;面试的公司大部分都能过&#xff0c;但是做人总是要用梦想吧&#xff0c;没有梦想和咸鱼有什么区别&#xff0c;最终把目标放在了阿里&#xff0c;准备了大概3个月的时间&#xff0c…

mysql45讲笔记

不一定要都学&#xff0c;有些感觉用不到&#xff0c;有选择的学&#xff01;&#xff01;&#xff01; 文章目录 mysql45讲1.mysql基础架构2.mysql日志系统3.事务隔离4.索引类型1.哈希表2.有序数组3.二叉搜索树4.B 树 5.索引重点概念覆盖索引索引下推最左前缀原则 6.全局锁表级…

ERP系统是什么?ERP实施顾问怎么做?

ERP实施顾问怎么做&#xff1f; 首先想要从事相关行业&#xff0c;必须先了解什么是ERP&#xff0c;ERP系统功能模块是怎样的&#xff0c;而后才能进行ERP实施顾问的工作。 一、ERP是什么 ERP系统主要是干什么的&#xff1f;ERP系统&#xff0c;简单理解就是一套记账、做账软…

“全球金融科技大会——中国金融业开源技术应用与发展论坛”在北京举行

3月28日&#xff0c;“全球金融科技大会——中国金融业开源技术应用与发展论坛”在北京新动力金融科技中心举行。 会议现场 人民银行科技司二级巡视员杨富玉&#xff0c;开放原子开源基金会理事长孙文龙&#xff0c;中国金电党委书记、董事长周逢民为大会致辞。北京市西城区区…

(转载)MATLAB智能算法30个案例分析(3)——基于遗传算法的BP神经网络优化算法

1 理论基础 1.1 BP神经网络概述 BP网络是一类多层的前馈神经网络。它的名字源于在网络训练的过程中&#xff0c;调整网络的权值的算法是误差的反向传播的学习算法&#xff0c;即为BP学习算法。BP算法是Rumelhart等人在1986年提出来的。由于它的结构简单&#xff0c;可调整的…

docker+redis哨兵模式(一主二从三哨兵)- docker-compose

一、docker-compose 安装&#xff1a; sudo apt-get update #安装最新的docke-ce sudo apt-get install docker-ce # 下载最新的docker-compose curl -L https://github.com/docker/compose/releases/download/1.25.0-rc4/docker-compose-uname -s-uname -m -o /usr/local…

面试字节,过关斩将直接干到 3 面,结果被吊打了?

人人都有大厂梦&#xff0c;对于软件测试员来说&#xff0c;BAT 为首的一线互联网公司肯定是自己的心仪对象&#xff0c;毕竟能到这些大厂工作&#xff0c;不仅薪资高待遇好&#xff0c;而且能力技术都能够得到提升&#xff0c;最关键的是还能够给自己镀上一层金&#xff0c;让…

网络通信概述 -了解网络编程,什么是ip和端口,url

网络&#xff1a;网络就是一种辅助双方或者多方能够连接到一起的工具。 左&#xff1a;单机游戏&#xff08;无网络&#xff09; 右&#xff1a;网络游戏 网络编程&#xff1a;网络编程就是&#xff0c;让在不同的电脑上的软件能够进行数据传递&#xff0c;即进程之间的通信。…

一名8年测试工程师,因为偷偷接私活被····

接私活 对程序员这个圈子来说是一个既公开又隐私的话题&#xff0c;不说全部&#xff0c;应该大多数程序员都有过想要接私活的想法&#xff0c;当然&#xff0c;也有部分得道成仙的不主张接私活。但是很少有人在公开场合讨论私活的问题&#xff0c;似乎都在避嫌。就跟有人下班后…

【WAF绕过】姿势总结(一)

【WAF绕过】姿势总结&#xff08;一&#xff09; 方法 Payload 编码 1、进行url编码&#xff08;少数waf不会进行URL解码,部分waf进行一次url解码>可对payload进行二次url编码&#xff09; 2、Unicode编码&#xff1a;单引号 %u0027、%u02b9、%u02bc 3、部分十六进制编…

Python可视化神器Seaborn入门系列——kdeplot

Seaborn是基于matplotlib的Python可视化库。 它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装&#xff0c;从而使得作图更加容易&#xff0c;不需要经过大量的调整就能使你的图变得精致。但应强调的是&#xff0c;应该…