的配置中是针对 MySql 这种自增数据库的,如果使用 ORACLE 序列方式,可以参考下面的配置:
SQL 中的 {1}
代表的是对应表的大写形式,{0}
是小写形式,这个配置生成的代码会像下面这样:
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY,
generator = "select SEQ_COUNTRY.nextval from dual")
private Integer id;
// 省略其他
}
2.使用maven执行MBG
Maven 中的插件配置如下:
maven-compiler-plugin
${jdk.version}
${jdk.version}
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.6
${basedir}/src/main/resources/generator/generatorConfig.xml
true
true
mysql
mysql-connector-java
5.1.29
tk.mybatis
mapper
4.0.0
下面看配置文件generatorConfig.xml:
映射文件包名和位置
dao包名和位置
这里和之前相差不多,只是通过
引入了外部属性文件,在
配置时,使用的属性文件中的参数。
运行
在 pom.xml 这一级目录的命令行窗口执行 mvn mybatis-generator:generate
即可(前提是配置了mvn)。
通用代码生成器
代码生成器是基于 MBG 插件的,所以需要配合 MBG 使用。
一个简单的 MBG 配置如下:
在这个配置中,我们只关注 tk.mybatis.mapper.generator.TemplateFilePlugin
。
基于模板的插件 TemplateFilePlugin
这个插件中除了几个必备的属性外,还可以增加任意的属性,属性完全是为了给模板提供数据。
先看一个基本完整的配置:
下面介绍必备的属性。
1. targetProject
用于指定目标项目,一般是 src/main/java
或者 src/main/resource
这样的目录。还可以是 src/test/java
或者 src/test/resource
这样的目录。
在多模块项目中,还能通过相对路径指定为其他的目录,例如:
这个属性值有一个要求,就是目录必须存在,否则不会生成代码!
2. targetPackage
用于指定包的部分,虽然是这个名字,实际上就是路径。
这个属性指定的路径如果不存在,就会自动创建。
这个属性的值可以为空。
例如 mapper/admin
用于生成 mapper/admin/
目录,或者 tk.mybatis.mapper
生成包(本质上还是目录)。
这个属性还有一个特殊的地方,它还支持使用模板,就和下面的 fileName
一样,举个简单的使用场景。
你可能在生成前端代码的时候,希望将表对应的 JSP 生成在自己的一个目录中,此时可以配置为:
模板中可以用到的属性,这里都能用,其他属性后面会介绍。
通过这个路径也能看出来,配置一个插件只能根据模板在一个指定位置(targetProject 和 targetPackage 决定的目录)生成一个文件。
3. templatePath
指定模板路径,可以是任意能够通过 ClassLoader 能够获取的位置,文件类型没有限制。
例如示例中的 generator/test-one.ftl
。
这个属性必须指定,否则不会生成代码!
4. fileName
这个属性用于指定生成文件的名字,这个值支持使用模板,例如上面的 ${tableClass.shortClassName}Test.txt
,具体可用的属性会在后面介绍。
这个属性必须指定,否则不会生成代码!
5. templateFormatter
这个属性可选,默认使用基于 FreeMarker 的实现!
默认情况下,你需要添加下面的依赖:
org.freemarker
freemarker
2.3.23
默认的实现类为:tk.mybatis.mapper.generator.formatter.FreemarkerTemplateFormatter
。
这个类实现了两个接口 TemplateFormatter, ListTemplateFormatter
。
这俩接口分别对应下面 singleMode
参数值的 true
和 false
。
也就是一个表生成一个文件,或者多个表生成一个文件。
对于一般情况下,都是第一种情况。但是在配置文件中,可能会用到多个表的信息。
如果你想使用其他模板引擎,可以自己实现上面的接口。
6. singleMode
上面已经提过,默认为 true
。
一个表生成一个文件时,可用属性可以参考 generator/test-one.ftl
,表的属性在 tableClass
中。
多个表生成一个文件时,可用属性可以参考 generator/test-all.ftl
,所有表的属性在 tableClassSet
中,通过遍历可以获取单个的信息。
7. 其他你需要的属性
模板中需要的特殊信息都可以通过
方法设置,在模板中直接使用这里定义的属性名来使用,后面例子的中的 mapperSuffix
就是这种属性。
TemplateFilePlugin
配置示例
前两个会生成 Dao 后缀的 Mapper 接口和 XML,其中有个针对性的参数 mapperSuffix
用于配置后缀,还有个 mapperPackage
在生成 XML 时获取接口的包名(因为和这里的 targetPackage
可以不同)。
后两个插件用于演示所有可用的属性,而且是两种不同的模式。
在表和实体上可用的所有属性如下:
特殊:targetPackage值在 ${package} 中。
当前时间:
<#assign dateTime = .now>
日期:${dateTime?date}
时间:${dateTime?time}
格式化:${dateTime?string["yyyy-MM-dd HH:mm:ss"]}
所有配置的属性信息:
<#list props?keys as key>
${key} - ${props[key]}
#list>
实体和表的信息:
表名:${tableClass.tableName}
变量名:${tableClass.variableName}
小写名:${tableClass.lowerCaseName}
类名:${tableClass.shortClassName}
全名:${tableClass.fullClassName}
包名:${tableClass.packageName}
列的信息:
=====================================
<#if tableClass.pkFields??>
主键:
<#list tableClass.pkFields as field>
-------------------------------------
列名:${field.columnName}
列类型:${field.jdbcType}
字段名:${field.fieldName}
注释:${field.remarks}
类型包名:${field.typePackage}
类型短名:${field.shortTypeName}
类型全名:${field.fullTypeName}
是否主键:${field.identity?c}
是否可空:${field.nullable?c}
是否为BLOB列:${field.blobColumn?c}
是否为String列:${field.stringColumn?c}
是否为字符串列:${field.jdbcCharacterColumn?c}
是否为日期列:${field.jdbcDateColumn?c}
是否为时间列:${field.jdbcTimeColumn?c}
是否为序列列:${field.sequenceColumn?c}
列长度:${field.length?c}
列精度:${field.scale}
#list>
#if>
<#if tableClass.baseFields??>
基础列:
<#list tableClass.baseFields as field>
-------------------------------------
列名:${field.columnName}
列类型:${field.jdbcType}
字段名:${field.fieldName}
注释:${field.remarks}
类型包名:${field.typePackage}
类型短名:${field.shortTypeName}
类型全名:${field.fullTypeName}
是否主键:${field.identity?c}
是否可空:${field.nullable?c}
是否为BLOB列:${field.blobColumn?c}
是否为String列:${field.stringColumn?c}
是否为字符串列:${field.jdbcCharacterColumn?c}
是否为日期列:${field.jdbcDateColumn?c}
是否为时间列:${field.jdbcTimeColumn?c}
是否为序列列:${field.sequenceColumn?c}
列长度:${field.length?c}
列精度:${field.scale}
#list>
#if>
<#if tableClass.blobFields??>
Blob列:
<#list tableClass.blobFields as field>
-------------------------------------
列名:${field.columnName}
列类型:${field.jdbcType}
字段名:${field.fieldName}
注释:${field.remarks}
类型包名:${field.typePackage}
类型短名:${field.shortTypeName}
类型全名:${field.fullTypeName}
是否主键:${field.identity?c}
是否可空:${field.nullable?c}
是否为BLOB列:${field.blobColumn?c}
是否为String列:${field.stringColumn?c}
是否为字符串列:${field.jdbcCharacterColumn?c}
是否为日期列:${field.jdbcDateColumn?c}
是否为时间列:${field.jdbcTimeColumn?c}
是否为序列列:${field.sequenceColumn?c}
列长度:${field.length?c}
列精度:${field.scale}
#list>
#if>
=====================================
全部列(包含了pk,base,blob 字段,可用的属性和上面的一样):
<#if tableClass.allFields??>
列名 - 字段名
<#list tableClass.allFields as field>
${field.columnName} - ${field.fieldName}
#list>
#if>
4.2.3 测试执行
上面示例就是本项目的测试代码,在 src/test/resources/generator/generatorConfig.xml
中。
还提供了一种 Java 编码方式运行的类,src/test/java/
中的 tk.mybatis.mapper.generator.Generator
,配置上面 xml 中的数据库信息就可以生成。
测试生成的部分 结果如下。
实体:
@Table(name = "`user_info`")
public class UserInfo {
@Id
@Column(name = "`Id`")
@GeneratedValue(generator = "JDBC")
private Integer id;
Dao:
package test.mapper;
import test.model.UserInfo;
/**
* 通用 Mapper 代码生成器
*
* @author mapper-generator
*/
public interface UserInfoDao extends tk.mybatis.mapper.common.Mapper {
}
XML:
test-one.ftl 生成的信息如下:
目标package:
当前时间:
2017-11-6
22:00:45
2017-11-06 22:00:45
所有配置的属性信息:
targetPackage -
templateFormatter - tk.mybatis.mapper.generator.formatter.FreemarkerTemplateFormatter
templatePath - generator/test-one.ftl
targetProject - src/test/resources
fileName - ${tableClass.shortClassName}Test.txt
实体和表的信息:
表名:user_info
变量名:userInfo
小写名:userinfo
类名:UserInfo
全名:test.model.UserInfo
包名:test.model
列的信息:
=====================================
主键:
-------------------------------------
列名:Id
列类型:INTEGER
字段名:id
注释:
类型包名:java.lang
类型短名:Integer
类型全名:java.lang.Integer
是否主键:true
是否可空:false
是否为BLOB列:false
是否为String列:false
是否为字符串列:false
是否为日期列false
是否为时间列false
是否为序列列false
列长度:10
列精度:0
基础列:
-------------------------------------
列名:username
列类型:VARCHAR
字段名:username
注释:用户名
类型包名:java.lang
类型短名:String
类型全名:java.lang.String
是否主键:false
是否可空:false
是否为BLOB列:false
是否为String列:true
是否为字符串列:true
是否为日期列false
是否为时间列false
是否为序列列false
列长度:32
列精度:0
-------------------------------------
列名:password
列类型:VARCHAR
字段名:password
注释:密码
类型包名:java.lang
类型短名:String
类型全名:java.lang.String
是否主键:false
是否可空:true
是否为BLOB列:false
是否为String列:true
是否为字符串列:true
是否为日期列false
是否为时间列false
是否为序列列false
列长度:32
列精度:0
-------------------------------------
列名:usertype
列类型:VARCHAR
字段名:usertype
注释:用户类型
类型包名:java.lang
类型短名:String
类型全名:java.lang.String
是否主键:false
是否可空:true
是否为BLOB列:false
是否为String列:true
是否为字符串列:true
是否为日期列false
是否为时间列false
是否为序列列false
列长度:2
列精度:0
-------------------------------------
列名:enabled
列类型:INTEGER
字段名:enabled
注释:是否可用
类型包名:java.lang
类型短名:Integer
类型全名:java.lang.Integer
是否主键:false
是否可空:true
是否为BLOB列:false
是否为String列:false
是否为字符串列:false
是否为日期列false
是否为时间列false
是否为序列列false
列长度:10
列精度:0
-------------------------------------
列名:realname
列类型:VARCHAR
字段名:realname
注释:真实姓名
类型包名:java.lang
类型短名:String
类型全名:java.lang.String
是否主键:false
是否可空:true
是否为BLOB列:false
是否为String列:true
是否为字符串列:true
是否为日期列false
是否为时间列false
是否为序列列false
列长度:32
列精度:0
-------------------------------------
列名:qq
列类型:VARCHAR
字段名:qq
注释:QQ
类型包名:java.lang
类型短名:String
类型全名:java.lang.String
是否主键:false
是否可空:true
是否为BLOB列:false
是否为String列:true
是否为字符串列:true
是否为日期列false
是否为时间列false
是否为序列列false
列长度:14
列精度:0
-------------------------------------
列名:email
列类型:VARCHAR
字段名:email
注释:
类型包名:java.lang
类型短名:String
类型全名:java.lang.String
是否主键:false
是否可空:true
是否为BLOB列:false
是否为String列:true
是否为字符串列:true
是否为日期列false
是否为时间列false
是否为序列列false
列长度:100
列精度:0
-------------------------------------
列名:tel
列类型:VARCHAR
字段名:tel
注释:联系电话
类型包名:java.lang
类型短名:String
类型全名:java.lang.String
是否主键:false
是否可空:true
是否为BLOB列:false
是否为String列:true
是否为字符串列:true
是否为日期列false
是否为时间列false
是否为序列列false
列长度:255
列精度:0
Blob列:
=====================================
全部列:
列名 - 字段名
Id - id
username - username
password - password
usertype - usertype
enabled - enabled
realname - realname
qq - qq
email - email
tel - tel
你可能感兴趣的:(微服务)
微服务链路雪崩防护深度解析:Hystrix与Sentinel熔断降级策略对比
梦玄海
微服务 hystrix sentinel
一、微服务雪崩效应与熔断机制核心原理1.1雪崩效应形成机制微服务架构中的雪崩效应本质上是服务调用链路的级联故障扩散过程,其形成机制可分为以下阶段:异常传播阶段:当某个下游服务节点因高负载、网络波动或代码缺陷出现响应延迟或异常时,调用方服务会持续积累待处理请求资源耗尽阶段:调用方线程池被持续占满,数据库连接池耗尽,TCP连接数达到上限,导致正常业务请求无法获取计算资源服务瘫痪阶段:故障通过服务依赖关
为什么阿里巴巴Java开发手册禁止使用存储过程?
需要重新演唱
SQL java java 开发语言
阿里巴巴Java开发手册中禁止使用存储过程的原因主要基于以下几个方面的考虑:1.可维护性差复杂性:存储过程通常包含复杂的逻辑,随着业务逻辑的增加,存储过程的复杂性也会不断增加,导致维护成本高。调试困难:存储过程的调试通常比应用程序代码更困难,尤其是在分布式系统和微服务架构中。版本控制:存储过程的版本控制和变更管理相对复杂,难以与应用程序的版本控制流程集成。2.可移植性差数据库依赖:存储过程的语法和
第1章:微服务架构概述
liangxh2010
架构 微服务 云原生
1.1传统单体架构vs微服务架构文字讲解在软件开发的早期阶段,单体架构(MonolithicArchitecture)是最主流的架构模式。在这种模式下,一个大型应用程序的所有功能模块(如用户界面、业务逻辑、数据访问层)都被打包在一个独立的单元中,通常是一个WAR或JAR文件。单体架构的优点:开发简单:所有代码都在一个项目中,易于管理和调试。部署直接:只需将单个应用包部署到服务器即可。单体架构的缺点
聚合cps+cpa分销系统开发实战:覆盖多领域的CPS+CPA双模式技术架构解析
引言在数字经济时代,聚合分销系统通过整合CPS(按销售分成)与CPA(按行动付费)双模式,为短剧、小说、外卖、电商、网盘、APP拉新等领域提供了高效的商业变现解决方案。本文结合微服务架构、中台化设计及实战案例,深度解析该系统的技术实现与架构设计。系统架构设计微服务与中台化双引擎采用SpringCloudAlibaba框架构建分布式微服务架构,将系统拆分为8大核心服务:mermaidgraphTDA
Java知识体系个人总结
普通人zzz~
Java知识体系个人总结 分布式微服务全家桶 java
Java知识体系个人总结Java进阶知识项目问题记录系统设计并发编程前端数据库关系型数据库非关系型数据库应用框架SpringMyBatis/IBatisNetty微服务与分布式1.分布式微服务2.Netflix-Ribbon3.Netflix-OpenFeign4.Netflix-Eureka5.Alibaba-Dubbo6.Alibaba-Nacos7.Alibaba-Sentinel8.Ali
ABP VNext + Kubernetes & Istio:微服务网格实战指南
ABPVNext+Kubernetes&Istio:微服务网格实战指南目录ABPVNext+Kubernetes&Istio:微服务网格实战指南一、引言二、环境与依赖️三、项目与基础部署3.1生成Kubernetes资源3.2构建Docker镜像3.3HelmChart目录结构与参数注入四、安装Istio&定义入口五、Mermaid全链路流程概览六、将服务注入IstioMesh七、流量管理与金丝雀
架构解密-从分布式到微服务资源文件介绍
架构解密-从分布式到微服务资源文件介绍去发现同类优质开源项目:https://gitcode.com/分布式架构向微服务的演变,是现代IT架构发展的重要趋势。《架构解密-从分布式到微服务》资源文件,涵盖了这一转型过程中的核心功能与场景,旨在帮助架构师和开发者深入掌握分布式架构与微服务技术。项目介绍《架构解密-从分布式到微服务》是一本集成了大量实践经验和前沿技术的专业书籍。本书以分布式架构和微服务为
【算法-贪心算法-python】柠檬水找零
檀越@新空间
P1 算法与数据结构 s1 Python 算法 贪心算法 python
欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。推荐:kuan的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结java核心技术点,如集合,jvm,并发编程redis,kafka,Spring,微服务,Netty等常用开发工具系列:罗列常用的开发工具,如IDEA,M
微服务架构核心技术解析
Java开发廖志伟
Java场景面试宝典 Microservices Service Discovery API Gateway
我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、Spri
Spring Cloud学习:如何实现Gateway 服务网关限流
杨荧
spring cloud 学习 gateway
目录一、SpringCloud介绍二、什么是服务网关三、Gateway的优势和应用场景四、如何实现Gateway服务网关限流一、SpringCloud介绍SpringCloud是一个基于SpringBoot的微服务架构开发工具集,它整合了多种微服务解决方案,为开发者提供了一站式的微服务开发体验。SpringCloud的核心组件包括服务发现、配置管理、消息传递、负载均衡、断路器等,这些组件可以帮助开
服务化架构、SOA 与微服务:关系、演进与实战落地全解析
要阿尔卑斯吗.
架构 微服务 云原生
在分布式系统架构面试中,面试官常常会问到一个核心问题:“你能说说服务化架构、SOA和微服务之间到底是什么关系吗?有什么区别?”这并不是一个单纯的理论问题,而是对开发者系统认知和实践经验的综合考察。今天,我们将系统梳理这个话题,结合架构演进历史、核心设计理念、技术实现路径及落地经验,帮助大家理清服务化架构的发展脉络,走好系统设计之路。一、什么是服务化架构?它与SOA、微服务是什么关系?首先需要明确一
全面解析阿里巴巴 Seata:微服务架构下的分布式事务解决方案(AT模式)
要阿尔卑斯吗.
架构 微服务 分布式
在微服务架构盛行的今天,系统被拆解成多个独立服务,每个服务对应独立的数据库。这种“服务自治”的设计虽然提高了系统可维护性和扩展性,却带来了新的难题——分布式事务一致性问题。为了保障跨服务、跨库操作的原子性,阿里巴巴开源了一个优秀的解决方案:Seata(SimpleExtensibleAutonomousTransactionArchitecture)。本文将从背景动因、整体架构、核心原理、事务模型
基于 Python 对于Nacos 服务订阅流程的深度剖析
chilavert318
熬之滴水穿石 python 开发语言 nacos
记得去年在外省给某事业单位给科技处的领导作关于国产化微服务项目的汇报,该处长要我详细讲解一下Nacos的来龙去脉。我问他为什么要单独了解这块,他说现在国产化已经是趋势了,他其实也想深度的了解一下,这款产品是如何演化而来,希望通过了解该产品的来龙去脉深度思索一下,他所辖范围之内系统国产化的一些思路。记得当时我也是做足了工作,然后选择一个时间给他单独汇报,会后领导反响还不错,领导总结道:Nacos适应
Docker:DockerHub 与 私有仓库Registry
聪明的奇瑞
一个完整的系统可能包含上百个微服务,可能对应着上百个镜像,如果考虑到微服务的版本则会构建更多的镜像,那么这些镜像该如何管理呢?使用DockerHub镜像管理DockerHub是Docker官方维护的DockerRegistry,上面存放着很多优秀的镜像,只需注册一个DockerHub账号就可以使用了通过dockerlogin命令登录DockerHub,并按提示输入账号密码#DockerHub该网站
《互联网大厂Java求职者必看!Spring Boot+Redis+微服务高频面试题实战》
《互联网大厂Java求职者必看!SpringBoot+Redis+微服务高频面试题实战》面试现场:谢飞机vs大厂严肃面试官面试官:欢迎来参加我们公司的技术面试,我是本次的技术面试官。先做个自我介绍吧。谢飞机:您好,我叫谢飞机,三年开发经验,写过HelloWorld,也修过线上Bug,喜欢边写代码边喝咖啡……面试官(微笑):嗯,不错,挺有程序员气质。那我们开始吧。第一轮:基础技术与SpringBoo
云原生环境下的安全控制框架设计
TechVision大咖圈
云原生 Kubernetes安全 云原生安全 安全框架设计 零信任 微服务安全
在这个容器满天飞、微服务遍地跑的时代,安全问题就像打地鼠游戏一样,刚按下一个又冒出三个。今天我们来聊聊如何在云原生环境中构建一套靠谱的安全控制框架。文章目录引言:云原生时代的安全新挑战云原生安全面临的核心挑战安全控制框架设计原则框架核心组件详解安全控制策略实施最佳实践与案例分析总结与展望引言:云原生时代的安全新挑战还记得以前那种"铁桶阵"式的安全防护吗?外面围一圈防火墙,里面的服务器老老实实待在机
短剧系统全栈开发指南:从0到1构建高并发微服务架构
wx_ywyy6798
短剧系统 短剧系统开发 海外短剧系统 海外短剧系统开发 短剧分销 短剧分销系统 短剧分销系统开发
一、短剧系统概述短剧作为一种新兴的数字内容形式,近年来在移动互联网领域迅速崛起。短剧系统开发不仅涉及传统视频平台的技术栈,还需要针对短内容、高互动、快速消费等特点进行专门设计。1.1短剧行业现状与发展趋势2023年短剧市场规模已突破300亿元,用户日均使用时长达到58分钟。短剧以其"短平快"的特点,填补了用户碎片化时间的娱乐需求。未来发展趋势包括:垂直领域精细化运营AI辅助内容生产互动式剧情发展跨
28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
喵叔哟
.NET 8 .net 微服务 java
仅有币种服务还不够,记账应用还需支持不同币种间的转换。要实现这一功能,首先需要获取币种之间的汇率。因此,本文将介绍如何实现汇率的同步。一、汇率数据从何而来?汇率数据无时无刻都在变动,因此需要一个可靠的来源来获取最新的汇率信息。通常可以通过以下几种方式获取:爬取数据:一些专业的金融数据服务商提供汇率数据,可以通过订阅获取。手动输入:对于小型应用,可以手动输入汇率数据,但这不适合大规模或实时更新的应用
AI 智能运维,重塑大型企业软件运维:从自动化到智能化的进阶实践
AI、少年郎
人工智能 运维 自动化
一、引言:企业软件运维的智能化转型浪潮在数字化转型加速的背景下,大型企业软件架构日益复杂,微服务、多云环境、分布式系统的普及导致传统运维模式面临效率瓶颈。AI技术的渗透催生了智能运维(AIOps)的落地,通过机器学习、大模型、智能Agent等技术,实现从"人工救火"到"智能预防"的范式转变。本文结合头部企业实践,解析AI在运维领域的核心应用场景、技术架构及未来趋势,特别针对基础运维中流程重构、技术
从服务实例的元数据中获取配置值 vs 从本地配置文件中获取配置值
在微服务架构中,配置管理是保障系统灵活运行的核心环节。开发者常面临选择困境:该从服务实例元数据(如instance.getMetadata().get("weight"))还是本地配置文件(如@Value("${weight}"))获取配置?两者有何本质区别?能否随意互换?本文将整合两种配置获取方式的核心特性,从技术原理到实际应用进行全面解析。一、两种配置获取方式的核心原理与示例1.服务实例元数据
JAVA面试宝典 -《API设计:RESTful 与 GraphQL 对比实践》
没有bug.的程序员
JAVA面试宝典 java 面试 restful
API设计:RESTful与GraphQL对比实践在微服务架构中,API设计如同城市交通网络规划——选择RESTful还是GraphQL,决定了数据流的效率与灵活性。本文通过实战代码与架构对比,揭秘两种风格的适用场景与融合方案。引言:API设计的两大流派之争为什么越来越多团队关注GraphQL?数据需求碎片化:移动端/多终端需要按需获取数据接口迭代成本:REST每次需求变更需发布新版本前后端协作效
干货|Spring Cloud Stream 体系及原理介绍
java高并发
[SpringCloudStream]在SpringCloud体系内用于构建高度可扩展的基于事件驱动的微服务,其目的是为了简化消息在SpringCloud应用程序中的开发。SpringCloudStream(后面以SCS代替SpringCloudStream)本身内容很多,而且它还有很多外部的依赖,想要熟悉SCS,必须要先了解SpringMessaging和SpringIntegration这两个
【SpringCloud微服务实战09】Elasticsearch 搜索引擎
李维山
Java elasticsearch spring cloud 搜索引擎
一、Elasticsearch安装1、Docker安装ES#创建一个网络dockernetworkcreatees-net#拉取ES镜像(这里使用7.17.18版本)dockerpullelasticsearch:7.17.18#新建一个目录存放es数据mkdirescdes#docker运行单机启动esdockerrun-d\--namees\-e"ES_JAVA_OPTS=-Xms512m-X
【Java架构师的未来与趋势】
架构学院
Java成神之路-架构师进阶 java 开发语言
Java架构师的未来与趋势引言Java作为企业级应用开发的主力军,已经走过了25年的历程。在这四分之一个世纪中,Java生态系统经历了从Applet到企业级应用,从单体架构到微服务,从本地部署到云原生的巨大转变。今天,Java架构师正站在新一轮技术变革的十字路口——人工智能、云计算、低代码、边缘计算等新兴技术正深刻重塑软件架构的形态和架构师的角色。据JetBrains《2023Java开发者调查》
到底如何从零开始使用Hyperf 搭建微服务架构?具体步骤是怎样的?底层原理是什么?
一、Hyperf的底层原理Hyperf是一个基于Swoole的高性能PHP微服务框架,其核心特点包括:协程支持:基于Swoole提供的协程能力,Hyperf实现了非阻塞I/O和高并发处理。协程是轻量级线程,允许在单个进程中处理大量并发请求。依赖注入(DI):使用PSR-11标准的依赖注入容器,简化组件管理和服务解耦。AOP(面向切面编程):通过注解和AOP机制,可以在方法执行前后插入逻辑,例如日志
Python,Go开发光电效应与日常应用APP
Geeker-2025
python golang
以下是一个基于Python与Go开发的光电效应科普与应用APP的完整技术方案,结合了物理原理模拟、实时数据处理及生活场景应用,参考了工业级开发实践(如光电实验数据处理和能源设备控制):---###一、系统架构设计```mermaidgraphLRA[Go微服务层]-->B[Python科学计算层]A-->C[数据库/物联网]B-->D[硬件接口]D-->E[传感器/实验设备]subgraph前端A
应用层流量与缓存累积延迟解析
你一身傲骨怎能输
计算机网络 缓存
文章摘要应用层流量指OSI模型中应用层协议(如HTTP、gRPC)产生的数据交互,常见于Web请求、微服务通信等场景。缓存累积延迟指多级缓存或消息队列机制中,各级延迟叠加导致数据更新滞后,例如数据库更新后,因消息队列、缓存刷新等环节延迟,用户最终看到的数据可能滞后数秒。两者分别描述了网络通信的数据流机制和分布式系统中的延迟问题。1.应用层流量应用层流量,一般指的是在网络通信的OSI七层模型中,**
SpringBoot架构下智慧物流管理系统设计详解
本文还有配套的精品资源,点击获取简介:本文详细讲解了如何利用SpringBoot框架构建智慧物流管理系统,并涉及关键技术和实现原理。文章首先介绍了SpringBoot的核心组件和工作原理,然后探讨了RESTfulAPI的构建、数据模型与数据库设计、GPS定位服务集成、权限控制和认证、微服务化以及系统测试等关键方面。这一系统结合Java技术优势,提供了一个高效、智能化的物流行业解决方案。1.Spri
阿里云 RabbitMQ 可观测性最佳实践
观测云
阿里云 rabbitmq 云计算
阿里云RabbitMQ阿里云RabbitMQ是一款高性能、高可靠的消息中间件,支持多种消息协议和丰富的功能特性。它提供消息队列功能,能够实现应用间的消息解耦和异步通信,提升系统扩展性和稳定性。其支持多种消息持久化策略,确保消息不丢失;具备灵活的路由和负载均衡能力,可高效分发消息;还提供丰富的管理功能,如队列监控、消息追踪和权限管理等,帮助用户轻松管理和优化消息队列,广泛应用于分布式系统、微服务架构
C#微服务配置管理黑科技:Nacos与量子级动态配置实战——从零构建永不宕机的云原生架构
墨夶
C#学习资料4 云原生 架构 c#
1.微服务的‘配置熵增’困境传统配置管理的致命缺陷:雪崩效应:单点配置变更导致全链路重启优先级混乱:本地配置与云端配置冲突导致服务不可用动态性缺失:无法实时响应业务需求变更解决方案:量子级配置同步:Nacos的实时推送与本地缓存黑洞优先级机制:共享配置、扩展配置、应用配置的优先级博弈服务发现的‘引力波’:健康检查驱动的动态路由2.1Nacos在C#中的“量子叠加态”:从SDK安装到服务发现核心组件
Spring中@Value注解,需要注意的地方
无量
spring bean @Value xml
Spring 3以后,支持@Value注解的方式获取properties文件中的配置值,简化了读取配置文件的复杂操作
1、在applicationContext.xml文件(或引用文件中)中配置properties文件
<bean id="appProperty"
class="org.springframework.beans.fac
mongoDB 分片
开窍的石头
mongodb
mongoDB的分片。要mongos查询数据时候 先查询configsvr看数据在那台shard上,configsvr上边放的是metar信息,指的是那条数据在那个片上。由此可以看出mongo在做分片的时候咱们至少要有一个configsvr,和两个以上的shard(片)信息。
第一步启动两台以上的mongo服务
&nb
OVER(PARTITION BY)函数用法
0624chenhong
oracle
这篇写得很好,引自
http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html
OVER(PARTITION BY)函数用法
2010年10月26日
OVER(PARTITION BY)函数介绍
开窗函数 &nb
Android开发中,ADB server didn't ACK 解决方法
一炮送你回车库
Android开发
首先通知:凡是安装360、豌豆荚、腾讯管家的全部卸载,然后再尝试。
一直没搞明白这个问题咋出现的,但今天看到一个方法,搞定了!原来是豌豆荚占用了 5037 端口导致。
参见原文章:一个豌豆荚引发的血案——关于ADB server didn't ACK的问题
简单来讲,首先将Windows任务进程中的豌豆荚干掉,如果还是不行,再继续按下列步骤排查。
&nb
canvas中的像素绘制问题
换个号韩国红果果
JavaScript canvas
pixl的绘制,1.如果绘制点正处于相邻像素交叉线,绘制x像素的线宽,则从交叉线分别向前向后绘制x/2个像素,如果x/2是整数,则刚好填满x个像素,如果是小数,则先把整数格填满,再去绘制剩下的小数部分,绘制时,是将小数部分的颜色用来除以一个像素的宽度,颜色会变淡。所以要用整数坐标来画的话(即绘制点正处于相邻像素交叉线时),线宽必须是2的整数倍。否则会出现不饱满的像素。
2.如果绘制点为一个像素的
编码乱码问题
灵静志远
java jvm jsp 编码
1、JVM中单个字符占用的字节长度跟编码方式有关,而默认编码方式又跟平台是一一对应的或说平台决定了默认字符编码方式;2、对于单个字符:ISO-8859-1单字节编码,GBK双字节编码,UTF-8三字节编码;因此中文平台(中文平台默认字符集编码GBK)下一个中文字符占2个字节,而英文平台(英文平台默认字符集编码Cp1252(类似于ISO-8859-1))。
3、getBytes()、getByte
java 求几个月后的日期
darkranger
calendar getinstance
Date plandate = planDate.toDate();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setTime(plandate);
// 取得三个月后时间
cal.add(Calendar.M
数据库设计的三大范式(通俗易懂)
aijuans
数据库复习
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效率、优雅的数据库,否则可能会设计出错误的数据库.
目前,主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。满足最低要求的叫第一范式,简称1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称2NF。其余依此类推。
想学工作流怎么入手
atongyeye
jbpm
工作流在工作中变得越来越重要,很多朋友想学工作流却不知如何入手。 很多朋友习惯性的这看一点,那了解一点,既不系统,也容易半途而废。好比学武功,最好的办法是有一本武功秘籍。研究明白,则犹如打通任督二脉。
系统学习工作流,很重要的一本书《JBPM工作流开发指南》。
本人苦苦学习两个月,基本上可以解决大部分流程问题。整理一下学习思路,有兴趣的朋友可以参考下。
1 首先要
Context和SQLiteOpenHelper创建数据库
百合不是茶
android Context创建数据库
一直以为安卓数据库的创建就是使用SQLiteOpenHelper创建,但是最近在android的一本书上看到了Context也可以创建数据库,下面我们一起分析这两种方式创建数据库的方式和区别,重点在SQLiteOpenHelper
一:SQLiteOpenHelper创建数据库:
1,SQLi
浅谈group by和distinct
bijian1013
oracle 数据库 group by distinct
group by和distinct只了去重意义一样,但是group by应用范围更广泛些,如分组汇总或者从聚合函数里筛选数据等。
譬如:统计每id数并且只显示数大于3
select id ,count(id) from ta
vi opertion
征客丶
mac opration vi
进入 command mode (命令行模式)
按 esc 键
再按 shift + 冒号
注:以下命令中 带 $ 【在命令行模式下进行】,不带 $ 【在非命令行模式下进行】
一、文件操作
1.1、强制退出不保存
$ q!
1.2、保存
$ w
1.3、保存并退出
$ wq
1.4、刷新或重新加载已打开的文件
$ e
二、光标移动
2.1、跳到指定行
数字
【Spark十四】深入Spark RDD第三部分RDD基本API
bit1129
spark
对于K/V类型的RDD,如下操作是什么含义?
val rdd = sc.parallelize(List(("A",3),("C",6),("A",1),("B",5))
rdd.reduceByKey(_+_).collect
reduceByKey在这里的操作,是把
java类加载机制
BlueSkator
java 虚拟机
java类加载机制
1.java类加载器的树状结构
引导类加载器
^
|
扩展类加载器
^
|
系统类加载器
java使用代理模式来完成类加载,java的类加载器也有类似于继承的关系,引导类是最顶层的加载器,它是所有类的根加载器,它负责加载java核心库。当一个类加载器接到装载类到虚拟机的请求时,通常会代理给父类加载器,若已经是根加载器了,就自己完成加载。
虚拟机区分一个Cla
动态添加文本框
BreakingBad
文本框
<script> var num=1; function AddInput() { var str=""; str+="<input 
读《研磨设计模式》-代码笔记-单例模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
public class Singleton {
}
/*
* 懒汉模式。注意,getInstance如果在多线程环境中调用,需要加上synchronized,否则存在线程不安全问题
*/
class LazySingleton
iOS应用打包发布常见问题
chenhbc
ios iOS发布 iOS上传 iOS打包
这个月公司安排我一个人做iOS客户端开发,由于急着用,我先发布一个版本,由于第一次发布iOS应用,期间出了不少问题,记录于此。
1、使用Application Loader 发布时报错:Communication error.please use diagnostic mode to check connectivity.you need to have outbound acc
工作流复杂拓扑结构处理新思路
comsci
设计模式 工作 算法 企业应用 OO
我们走的设计路线和国外的产品不太一样,不一样在哪里呢? 国外的流程的设计思路是通过事先定义一整套规则(类似XPDL)来约束和控制流程图的复杂度(我对国外的产品了解不够多,仅仅是在有限的了解程度上面提出这样的看法),从而避免在流程引擎中处理这些复杂的图的问题,而我们却没有通过事先定义这样的复杂的规则来约束和降低用户自定义流程图的灵活性,这样一来,在引擎和流程流转控制这一个层面就会遇到很
oracle 11g新特性Flashback data archive
daizj
oracle
1. 什么是flashback data archive
Flashback data archive是oracle 11g中引入的一个新特性。Flashback archive是一个新的数据库对象,用于存储一个或多表的历史数据。Flashback archive是一个逻辑对象,概念上类似于表空间。实际上flashback archive可以看作是存储一个或多个表的所有事务变化的逻辑空间。
多叉树:2-3-4树
dieslrae
树
平衡树多叉树,每个节点最多有4个子节点和3个数据项,2,3,4的含义是指一个节点可能含有的子节点的个数,效率比红黑树稍差.一般不允许出现重复关键字值.2-3-4树有以下特征:
1、有一个数据项的节点总是有2个子节点(称为2-节点)
2、有两个数据项的节点总是有3个子节点(称为3-节
C语言学习七动态分配 malloc的使用
dcj3sjt126com
c language malloc
/*
2013年3月15日15:16:24
malloc 就memory(内存) allocate(分配)的缩写
本程序没有实际含义,只是理解使用
*/
# include <stdio.h>
# include <malloc.h>
int main(void)
{
int i = 5; //分配了4个字节 静态分配
int * p
Objective-C编码规范[译]
dcj3sjt126com
代码规范
原文链接 : The official raywenderlich.com Objective-C style guide
原文作者 : raywenderlich.com Team
译文出自 : raywenderlich.com Objective-C编码规范
译者 : Sam Lau
0.性能优化-目录
frank1234
性能优化
从今天开始笔者陆续发表一些性能测试相关的文章,主要是对自己前段时间学习的总结,由于水平有限,性能测试领域很深,本人理解的也比较浅,欢迎各位大咖批评指正。
主要内容包括:
一、性能测试指标
吞吐量、TPS、响应时间、负载、可扩展性、PV、思考时间
http://frank1234.iteye.com/blog/2180305
二、性能测试策略
生产环境相同 基准测试 预热等
htt
Java父类取得子类传递的泛型参数Class类型
happyqing
java 泛型 父类 子类 Class
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.junit.Test;
abstract class BaseDao<T> {
public void getType() {
//Class<E> clazz =
跟我学SpringMVC目录汇总贴、PDF下载、源码下载
jinnianshilongnian
springMVC
----广告--------------------------------------------------------------
网站核心商详页开发
掌握Java技术,掌握并发/异步工具使用,熟悉spring、ibatis框架;
掌握数据库技术,表设计和索引优化,分库分表/读写分离;
了解缓存技术,熟练使用如Redis/Memcached等主流技术;
了解Ngin
the HTTP rewrite module requires the PCRE library
流浪鱼
rewrite
./configure: error: the HTTP rewrite module requires the PCRE library.
模块依赖性Nginx需要依赖下面3个包
1. gzip 模块需要 zlib 库 ( 下载: http://www.zlib.net/ )
2. rewrite 模块需要 pcre 库 ( 下载: http://www.pcre.org/ )
3. s
第12章 Ajax(中)
onestopweb
Ajax
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
Optimize query with Query Stripping in Web Intelligence
blueoxygen
BO
http://wiki.sdn.sap.com/wiki/display/BOBJ/Optimize+query+with+Query+Stripping+in+Web+Intelligence
and a very straightfoward video
http://www.sdn.sap.com/irj/scn/events?rid=/library/uuid/40ec3a0c-936
Java开发者写SQL时常犯的10个错误
tomcat_oracle
java sql
1、不用PreparedStatements 有意思的是,在JDBC出现了许多年后的今天,这个错误依然出现在博客、论坛和邮件列表中,即便要记住和理解它是一件很简单的事。开发者不使用PreparedStatements的原因可能有如下几个: 他们对PreparedStatements不了解 他们认为使用PreparedStatements太慢了 他们认为写Prepar
世纪互联与结盟有感
阿尔萨斯
10月10日,世纪互联与(Foxcon)签约成立合资公司,有感。
全球电子制造业巨头(全球500强企业)与世纪互联共同看好IDC、云计算等业务在中国的增长空间,双方迅速果断出手,在资本层面上达成合作,此举体现了全球电子制造业巨头对世纪互联IDC业务的欣赏与信任,另一方面反映出世纪互联目前良好的运营状况与广阔的发展前景。
众所周知,精于电子产品制造(世界第一),对于世纪互联而言,能够与结盟