郑州艾特网站建设公司,宁波外贸公司招聘信息,局域网搭建的步骤,自己想做一个网站怎么做四、数据层解决方案
1.SQL
现有数据层解决方案技术选型#xff1a;DruidMyBatis-plusMySQL 数据源#xff1a;DruidDataSource 持久化技术#xff1a;MyBatis-plus/MyBatis 数据库#xff1a;MySql 内置数据源#xff1a; SpringBoot提供了3种内嵌的数据源对象供开发者选…四、数据层解决方案
1.SQL
现有数据层解决方案技术选型DruidMyBatis-plusMySQL 数据源DruidDataSource 持久化技术MyBatis-plus/MyBatis 数据库MySql 内置数据源 SpringBoot提供了3种内嵌的数据源对象供开发者选择 HikariCP默认内置数据源对象 Tomcat提供DataSourceHikariCP不可用的情况下且在web环境中将使用tomcat服务器配置的数据源对象 Commons DBCPHikari不可用tomcat数据源也不可用将使用dbcp数据源。 使用方式先使用默认配置再使用个性化配置。 通用配置无法设置具体的数据源配置信息仅提供基本的连接相关配置如需配置在下一级配置中设置具体设定。 JdbcTemplateSpring提供的默认的持久化技术几乎没人用 操作数据库的模板技术。 pom.xml
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId
/dependencyAutowiredprivate JdbcTemplate jdbcTemplate;Testvoid testJdbcTemplate(){String sqlselect * from tbl_book;RowMapperBook rmnew RowMapperBook() {Overridepublic Book mapRow(ResultSet rs, int rowNum) throws SQLException {Book tempnew Book();//查出来的放到结果集中从结果集中得到在set到对象中temp.setId(rs.getInt(id));temp.setName(rs.getString(name));temp.setType(rs.getString(type));temp.setDescription(rs.getString(description));return temp;}};ListBook list jdbcTemplate.query(sql, rm);System.out.println(list);}Testvoid testJdbcTemplateSave(){String sqlinsert into tbl_book values(null,springboot,springboot,springboot);jdbcTemplate.update(sql);}
H2数据库 SpringBoot提供了3种内嵌数据库供开发者选择提高开发测试效率 H2 HSQL Derby 伴随着内存启动而启动的数据库比较小巧。 pom.xml中
!--演示H2数据库--dependencygroupIdcom.h2database/groupIdartifactIdh2/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId/dependency配置文件中 开启服务后在浏览器中就可以访问 可以和持久层框架Mybatis-plus、JdbcTemplate搭配使用。
2.NoSQL
1Redis
市面上常见的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 {Resourceprivate RedisTemplate redisTemplate;Testvoid set() {ValueOperations ops redisTemplate.opsForValue();ops.set(age,41);}Testvoid get(){ValueOperations ops redisTemplate.opsForValue();Object age ops.get(age);System.out.println(age);}Testvoid hset() {HashOperations ops redisTemplate.opsForHash();ops.put(info,a,aa);}Testvoid 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 {Autowiredprivate StringRedisTemplate stringRedisTemplate;Testvoid get(){ValueOperationsString, 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也支持多连接实例一起工作。
2MongoDB
需求既能存储结构化数据又高性能。数据有着很高的修改需求 MongoDB是一个开源、高性能、无模式的文档型数据库。NoSQL数据库产品的一种是最像关系型数据库的非关系型数据库。 启动mongoDB服务 在客户端连接MongoDB服务
mongo --host127.0.0.1 --port27017或者使用可视化客户端 基础CRUD操作 SpringBoot整合MongoDB: 1.导入Mongodb对应的starter
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-mongodb/artifactId
/dependency2.配置mongodb访问uri 3.提供操作Mongodb接口对象MongoTemplate
SpringBootTest
class Springboot17MongdbApplicationTests {Autowiredprivate MongoTemplate mongoTemplate;Testvoid contextLoads() {Book booknew Book();book.setId(1);book.setName(springboot);book.setType(springboot);book.setDescription(springboot);mongoTemplate.save(book);}/*** 类型转换的问题 把数据库中不是int的删了*/Testvoid find(){ListBook all mongoTemplate.findAll(Book.class);System.out.println(all);}}
3ES Elasticsearch
相关概念 Elasticsearch是一个分布式全文搜索引擎。分布式架构可以做成分布式的 要想做全文搜索 1.通过所提供的数据进行分词将关联数据保存起来。就有了一个一个的id对应一个一个的简要数据。 2.分词查出来先匹配一个一个的idid再得到数据。实际上查询的时候是将输入这个id的数据展示出来。 这种方式大幅度的提高了查询速度。 传统的索引根据id查数据。 ES的索引倒排索引根据关键字数据查id再根据id查数据。 一条关键字—1—数据 对应的是一个文档每一条都需要提前建立起来。当使用关键字后就能找到对应的数据了。
基础操作 打开ES服务双击这个批处理文件 启动后可以在浏览器直接创建。 创建/查询/删除索引 PUThttp://localhost:9200/books GEThttp://localhost:9200/books DELETEhttp://localhost:9200/books 目前创建的这个索引是不支持分词的。要支持分词添加IK插件。再重启服务。 创建一个有分词功能的索引 查看这个索引 ES文档操作 添加一条文档相当于给数据库中添加一条数据不需要指定表结构。文档结构是无模式的。
使用_doc添加一个文档信息id是自动生成的。 使用_create添加文档信息后面需要加id号。 _doc后也可以加id号。 查询文档查询id为1的文档 查询所有文档 使用条件查询 删除文档 删除一个已经存在的 删除一个不存在的 修改一个文档 查询一下刚才修改的文档发现只有name是全覆盖。 如果不想全部修改只想修改某一条属性信息使用文档属性进行修改的。就不会覆盖其他的属性。 再次查询一下只有修改的变了。 ElasticSearchES总结 创建文档有三种方式。
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?qname:springboot删除文档
DELETE http://localhost:9200/books/_doc/1修改文档全量修改
PUT http://localhost:9200/books/_doc/1修改文档部分修改:对文档中的某个属性不是对整个文档进行操作其余都是对一整个文档进行操作的。
POST http://localhost:9200/books/_update/1SpringBoot整合ES客户端 直接整合高级别的客户端 先导入starter
dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactId
/dependency再写配置文件配置文件不用写采用的是硬编码的方式。 在SpringBoot里创建ES客户端
Testvoid testCreateIndex() throws IOException {//创建客户端HttpHost hostHttpHost.create(http://localhost:9200);RestClientBuilder builderRestClient.builder(host);client new RestHighLevelClient(builder);//使用客户端发送了一个请求创建了一个名称为books的索引CreateIndexRequest requestnew CreateIndexRequest(books);client.indices().create(request, RequestOptions.DEFAULT);//关闭客户端client.close();}在SpringBoot中创建索引
Testvoid testCreateIndexByIk() throws IOException {//创建客户端HttpHost hostHttpHost.create(http://localhost:9200);RestClientBuilder builderRestClient.builder(host);client new RestHighLevelClient(builder);//使用客户端发送了一个请求创建了一个名称为books的索引CreateIndexRequest requestnew 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();}添加单个文档
//添加文档Testvoid testCreateDoc() throws IOException {//创建客户端HttpHost hostHttpHost.create(http://localhost:9200);RestClientBuilder builderRestClient.builder(host);client new RestHighLevelClient(builder);Book book bookDao.selectById(1);IndexRequest requestnew IndexRequest(books).id(book.getId().toString());String json JSON.toJSONString(book);request.source(json,XContentType.JSON);client.index(request,RequestOptions.DEFAULT);//关闭客户端client.close();}
添加多个文档
//添加全部文档Testvoid testCreateDocAll() throws IOException {//创建客户端HttpHost hostHttpHost.create(http://localhost:9200);RestClientBuilder builderRestClient.builder(host);client new RestHighLevelClient(builder);//把所有东西都查出来造一个批处理请求的容器ListBook bookList bookDao.selectList(null);BulkRequest bulknew BulkRequest();for (Book book : bookList) {IndexRequest requestnew 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查询Testvoid testGet() throws IOException {//创建客户端HttpHost hostHttpHost.create(http://localhost:9200);RestClientBuilder builderRestClient.builder(host);client new RestHighLevelClient(builder);GetRequest requestnew GetRequest(books,1);GetResponse response client.get(request, RequestOptions.DEFAULT);String json response.getSourceAsString();System.out.println(json);//关闭客户端client.close();}//按条件查询Testvoid testSearch() throws IOException {//创建客户端HttpHost hostHttpHost.create(http://localhost:9200);RestClientBuilder builderRestClient.builder(host);client new RestHighLevelClient(builder);//查books索引SearchRequest requestnew SearchRequest(books);//设置条件 如果还有条件继续往里排就行SearchSourceBuilder builder1new 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();}