实用开发篇-SpringBoot 数据层解决方案学习

1. SQL解决方案

  • 现有数据层解决方案技术选型

Druid + MyBatis-Plus + MySQL

          ♦数据源:DruidDataSource
          ♦持久化技术:MyBatis-Plus / MyBatis
          ♦数据库: MySQL

在这里插入图片描述

1.1 数据源配置格式

  • 格式一
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
  • 格式二
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
      username: root
      password: root
  • SpringBoot提供了3种内嵌的数据源对象供开发者选择
              ♦ HikariCP:默认内置数据源对象
              ♦ Tomcat提供DataSource:HikariCP不可用的情况下,且在web环境中,将使用Tomcat服务器配置的数据源对象
              ♦ Commons DBCP:HikarI不可用,tomcat数据源也不用,将使用dbcp数据源
spring:
  datasource:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
      username: root
      password: root
  • 通用配置无法设置具体的数据源配置信息,仅提供基本的连接相关配置,如需配置,在下一级配置中设置具体设定
spring:
  datasource:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
      username: root
      password: root
      hikari:
        maximum-pool-size: 50

1.2 内置持久化解决方案——JdbcTemplate**

使用JdbcTemplate需要导入

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

代码

@Test
    void test() {
        String sql = "select * from tbl_book where id = 1";
        List<Book> qurey = jdbcTemplate.query(sql, new RowMapper<Book>() {

            @Override
            public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
                Book temp = new Book();
                temp.setId(rs.getInt("id"));
                temp.setName(rs.getString("name"));
                temp.setType(rs.getString("type"));
                temp.setDescription(rs.getString("description"));
                return temp;
            }
        });
        System.out.println(qurey);
    }

配置

spring:
  jdbc:
    template:
      query-timeout:  -1 #查询超时时间
      max-rows: 500       #最大行数
      fetch-size: -1      #批处理数量

1.3 内嵌数据库

  • SpringBoot提供了3种内嵌数据库供开发者选择,提高开发测试效率
              ♦ H2
              ♦ HSQL
              ♦ Derby
  • 设置当前项目为web工程,并配置H2管理控制台参数
server:
  port: 80
spring:
  h2:
    console:
      enabled: true
      path: /h2

          ♦ 访问用户名sa,默认密码123456

  • 操作数据库(创建表)
create table tbl_book (id int,name varchar,type varchar,description varchar)
  • 设置访问数据源
server:
  port: 80
spring:
  h2:
    console:
      enabled: true
      path: /h2
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:~/test
    username: sa
    password: 123456
  • H2数据库控制台仅用于开发阶段,线上项目请务必关闭控制台功能
server:
  port: 80
spring:
  h2:
    console:
      enabled: flase
      path: /h2
  • SpringBoot可以根据url地址自动识别数据库种类,在保障驱动类存在的情况下,可以省略配置
server:
  port: 80
spring:
  h2:
    console:
      enabled: true
      path: /h2
  datasource:
#    driver-class-name: org.h2.Driver
    url: jdbc:h2:~/test
    username: sa
    password: 123456

2. NoSQL解决方案

  • 市面上常见的NoSQL解决方案
              ♦ Redis
              ♦ Mongo
              ♦ ES

2.1 Redis

  • Redis是一款key-value存储结构的内存级NoSQL数据库
              ♦ 支持多种数据存储格式
              ♦ 支持持久化
              ♦ 支持集群

SpringBoot整合Redis

  • 导入Redis对应的starter
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 配置Redis(采用默认配置)
spring:
  redis:
    host: localhost
    port: 6379

          ♦ 主机:localhost(默认)
          ♦ 端口:6379(默认)

  • RedisTemplate提供操作各种数据存储类型的接口API

          ♦ ops*:获取各种数据类型操作接口
在这里插入图片描述

客户端:RedisTemplate以对象作为key和value,内部对数据进行序列化
@SpringBootTest
class Springboot16RedisApplicationTests {
    @Test
    void set(@Autowired RedisTemplate redisTemplate) {
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("age", 41);
    }

    @Test
    void get(@Autowired RedisTemplate redisTemplate) {
        ValueOperations ops = redisTemplate.opsForValue();
        Object age = ops.get("age");
        System.out.println(age);
    }
    @Test
    void hset(@Autowired RedisTemplate redisTemplate) {
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("info", "b", "bb");
    }

    @Test
    void hget(@Autowired RedisTemplate redisTemplate) {
        HashOperations hashOperations = redisTemplate.opsForHash();
        Object val = hashOperations.get("info", "b");
        System.out.println(val);
    }
}
客户端:StringRedisTemplate以字符串作为key和value,与Redis客户端操作等效(常用)
@SpringBootTest
public class StringRedisTemplateTest {
    @Test
    void set(@Autowired StringRedisTemplate stringRedisTemplate) {
        ValueOperations ops = stringRedisTemplate.opsForValue();
        ops.set("testKey","testKey");
    }
    @Test
    void get(@Autowired StringRedisTemplate stringRedisTemplate) {
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        String name = ops.get("testKey");
        System.out.println(name);
    }
}

SpringBoot整合Redis客户端选择

客户端选择:jedis
导入依赖

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

配置客户端:

spring:
  redis:
    host: localhost	#  127.0.0.1
    port: 6379
    client-type: jedis

lettcus与jedis区别

  • jedis连接Redis服务器是直连模式,当多线程模式下使用jedis
    会存在线程安全问题,解决方案 可以通过配置连接池使每个连接专用,这样整体性能就大受影响。
  • lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用。当然lettcus也支持多连接实例一起工作。(默认)

2.2 Mongodb

Mongodb基础CRUD

  • Mongodb是一个开源、高性能、无模式的文档型数据库。NoSQL数据库产品中的一种,是最像关系型数据库的非关系型数据库
  • 淘宝用户数据

          ♦ 存储位置:数据库
          ♦ 特征:永久性存储,修改频度极低

  • 游戏装备数据、游戏道具数据

          ♦ 存储位置:数据库、Mongdb
          ♦ 特征:永久性存储与临时存储相结合、修改频度较高

  • 直播数据、打赏数据、粉丝数据

          ♦ 存储位置:数据库、Mongdb
          ♦ 特征:永久性存储与临时存储相结合、修改频度较高

  • 物联网数据

          ♦ 存储位置:Mongdb
          ♦ 特征:临时存储,修改频度飞速

新增

db.集合名称.insert/save/insertOne(文档)

修改

db.集合名称.remove(条件)

删除

db.集合名称.update(条件,{操作种类:{文档}})

查询
1.基础查询

          ♦ 查询全部:db.集合.find();
          ♦ 查第一条:db.集合.findOne();
          ♦ 查询指定数量文档:db.集合.find().limit(10) //查10条文档
          ♦ 跳过指定数量文档:db.集合.find().skip(20) //跳过20条文档
          ♦ 统计:db.集合.count()
          ♦ 排序:db.集合.sort({age:1}) //按age升序排序
          ♦ 投影:db.集合名称.find(条件,{name:1,age:1}) //仅保留name与age域

2.条件查询

          ♦ 基本格式:db.集合.find({条件})

          ♦ 模糊查询:db.集合.find({域名:/正则表达式/}) //等同SQL中的like,比like强大,可以执行正则所有规则

          ♦ 条件比较运算:db.集合.find({域名:{$gt:值}}) //等同SQL中的数值比较操作,例如:name>18

          ♦ 包含查询:db.集合.find({域名:{$in:[值1,值2]}}) //等同于SQL中的in

          ♦ 条件连接查询:db.集合.find({$and:[{条件1},{条件2}]}) //等同SQL中的and、or

SpringBoot整合Mongodb

  • 导入Mongodb驱动
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
  • 配置客户端
spring:
  data:
    mongodb:
      uri: mongodb://localhost/itheima

  • 客户端读写Mongodb
@SpringBootTest
class Springboot17MongodbApplicationTests {
    @Autowired
    private MongoTemplate mongoTemplate;

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

    @Test
    void find() {
        List<Book> all = mongoTemplate.findAll(Book.class);
        System.out.println(all);
    }

}

2.3 Elasticsearch(ES)

  • Elasticsearch是一个分布式全文搜索引擎
  • Windows版本ES安装与启动

运行 elasticsearch.bat
运行失败修改bin目录下elasticsearch-env.bat的JDK路径
安装ik分词器解压到plugins目录下

Elasticsearch增删改查(文档操作)

  • 创建/查询/删除索引
PUT http:/localhost:9200/books
GET http:/localhost:9200/books
DELETE http:/localhost:9200/books
  • 使用索引并指定规则
{
    "mappings" : {
            "properties":{
                "id":{
                    "type":"keyword"
                },
                "name":{
                    "type":"text",
                    "analyzer":"ik_max_word",
                    "copy_to":"all"
                },
                "type":{
                    "type":"keyword"
                },
                "description":{
                    "type":"text",
                    "analyzer":"ik_max_word" ,
                    "copy_to":"all"
                },
                "all":{
                    "type":"text",
                    "analyzer":"ik_max_word" 
                }

            }
    }
}
  • 创建文档
POST http:/localhost:9200/books/_doc		#使用系统生成的id
POST http:/localhost:9200/books/_create/1	#使用指定id
POST http:/localhost:9200/books/_doc/1		#使用指定id,不存在创建,存在更新(版本递增)
{
	"name" : "springboot",
	"type" : "springboot",
	"description" : "springboot"
}
  • 查询文档
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
{
	"name" : "springboot",
	"type" : "springboot",
	"description" : "springboot";
}
  • 修改文档(部分修改)
PUT http:/localhost:9200/books/_update/1
{
	"doc" : {
		"name" : "springboot"
	}
}

Spring整合Elasticsearch客户端(low)

  • 导入坐标
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>spring-boot-start-data-elasticsearch</artifactId>
        </dependency>
  • 配置
spring:
  elasticsearch:
   =rest:
    uris: http://localhost:9200
  • 客户端
@SpringBootTest
class Springboot18EsApplicationTests{
	@Autowired
	private ElasticsearchRestTemplate template;
}

手动操作客户端初始化

  • SpringBoot平台没有跟随ES的更新速度进行同步更新,ES提供了Hight Level Client操作ES
  • 导入坐标
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>
  • 配置(无)
  • 客户端
    @Test
    void testCreateClient() throws IOException {
        HttpHost host = HttpHost.create("http://localhost:9200");
        RestClientBuilder builder = RestClient.builder(host);
        RestHighLevelClient = new RestHighLevelClient(builder);
        //客户端操作
		CreateIndexRequest request = new CreateIndexRequest("books");
		//获取操作索引的客户端对象,调用创建索引操作
        client.indices().create(request, RequestOptions.DEFAULT);
		//关闭客户端
        client.close();
    }
  • 客户端改进
@SpringBootTest
class Springboot18EsApplicationTests {
    @Autowired
    private BookDao bookDao;
    @Autowired
    RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://localhost:9200")));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }
}

Java代码实现

  • 创建索引
    @Test
    void testCreateByIk() throws IOException {
    	HttpHost host = HttpHost.create("http://localhost:9200");
    	RestClientBuilder builder = RestClient.builder(host);
    	RestClientBuilder client = new RestHighLevelClient(builder);
    	//客户端操作
        CreateIndexRequest request = new CreateIndexRequest("books");
        //设置要执行的操作
        String json = " ";
        //设置请求中的参数,参数类型json数据
        request.source(json, XContentType.JSON);
        //获取操作索引的客户端对象,调用创建索引操作
        client.indices().create(request, RequestOptions.DEFAULT);
		//关闭客户端
        client.close();
    }
  • 添加文档
    @Test
        //添加文档
    void testCreateDoc() throws IOException {
        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);
    }
  • 批量添加文档
@Test
    void testCreateDocAll() throws IOException {
        List<Book> bookList = bookDao.selectList(null);
        BulkRequest bulkRequest = 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);
            bulkRequest.add(request);
        }

        client.bulk(bulkRequest, RequestOptions.DEFAULT);
    }
  • 按ID查
    //按id查询
    @Test
    void testGet() throws IOException {
        GetRequest request = new GetRequest("books", "1");
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
        String json = response.getSourceAsString();
        System.out.println(json);
    }
  • 按条件查
    //按条件查询
    @Test
    void testSearch() throws IOException {
        SearchRequest request = new SearchRequest("books");
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.termQuery("name", "java"));
        request.source(builder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            Book book = JSON.parseObject(sourceAsString, Book.class);
            System.out.println(book);
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个实际问题的解决方案或者开展一项有价值的项目。 首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的指导下明确研究目标、问题陈述,确立研究的范围和深度。毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用各种研究方法,如实验、调查、案例分析等,以获取必要的数据和信息。通过这些活动,学生能够培养扎实的专业技能,提升解决实际问题的实际能力。 第三,毕业设计的撰写是整个过程的重要组成部分。学生需要将研究过程、方法、结果以及结论等详细记录在毕业论文中,以展示其研究的全貌和成果。同时,撰写毕业设计还有助于提高学生的学术写作水平,培养清晰、逻辑的表达能力。 最后,毕业设计的评价通常由导师和相关专业人士进行。评价标准包括研究的创新性、实用性、方法的科学性以及论文的质量等方面。学生在毕业设计中获得的成绩也将直接影响其最终的学业成绩和学位授予。 总的来说,毕业设计是高等教育中的一项重要环节,通过此过程,学生不仅能够巩固所学知识,还能培养独立思考和解决问题的能力,为将来的职业发展奠定坚实的基础。
**微信小程序案例:基于SpringBoot的宿舍管理系统** **一、资源概述** 本资源是一套完整的小程序毕业设计项目,主题为“基于SpringBoot的宿舍管理系统”。项目旨在通过微信小程序实现宿舍管理的信息化与便捷化。资源中包含完整的源代码、设计文档以及部署指南,助力学生顺利完成毕业设计。同时,该项目具有高度的可定制性和二次开发潜力,适用于各类校园场景。 **二、功能特点** 1. **用户管理**:支持学生和教师两种角色登录,提供个人信息修改和权限分配功能。 2. **宿舍信息管理**:包括宿舍分配、查询、调整等功能,方便管理员进行高效管理。 3. **报修管理**:学生可在线提交报修申请,教师负责审批和处理,提高维修效率。 4. **通知公告**:发布宿舍相关的通知和公告,确保信息的及时传达。 5. **数据统计与分析**:对宿舍的使用情况进行统计和分析,为决策提供有力支持。 **三、技术架构** 前端采用微信小程序原生开发,后端采用SpringBoot框架,数据库使用MySQL,实现了前后端分离,提高了系统的可扩展性和可维护性。 **四、部署与运行** 资源中提供了详细的部署指南,只需按照指南操作,即可在本地或服务器上成功部署并运行项目。 **五、二次开发与定制** 项目采用模块化设计,代码结构清晰,便于二次开发和定制。开发者可根据实际需求添加新功能或优化现有功能,满足特定场景下的使用需求。 总之,本资源是一套极具实用价值的毕业设计项目,不仅可作为学生毕业设计的参考,还可为校园宿舍管理提供有效解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

As_theWind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值