Windows下安装ElasticSearch和IK分词器
前言在当今数据驱动的时代,高效管理和检索海量数据已成为许多应用的核心需求。无论是构建实时日志分析系统、实现商品搜索功能,还是开发智能推荐引擎,都离不开一个强大的搜索与分析工具的支持。而 Elasticsearch(ES) 正是这一领域的佼佼者。作为一款开源的分布式搜索与分析引擎,Elasticsearch 凭借其近乎实时的查询性能、高扩展性以及灵活的 RESTful API,成为开发者、运维工程师乃至数据科学家工具箱中不可或缺的利器。
Elasticsearch 基于 Apache Lucene 构建,能够轻松处理结构化、非结构化数据的全文检索、聚合分析和复杂查询。其分布式架构天然支持横向扩展,允许用户通过简单的节点扩容应对数据量的增长,同时保障服务的高可用性。无论是初创企业的轻量级应用,还是互联网巨头的亿级数据处理场景,ES 都能游刃有余。
然而,对于刚接触 Elasticsearch 的开发者而言,从零开始部署和配置 ES 环境可能面临诸多挑战:复杂的依赖项、繁琐的集群配置、版本兼容性问题,以及生产环境中的资源隔离需求。这时,Docker 的优势便凸显出来。借助 Docker 容器 ...
Spring Boot自定义strter实战和底层原理
前言在使用 Spring Boot 开发项目时,我们常常依赖各种 Starter,它们为我们提供了开箱即用的功能,例如自动配置、依赖管理和更便捷的集成支持。但在某些场景下,我们可能会遇到业务需求或技术需要,现有的 Starter 无法完全满足。这时候,自定义一个 Spring Boot Starter 就显得尤为重要。
通过自定义 Starter,我们可以将通用逻辑、组件和配置进行模块化封装,提升代码复用性和项目一致性。无论是为团队打造共享工具库,还是为开源社区提供扩展包,自定义 Starter 都是极具价值的开发技能。本文将带你了解自定义 Starter 的核心原理,并通过一个简单的本地缓存示例,帮助你快速掌握如何实现一个属于自己的 Spring Boot Starter。
本地缓存项目在这个DEMO中,我们将基于Caffeine构建一个自定义starter项目,以实现本地缓存功能。然后其它项目可以通过引入starter的方式,使用本地缓存的增删查功能。
创建local-cache项目首先我们创建一个local-cache项目,整个项目的结构如下
123456789101112131 ...
JAVA是如何生成一个Jar文件并启动它的?
什么是Jar?JAR 文件是一种基于流行的 ZIP 文件格式的文件格式,用于将多个文件聚合为一个文件。 JAR 文件本质上是一个包含可选 META-INF 目录的 zip 文件。可以通过命令行 jar 工具或使用 Java 平台中的java.util.jarAPI 创建 JAR 文件。 JAR 文件的名称没有限制,可以是特定平台上的任何合法文件名。
使用较为初级的方式生成一个jar包生成jar包的方式多种多样,我们可以选择使用Maven,使用Spring Boot等等,这次我们选择使用最纯粹的命令行的方式,来完成Java项目的打包过程。
创建一个纯粹的JAVA项目我们先创建一个jar-demo的项目,整体项目结构如下
123456789jar-demo/│├── src/│ └── com/│ └── btzx/│ └── MainApp.java│└── manifest/ └── MANIFEST.MF
启动类代码简单输出些东西
12345678public class MainApp { public static vo ...
Mybatis动态SQL处理过程
动态SQL的定义动态 SQL 是 MyBatis 的强大特性之一。动态SQL的概念是指在MyBatis中使用条件逻辑构建的SQL语句,这些SQL语句在运行时根据传入的参数动态改变。动态SQL允许开发者在XML映射文件或使用注解的方式中,根据不同的条件组合出不同的SQL语句,从而避免了为每种可能的查询条件编写单独的SQL语句,提高了代码的复用性和灵活性。
如果一段SQL不包含动态逻辑,那么我们称它为静态SQL,比如:
1SELECT * FROM USER WHERE ID = #{id}
反之,如果一段SQL包含以下任意一个或多个元素,那么它就是动态SQL:
<if>:根据条件判断是否包含某段SQL。
<choose>、<when>、<otherwise>:多分支选择,类似于Java中的switch语句。
<where>:智能地插入WHERE关键字,并且能够处理其后的AND或OR关键字。
<set>:智能地插入SET关键字,并且能够处理列表末尾的逗号。
<foreach>:用于遍 ...
Mybatis嵌套映射机制原理
前言我们知道,在MySQL中的关联查询语法可以使我们获得一个来源于多表的包含多个字段列表,类似这样
id
TITLE
comment_id
comment_content
1
文章1
1
你说的对
1
文章1
2
写的太好了
前面两个字段是Blog表的字段,后面两个是评论表达字段。现在假设我们需要将这列表转换成博客对象包含评论集合的数据结构,类似这样:
1BlogPO(id=1, title=文章1, content=null, userId=null, comments=[CommentPO{id=1, blogId=null, userId=null, content='你说的对'}, CommentPO{id=2, blogId=null, userId=null, content='写的太好了'}])
当然我们完全可以用JAVA写转换逻辑,但其实Mybatis已经为我们提供了类似的功能,我们今天就看下这套机制的实现原理。
DEMO照例还是先写一个小例子
XML的配置
12345 ...
Mybatis的懒加载机制
懒加载定义什么是Mybatis的懒加载机制?简单来说就是在使用时才会触发查询操作,而不是在一开始就加载所有数据。懒加载机制只在有子查询时生效,一定程度上可以提升程序的响应能力。
懒加载的整体结构
测试程序还是基于Blog和Comment的测试程序,简单调整一下。
1234567891011121314151617181920212223242526<?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="org.example.mybatis_reader.mybatis.blog.BlogMapper"> <resultMap id="BlogMap ...
Mybatis延迟加载机制
A依赖B B又依赖A所构成的一种循环,也可以称为循环依赖,试想下这个场景在MyBatis中会怎样?如果不管的话那就是死循环了。
循环依赖流程
Mybatis是通过延迟加载来解决循环依赖问题的。
Demo实例在下面例子中,BlogMap中有评论信息,而评论信息中又反过来包含博客信息,两者互相依赖。
123456789101112131415161718192021222324252627<?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="org.example.mybatis_reader.mybatis.blog.BlogMapper"> <cache/& ...
Mybatis之PreparedStatementHandler源码解读
StatementHandler的整体结构PreparedStatementHandler实现自StatementHandler,我们先看下StatementHandler的结构
StatementHandler的执行流程
请求参数处理所谓的请求参数处理,就是将入参转换为JDBC参数的过程。主要分为两个步骤,一是参数的转换,二是参数的映射。
参数的转换如果是单个参数,我们的请求参数会被转换为一个Object对象;如果是多个请求参数,或者单个参数但是被加了@Param注解,那么我们的入参是会被转换成Map。举个例子:
12@Select("SELECT * FROM T_USER WHERE id = #{user.id} OR USER_NAME = #{name}")UserPO selectUserWithPo(@Param("user") UserPO userPO, @Param("name") String name);
参数转换的源码如下:
1234567891011 ...
Mybatis的二级缓存机制
二级缓存的定义MyBatis的二级缓存是一个全局的缓存,与一级缓存只作用域会话级别不同,它的作用范围是整个应用,二级缓存可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改较少的数据。
开启二级缓存可以在*mapper.xml中添加一行,或者在Mapper接口上添加@CacheNamespace注解以获取二级缓存的支持。
开启二级缓存后可以获得以下效果(摘自官网)
映射语句文件中的所有 select 语句的结果将会被缓存。
映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存,总共支持以下几种淘汰策略:
LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对
缓存不会定时进行刷新(也就是说,没有刷新间隔)。
缓存会保存列表或对象(无论查询方法返回哪种)的 ...
Mybatis的一级缓存机制
一级缓存先声明一个测试类FirstCacheTest,然后我们就可以在里面写测试方法了。
12345678910111213141516import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;public class FirstCacheTest { private SqlSession sqlSession; @Before public void init() { SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessi ...