parameters) {
if (!(sqlStatementContext instanceof WhereAvailable)) {
return Collections.emptyList();
}
List result = new ArrayList<>();
for (WhereSegment each : ((WhereAvailable) sqlStatementContext).getWhereSegments()) {
result.addAll(createShardingConditions(sqlStatementContext, each.getExpr(), parameters));
}
return result;
}
构造condition后,ShardingRouteEngineFactory会把from中和逻辑表名不一致的表剔除掉,这个怎么理解呢?比如SQL里一共涉及3张表table_a、table_b、table_c,其中table_c其中table_c写作table_c_${},直接通过${}把分表名拼接好了,变成table_c_001。table_c_001这个表名是在分表规则里找不到的,因此也不会应用任何分表规则。
private static ShardingRouteEngine getDQLRoutingEngine(final ShardingRule shardingRule, final ShardingSphereSchema schema, final SQLStatementContext sqlStatementContext,
final ShardingConditions shardingConditions, final ConfigurationProperties props) {
Collection tableNames = sqlStatementContext.getTablesContext().getTableNames();
if (shardingRule.isAllBroadcastTables(tableNames)) {
return sqlStatementContext.getSqlStatement() instanceof SelectStatement ? new ShardingUnicastRoutingEngine(tableNames) : new ShardingDatabaseBroadcastRoutingEngine();
}
if (sqlStatementContext.getSqlStatement() instanceof DMLStatement && shardingConditions.isAlwaysFalse() || tableNames.isEmpty()) {
return new ShardingUnicastRoutingEngine(tableNames);
}
// from子句里的表名,如果不是逻辑表名,不会按照分表处理
Collection shardingLogicTableNames = shardingRule.getShardingLogicTableNames(tableNames);
if (shardingLogicTableNames.isEmpty()) {
return new ShardingIgnoreRoutingEngine();
}
return getDQLRouteEngineForShardingTable(shardingRule, schema, sqlStatementContext, shardingConditions, props, shardingLogicTableNames);
}
继续看下去,getDQLRouteEngineForShardingTable如果通过bindingTableRule出要处理的表分片规则一致,那就直接返回,不重复处理。
RouteSQLRewriteEngine将SQL里的逻辑表改写为物理表,调用栈如下:
用于改写的代码:
public final String toSQL() {
if (context.getSqlTokens().isEmpty()) {
return context.getSql();
}
Collections.sort(context.getSqlTokens());
StringBuilder result = new StringBuilder();
result.append(context.getSql(), 0, context.getSqlTokens().get(0).getStartIndex());
for (SQLToken each : context.getSqlTokens()) {
result.append(each instanceof ComposableSQLToken ? getComposableSQLTokenText((ComposableSQLToken) each) : getSQLTokenText(each));
result.append(getConjunctionText(each));
}
return result.toString();
}
ShardingRule
用于存放分表和单表的规则,被Statement使用。为了便于叙述,举例如下:
一共三个数据源:不分表的ds-master、包括分表的ds0、包括分表的ds1
查询的逻辑表名是c_voucher,对应地分表是c_voucher_${companyId}_${subYear},也就是通过companyId和subYear两个参数确定实际的分表。
实际使用时有很多分片规则可以采用,比如按userId第几位路由到第几张表、某个字段取哈希值再取模路由。但是由于目前手上的项目找不到这种例子,不在此处剖析。处理方式是类似的,读者可以自行探索。
与application.properties对应关系(部分)
属性 ShardingRule中的属性名 application.properties配置 备注
数据源名称 dataSourceNames 属性前缀的一部分,比如
["ds-0","ds-1"]对应
spring.shardingsphere.datasource.ds-0.xxx=yyy
spring.shardingsphere.datasource.ds-1.xxx=zzz
分片算法 shardingAlgorithms
(Map) 既有表的也有库的。
对于表的:
spring.shardingsphere.rules.sharding.sharding-algorithms.ts-c-voucher.type=COMPLEX_INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.ts-c-voucher.props.algorithm-expression=c_voucher_$->{companyId}_$->{subYear}
对于库的:
spring.shardingsphere.rules.sharding.sharding-algorithms.t-database-inline.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.t-database-inline.props.algorithm-expression=ds-$-> type定义具体分片算法类型,此处是COMPLEX_INLINE,支持比INLINE更复杂的表达式计算。
可以看出表和库的属性规则不太一样,表是ts-xx,库是t-xx
全局唯一键生成算法 keyGenerators
(本例中为null) 本例不涉及 雪花算法、UUID等
表规则 tableRules
(Map) 见下一节
绑定表规则 bindingTableRules 比如有a~i一共9张表,每3张的分片规则一样
spring.shardingsphere.rules.sharding.binding-tables[0]=a,b,c
spring.shardingsphere.rules.sharding.binding-tables[1]=d,e,f
spring.shardingsphere.rules.sharding.binding-tables[2]=g,h,i 将具有关联关系(会进行join)且按照同样的分片规则的表绑定到同一个表规则中,避免笛卡尔积运算
其它 本例不涉及,略
TableRule和application.properties的对应关系
ShardingRule包含了一个TableRule的map,包含了具体表分片的配置。这里单拎出来分析。
属性 TableRule的属性名 application.properties配置 备注
逻辑表名 logicTable -
实际的数据节点 actualDataNodes spring.shardingsphere.rules.sharding.tables.c_vouching_result.actual-data-nodes=ds-$->{0..1}.c_voucher_$->{1..2}_$-> 并不是真实的表名,此处对象中是:
ds-0.c_voucher_1_1
ds-0.c_voucher_2_2
ds-0.c_voucher_2_1
ds-0.c_voucher_2_2
ds-1.c_voucher_1_1
ds-1.c_voucher_2_2
ds-1.c_voucher_2_1
ds-1.c_voucher_2_2
实际的表 actualTables 同上 并不是真实的表名,和actualDataNodes类似
数据节点的索引map dataNodeIndexMap 同上 给actualDataNodes按顺序分配一个序号,本例0~7
表所在库的分片规则 databaseShardingStrategyConfig spring.shardingsphere.rules.sharding.tables.c_voucher.database-strategy.standard.sharding-column=schemaId
spring.shardingsphere.rules.sharding.tables.c_voucher.database-strategy.standard.sharding-algorithm-name=t-database-inline
表的分片规则 tableShardingStrategyConfig spring.shardingsphere.rules.sharding.tables.c_voucher.table-strategy.complex.sharding-columns=companyId,subYear
spring.shardingsphere.rules.sharding.tables.c_voucher.table-strategy.complex.sharding-algorithm-name=ts-c-vouching-result 分片的列、分片算法名称,对应的name是shardingAlgorithms中出现过的拼上前缀的表名
生成主键的列 generateKeyColumn - 不涉及,略
主键生成器名称 keyGeneratorName - 不涉及,略
实际数据源名称 actualDatasourceNames - ds-0,ds-1
数据源对应的分表 datasourceToTablesMap - 分表名同actualDataNodes
实现分库分表路由的关键步骤
根据流程图和上面的类,可以总结如下:
进行数据源的配置,包括库和表的分片规则(算法+来源列),以确保应用启动时组装的Connection包含这些路由信息,从而传递下去。
执行SQL时,组装的Statement根据逻辑表名找到对应的库表分片规则,从而推算出实际的表名:
生成LogicSQL,将SQL结构化
解析LogicSQL的from子句,获取分表相关的参数,并组装逻辑表到物理表的映射RouteUnit(同一个bindingTableRules的表只组装一个)
KernelProcessor将LogicSQL里需要替换的表名按RouteUnit改写成逻辑表名。
问题解答
前言的三个问题
前言中的前两个问题很好解答,通过上面的分析,可以知道原始sql里的逻辑表是怎么转换成物理表的,分片规则是如何和相关的参数共同发挥作用的。
对于第三个问题,我把之前项目中无法找到table_c的第一版三表join查询SQL简化如下:
SELECT
a.biz_date,
a.type_id,
a.voucher_id,
a.create_time,
a.update_time
FROM
table_a a
INNER JOIN table_c c
ON a.biz_date = c.biz_date
AND a.type_id = c.type_id
AND a.voucher_id = c.voucher_id
LEFT JOIN table_b b
ON a.biz_date = b.biz_date
AND a.type_id = b.type_id
AND a.voucher_id = b.voucher_id
AND a.schema_id = b.schema_id
AND a.sub_year = b.sub_year
AND a.company_id = b.company_id
where a.company_id = #{company_id}
AND a.schema_id = #{schema_id}
AND a.sub_year = #{sub_year}
其中table_a、table_b的分表位是company_id和sub_year,分片规则完全一样;table_c的是accPackageId,分表规则和前两种不一同。
由于第一版运行时会报错,当时没有时间确定具体原因,为了不影响项目进度,我临时将table_c改写成了table_c_${accPackageId}。它在executor里会替换成对应的物理表名,并且也不会找对应的分表规则。项目上线了,能用但是有注入风险。
经过上面的探讨,初版SQL找不到table_c逻辑表的原因其实很简单了:table_c的分表位没有作为一个参数出现在SQL里(尽管它在mapper.java的方法入参里出现)。那么在这个SQL的where中加一行,并把table_c_${accPackageId}改回table_c,问题解决:
and c.accPackageId = #{accPackageId}
引申问题:如果分表不在同一个分库?
这种情况通过现有项目对应应用验证有点麻烦:库的分片规则所有分表是一致的,这个字段所有分表的逻辑表都有。如果想改,需要改分片规则。
因此我换了一种方式测试:在Navicat中执行等效语句语句,没有报错,且能查到插入的数据:
SELECT
a.biz_date,
a.type_id,
a.voucher_id,
a.update_time
FROM
dev_account_0.table_a_1722_2024 a
INNER JOIN dev_account_1.table_c_757 c ON a.biz_date= c.biz_date
AND a.type_id= c.type_id
AND a.voucher_id= c.voucher_id
LEFT JOIN dev_account_0.table_b_1722_2024 b ON a.biz_date= b.biz_date
AND a.type_id= b.type_id
AND a.voucher_id= b.voucher_id
AND a.schema_id = b.schema_id
AND a.sub_year = b.sub_year
AND a.company_id = b.company_id
WHERE
a.company_id = 1722
AND a.schema_id = 0
AND a.sub_year= 2024
AND c.dev_account_0= 757
那么,既然Mybatis能提供类似的分库分表映射,理论上也是可以达到同样效果的。
当然,我个人并不推荐这样做,因为这种查询有限制:必须对这些分片都有权限。
并且,我观察到,如果table_c没有符合要求的数据,不在同一个库的查询会比在同一个库要慢的非常多,到了极其夸张的程度——分别是50s和0.2s。
源码阅读感想
阅读源码时,最好一边debug一边整理流程图一边去理解。静态地看源码,理解难度很高,原因是:
你可能感兴趣的:(mybatis,unix)
Linux系统之bc命令详解
门前灯
linux 运维 服务器 bc bc命令详解
bc(BasicCalculator)是一个在Unix和类Unix操作系统中提供的任意精度计算语言。它支持基本的数学运算,包括加、减、乘、除以及指数运算,并且能够处理浮点数和整数。此外,bc还支持编程特性,如变量定义、条件判断、循环结构等,使其不仅仅是一个计算器,更是一个完整的编程环境。基本语法启动bc交互模式:直接在终端中输入bc即可进入交互模式,在该模式下可以实时输入并计算表达式。bc非交互模
苍穹外卖(Springboot3实现) day01
十年不明
苍穹外卖学习 spring spring boot java
黑马给的起步代码基础工程版本是springboot2.x我的电脑用的是JDK21springboot3.x所以第一天整了很长时间需要慢慢修改配置环境目录依赖版本更换springboot版本更换mybatis版本更换lombok版本更换数据库依赖更新(很重要)swagger配置问题代码补全依赖版本更换springboot版本更换父工程sky-take-out的pom文件添加spring-boot-s
MyBatis-Plus 自定义 SQL 和复杂查询
rkmhr_sef
面试 学习路线 阿里巴巴 mybatis sql 数据库
MyBatis-Plus自定义SQL和复杂查询详解MyBatis-Plus是MyBatis的增强版,提供了许多开箱即用的CRUD操作。然而,在实际项目中,开发者常常需要编写自定义SQL以处理更复杂的查询需求。MyBatis-Plus提供了灵活的机制,允许开发者通过注解或XML自定义SQL,同时也能支持复杂查询、动态SQL等高级操作。1.自定义SQL的两种方式MyBatis-Plus支持两种自定义S
net.sf.jsqlparser.statement.select.Select.getSelectBody()
m0_74824002
面试 学习路线 阿里巴巴 java
1、问题原因发生这个问题就是因为Pagehelper中jsqlparser和Mybatis-puls中jsqlparser冲突,以我的项目来说,我项目中的Pagehelper中jsqlparser版本为4.2而Mybatis-puls中jsqlparser的版本为4.9,就导致版本兼容问题2、解决方法如果你想以Pagehelper中jsqlparser的版本来使用的话,那么项目将启动不起来,就比如
2025年毕设ssm网上超市论文+源码
SSM毕设程序源码JAVA
课程设计
本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景关于网上超市系统的研究,现有研究主要集中在电子商务平台的设计与开发、供应链管理、以及用户行为分析等领域。尽管这些研究已经取得了一定的成果,但专门针对基于SSM(Spring、SpringMVC、MyBatis)框架的网上超市系统的研究仍相对较少。随着电子商务的蓬勃发展,网上超市
Java初级入门学习
周杰伦fans
ai学习参考 JAVA 后端框架 java 学习 开发语言
JAVA学习@[TOC](JAVA学习)**一、Java初级入门学习路径****1.Java基础语法****2.面向对象编程(OOP)****3.数据库与JDBC****4.JavaWeb基础****二、主流框架推荐与学习建议****1.Spring框架****2.SpringMVC****3.MyBatis****4.SpringBoot****三、后续学习建议****1.实战项目****2.进
gethostname
若云止水
c语言
在POSIX兼容系统(如Linux、Unix、macOS)中,使用的是gethostname()函数,定义在头文件中:#includeintgethostname(char*name,size_tlen);参数说明name:用于存储主机名的字符数组(缓冲区)len:缓冲区的最大长度(以字节为单位)返回值成功时返回0失败时返回-1,并设置errno来指示错误
MyBatis-Plus 与 Redis
#sakura
mybatis redis 数据库
1MyBatis-Plus1.1MyBatis-Plus简介MyBatis是一款优秀的持久层框架,它能将接口和JavaPOJO(PlainOldJavaObjects,普通Java对象)映射为数据库中的数据。支持自定义SQL、存储过程,功能强大。MyBatis承担了几乎所有的JDBC代码,包括设置参数和获取结果等工作,可通过简单的XML或注解进行配置。MyBatis-Plus是MyBatis的最佳
使用wxWidgets开发跨平台GUI应用程序
DevNinja
C/C++
使用wxWidgets开发跨平台GUI应用程序wxWidgets是一个开源的C++GUI框架,可以让开发人员在多个操作系统上快速构建跨平台的图形用户界面。与其他GUI框架相比,wxWidgets的主要优势在于它的跨平台能力、多样化的控件、可扩展性、以及可靠性和稳定性。wxWidgets支持大多数常见的操作系统,包括Windows、Linux、Unix和MacOSX等,并且具有相同的API接口,这使
Linux笔记---调试工具GDB(gdb)
大筒木老辈子
linux 笔记 运维
1.gdb的概念GDB,全称GNUDebugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及MicrosoftWindows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。gdb的主要功能:启动和控制程序执行:gdb可以按照自定义要求运行程序,并在指定的断点处暂停执行。检查程序状态:当程序暂停时,gdb允许开发者检查程序中
wxWidgets:跨平台GUI开发框架
2301_79366332
C/C++
wxWidgets:跨平台GUI开发框架wxWidgets是一个开源的、跨平台的C++GUI开发框架。它提供了丰富的工具和类库,用于构建具有图形用户界面的应用程序。wxWidgets的设计目标是使开发者能够在不同的操作系统上编写一次代码,然后将其编译为在多个平台上运行的应用程序。wxWidgets支持多种操作系统,包括Windows、macOS、Linux以及其他Unix-like系统。它还可以与
MyBatis-Plus 中 LambdaQueryWrapper 方法引用的完整解析
蒸只小鱼
mybatis java tomcat
MyBatis-Plus中LambdaQueryWrapper方法引用的完整解析本文详细分析MyBatis-Plus中LambdaQueryWrapper方法引用的核心作用、实现原理、使用场景及常见问题,并通过完整代码示例演示其用法。1.什么是LambdaQueryWrapper?LambdaQueryWrapper是MyBatis-Plus提供的一个链式查询条件构造器,允许通过Lambda表达式
Mybatis-plus使用wrapper实现分页查询
impl柴猿滚滚
java mybatis-plus
pom.xml3.0.7com.baomidoumybatis-plus-boot-starter${mybatisplus.version}com.baomidoumybatis-plus-generatorController@AutowiredprivateXXXServicexxxService;@GetMapping(value="/xxx/list")@ApiOperation(val
Mybatis中使用的设计模式
rice_88
Mybatis mybatis 设计模式
建造者模式这里讲得很清楚了深入浅出设计模式——建造者模式(BuilderPattern)在mybatis中,在解析配置文件的时候使用。Builder角色是org.apache.ibatis.builder.BaseBuilderConcreteBuilder角色就是它的实现类,分别负责解析不同类型的配置文件,包括org.apache.ibatis.builder.xml.XMLConfigBuil
使用 MyBatis XML 和 QueryWrapper 实现动态查询
曹天骄
mybatis xml
本文档介绍了如何在MyBatis中结合XML配置和MyBatis-Plus的QueryWrapper来实现动态查询。1.XML中定义基本查询首先,在MyBatisXML文件中定义一个基本的select查询:SELECT*FROMorder2.在Mapper接口中定义方法在Mapper接口中定义一个方法,接受QueryWrapper作为参数:packagecom.example.order.mapp
MyBatis @Param 注解详解:多参数传递与正确使用方式
扣丁梦想家
mybatis Java mysql java 数据库 mybatis mysql
@Param注解主要用于MyBatis进行参数传递时给SQL语句中的参数起别名,通常用于多参数方法,使参数在XMLMapper文件或注解SQL语句中更清晰易用。1.基本用法在@Mapper接口中使用@Param来为参数命名,避免MyBatis解析时出现参数名丢失的问题(尤其是多个参数时)。示例:查询用户@MapperpublicinterfaceUserMapper{@Select("SELECT
(三)Linux中GCC/g++:基础用法和实用选项全面解析
Tech行者
Linux的学习笔记 linux
GCC/g++是LINUX下广泛使用的编译器,它同样是开源的。GCC(gnucompilercollection)包含了C、C++、Objective-C、Fortran、Ada等语言的编译器,可以在大多数的UNIX操作系统以及类UNIX系统中运行。在本篇博客中,我将详细介绍GCC/g++的使用方法以及一些常用选项,以供读者参考。一、GCC/g++的安装GCC/g++在大多数Linux系统中都已经
Kali Linux渗透基础知识整理(四):维持访问
陆小马
黑客网络安全 黑客 安全 网络攻防
在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限。使用木马程序、后门程序和rootkit来达到这一目的。维持访问是一种艺术形式,思想比渗透更加重要。NetcatCryptcatweevelycymothoaNetcatNetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接(networkconnection)。它被设计成一个可靠的后端(back-end)工具,能被
linux git 搭建 debian,如何在Debian服务器上安装公共Git存储库
高江Takae
linux git 搭建 debian
如何在Debian服务器上安装公共Git存储库Git是一个免费的分布式版本控制,最初由LinusTorvalds为Linux内核开发创建。它主要在Linux上开发,但可用于其他Unix操作系统,包括BSD,Solaris和Darwin。基于POSIX的系统,如Linux,Git非常快。它与svn不同,并在远程服务器上创建一个私有存储库。一些流行的项目使用Git:*YUI*Merb*DragonFl
SecureCRT for Mac v9.6.2 一款终端仿真程序 支持M、Intel芯片
Macdo_cn
macos
应用介绍SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,同时支持Telnet和rlogin协议。SecureCRT是一款用于连接运行包括Windows、UNIX和VMS的远程系统的理想工具。通过使用内含的VCP命令行程序可以进行加密文件的传输。有流行CRTTelnet客户机的所有特点,包括:自动注册、对不同主机保持不同的特性、打印功能、颜色设置、可变屏幕尺寸、用户定义的键位
MyBatis使用log4j打印日志相关配置
劲雨波
MyBatis maven java intellij-idea log4j mybatis
目录一、环境二、依赖三、配置1、log4j.properties2、配置信息一、环境maven:3.6.3ideal:2020MyBatis:3.5.4二、依赖org.slf4jslf4j-log4j121.7.5三、配置1、log4j.properties在resources中新建log4j.properties2、配置信息在log4j.properties中输入以下信息log4j.rootLo
Mybatis-Plus 批量插入速度慢的问题优化
自在如风。
mybatis mybatis-plus mysql sql java
MyBatis-Plus的batchSave接口:实现分页批量插入在实际开发中,批量插入数据是一个常见需求,尤其当数据量较大时,直接使用循环插入效率低下,而MyBatis-Plus提供了强大的批量操作支持。本文将详细讲解如何通过配置和代码实现batchSave接口的分页批量插入功能,优化性能并避免内存溢出。1.背景介绍MyBatis-Plus的BaseMapper默认提供了insert方法,但它只
initrd.img的压缩(制作)及解压的过程
MM's
学习历程
一、启动镜像initrd.img文件类RedHat系统从vmlinuz核心引导后,会读取initrd.img启动镜像。该文件中包含驱动模块等信息,是非常重要的文件。不同版本使用的格式不同。1.RHEL4.0版本采用ext2文件格式镜像,再通过gzip压缩:引用#fileinitrd.imginitrd.img:gzipcompresseddata,fromUnix,maxcompression#m
初识操作系统
曳渔
# JavaEE java-ee java
目录一、操作系统的认识1、常见的操作系统:2、操作系统的两个基本功能:二、进程1、什么是进程(Process):2、进程的组成:3、进程的并发和并行执行:三、总结:一、操作系统的认识操作系统是⼀组做计算机资源管理的软件的统称。1、常见的操作系统:目前常见的操作系统有Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。·Windows是常见的个人电脑
Mybatis xml 无法正常解析 Invalid bound statement
javaspringboot
问题背景使用插件mybatisX生成的mapper.xml没有办法被正常解析,项目使用的是nacos作为配置中心;问题定位首先看了一下网上说的常见几种问题,比如id不匹配,或者说pom里缺少resource配置导致target里没有xml;这些都没有出现;那接下来就只能从源码出发解决问题;通过报错的堆栈信息我发现问题的出发点是在这里publicSqlCommand(Configurationcon
Linux下的HTTP服务介绍与初步配置
敲个代码怎么这么难啊
linux 运维 apache
一、介绍1.1、介绍ApacheHTTP服务器项目致力于为包括UNIX和Windows在内的现代操作系统开发和维护一个开源HTTP服务器。该项目的目标是提供一个安全、高效和可扩展的服务器,该服务器提供与当前HTTP标准同步的HTTP服务。ApacheHTTP服务器(“httpd”)于1995年推出,自1996年4月以来,它一直是互联网上最流行的web服务器。它在2020年2月作为一个项目庆祝了它的
MyBatis-Plus开发流程:Spring Boot + MyBatis-Plus 实现对 book_tab 表的增删改查及Redis缓存
Darling &you&
mybatis 缓存 spring boot
前言MyBatis-Plus是一个MyBatis的增强工具,旨在简化开发、减少工作量。本文将介绍如何使用SpringBoot集成MyBatis-Plus来操作数据库,并结合Redis实现数据的缓存功能。1项目搭建1.1创建SpringBoot项目可以通过SpringInitializr快速创建一个新的SpringBoot项目,选择必要的依赖如SpringWeb,MyBatisPlus,MySQLD
SHEIN面试——Java高级开发
有鹿如溪
面试 Java 面试 职场和发展
2022年7月20希音二面高级开发工程师(供应链)面试流程1自我介绍2问问题开始多线程:1线程间的通信方式2什么是pua定义3什么是内卷的定义4spring和mybatis怎么操作数据库的5平时工作量怎么定义的6工作技巧7如何提升工作效率8对加班有啥看法9为啥离职耗时:30分钟
Mybatis的映射文件中,不同的映射文件,id是否可以重复
欣欣爱吃香菜
mybatis
首先如果xml映射文件中配置了namespace,那么id可以重复,如果没有配置namespace,id不可以重复;原因是namespace+id是作为Map的key使用的,如果没有namespace,只有id,那么id重复会导致数据相互覆盖;有了namespace,id也就可以重复,namespace+id自然也就不同。
RHCE---第二部分
Chen_l916
linux 服务器 运维
第二部分shell脚本编程一、shell基本知识shell程序的特点:1、简单易学2、解释性语言,不需要编译即可执行Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中,Shell既是用户交互的界面,也是控制系统的脚本语言。shell的分类·BourneS
集合框架
天子之骄
java 数据结构 集合框架
集合框架
集合框架可以理解为一个容器,该容器主要指映射(map)、集合(set)、数组(array)和列表(list)等抽象数据结构。
从本质上来说,Java集合框架的主要组成是用来操作对象的接口。不同接口描述不同的数据类型。
简单介绍:
Collection接口是最基本的接口,它定义了List和Set,List又定义了LinkLi
Table Driven(表驱动)方法实例
bijian1013
java enum Table Driven 表驱动
实例一:
/**
* 驾驶人年龄段
* 保险行业,会对驾驶人的年龄做年龄段的区分判断
* 驾驶人年龄段:01-[18,25);02-[25,30);03-[30-35);04-[35,40);05-[40,45);06-[45,50);07-[50-55);08-[55,+∞)
*/
public class AgePeriodTest {
//if...el
Jquery 总结
cuishikuan
java jquery Ajax Web jquery方法
1.$.trim方法用于移除字符串头部和尾部多余的空格。如:$.trim(' Hello ') // Hello2.$.contains方法返回一个布尔值,表示某个DOM元素(第二个参数)是否为另一个DOM元素(第一个参数)的下级元素。如:$.contains(document.documentElement, document.body); 3.$
面向对象概念的提出
麦田的设计者
java 面向对象 面向过程
面向对象中,一切都是由对象展开的,组织代码,封装数据。
在台湾面向对象被翻译为了面向物件编程,这充分说明了,这种编程强调实体。
下面就结合编程语言的发展史,聊一聊面向过程和面向对象。
c语言由贝尔实
linux网口绑定
被触发
linux
刚在一台IBM Xserver服务器上装了RedHat Linux Enterprise AS 4,为了提高网络的可靠性配置双网卡绑定。
一、环境描述
我的RedHat Linux Enterprise AS 4安装双口的Intel千兆网卡,通过ifconfig -a命令看到eth0和eth1两张网卡。
二、双网卡绑定步骤:
2.1 修改/etc/sysconfig/network
XML基础语法
肆无忌惮_
xml
一、什么是XML?
XML全称是Extensible Markup Language,可扩展标记语言。很类似HTML。XML的目的是传输数据而非显示数据。XML的标签没有被预定义,你需要自行定义标签。XML被设计为具有自我描述性。是W3C的推荐标准。
二、为什么学习XML?
用来解决程序间数据传输的格式问题
做配置文件
充当小型数据库
三、XML与HTM
为网页添加自己喜欢的字体
知了ing
字体 秒表 css
@font-face {
font-family: miaobiao;//定义字体名字
font-style: normal;
font-weight: 400;
src: url('font/DS-DIGI-e.eot');//字体文件
}
使用:
<label style="font-size:18px;font-famil
redis范围查询应用-查找IP所在城市
矮蛋蛋
redis
原文地址:
http://www.tuicool.com/articles/BrURbqV
需求
根据IP找到对应的城市
原来的解决方案
oracle表(ip_country):
查询IP对应的城市:
1.把a.b.c.d这样格式的IP转为一个数字,例如为把210.21.224.34转为3524648994
2. select city from ip_
输入两个整数, 计算百分比
alleni123
java
public static String getPercent(int x, int total){
double result=(x*1.0)/(total*1.0);
System.out.println(result);
DecimalFormat df1=new DecimalFormat("0.0000%");
百合——————>怎么学习计算机语言
百合不是茶
java 移动开发
对于一个从没有接触过计算机语言的人来说,一上来就学面向对象,就算是心里上面接受的了,灵魂我觉得也应该是跟不上的,学不好是很正常的现象,计算机语言老师讲的再多,你在课堂上面跟着老师听的再多,我觉得你应该还是学不会的,最主要的原因是你根本没有想过该怎么来学习计算机编程语言,记得大一的时候金山网络公司在湖大招聘我们学校一个才来大学几天的被金山网络录取,一个刚到大学的就能够去和
linux下tomcat开机自启动
bijian1013
tomcat
方法一:
修改Tomcat/bin/startup.sh 为:
export JAVA_HOME=/home/java1.6.0_27
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export PATH=$JAVA_HOME/bin:$PATH
export CATALINA_H
spring aop实例
bijian1013
java spring AOP
1.AdviceMethods.java
package com.bijian.study.spring.aop.schema;
public class AdviceMethods {
public void preGreeting() {
System.out.println("--how are you!--");
}
}
2.beans.x
[Gson八]GsonBuilder序列化和反序列化选项enableComplexMapKeySerialization
bit1129
serialization
enableComplexMapKeySerialization配置项的含义
Gson在序列化Map时,默认情况下,是调用Key的toString方法得到它的JSON字符串的Key,对于简单类型和字符串类型,这没有问题,但是对于复杂数据对象,如果对象没有覆写toString方法,那么默认的toString方法将得到这个对象的Hash地址。
GsonBuilder用于
【Spark九十一】Spark Streaming整合Kafka一些值得关注的问题
bit1129
Stream
包括Spark Streaming在内的实时计算数据可靠性指的是三种级别:
1. At most once,数据最多只能接受一次,有可能接收不到
2. At least once, 数据至少接受一次,有可能重复接收
3. Exactly once 数据保证被处理并且只被处理一次,
具体的多读几遍http://spark.apache.org/docs/lates
shell脚本批量检测端口是否被占用脚本
ronin47
#!/bin/bash
cat ports |while read line
do#nc -z -w 10 $line
nc -z -w 2 $line 58422>/dev/null2>&1if[ $?-eq 0]then
echo $line:ok
else
echo $line:fail
fi
done
这里的ports 既可以是文件
java-2.设计包含min函数的栈
bylijinnan
java
具体思路参见:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/
import java.util.ArrayList;
import java.util.List;
public class MinStack {
//maybe we can use origin array rathe
Netty源码学习-ChannelHandler
bylijinnan
java netty
一般来说,“有状态”的ChannelHandler不应该是“共享”的,“无状态”的ChannelHandler则可“共享”
例如ObjectEncoder是“共享”的, 但 ObjectDecoder 不是
因为每一次调用decode方法时,可能数据未接收完全(incomplete),
它与上一次decode时接收到的数据“累计”起来才有可能是完整的数据,是“有状态”的
p
java生成随机数
cngolon
java
方法一:
/**
* 生成随机数
* @author cngolon@126.com
* @return
*/
public synchronized static String getChargeSequenceNum(String pre){
StringBuffer sequenceNum = new StringBuffer();
Date dateTime = new D
POI读写海量数据
ctrain
海量数据
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming
mysql 日期格式化date_format详细使用
daizj
mysql date_format 日期格式转换 日期格式化
日期转换函数的详细使用说明
DATE_FORMAT(date,format) Formats the date value according to the format string. The following specifiers may be used in the format string. The&n
一个程序员分享8年的开发经验
dcj3sjt126com
程序员
在中国有很多人都认为IT行为是吃青春饭的,如果过了30岁就很难有机会再发展下去!其实现实并不是这样子的,在下从事.NET及JAVA方面的开发的也有8年的时间了,在这里在下想凭借自己的亲身经历,与大家一起探讨一下。
明确入行的目的
很多人干IT这一行都冲着“收入高”这一点的,因为只要学会一点HTML, DIV+CSS,要做一个页面开发人员并不是一件难事,而且做一个页面开发人员更容
android欢迎界面淡入淡出效果
dcj3sjt126com
android
很多Android应用一开始都会有一个欢迎界面,淡入淡出效果也是用得非常多的,下面来实现一下。
主要代码如下:
package com.myaibang.activity;
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.CountDown
linux 复习笔记之常见压缩命令
eksliang
tar解压 linux系统常见压缩命令 linux压缩命令 tar压缩
转载请出自出处:http://eksliang.iteye.com/blog/2109693
linux中常见压缩文件的拓展名
*.gz gzip程序压缩的文件
*.bz2 bzip程序压缩的文件
*.tar tar程序打包的数据,没有经过压缩
*.tar.gz tar程序打包后,并经过gzip程序压缩
*.tar.bz2 tar程序打包后,并经过bzip程序压缩
*.zi
Android 应用程序发送shell命令
gqdy365
android
项目中需要直接在APP中通过发送shell指令来控制lcd灯,其实按理说应该是方案公司在调好lcd灯驱动之后直接通过service送接口上来给APP,APP调用就可以控制了,这是正规流程,但我们项目的方案商用的mtk方案,方案公司又没人会改,只调好了驱动,让应用程序自己实现灯的控制,这不蛋疼嘛!!!!
发就发吧!
一、关于shell指令:
我们知道,shell指令是Linux里面带的
java 无损读取文本文件
hw1287789687
读取文件 无损读取 读取文本文件 charset
java 如何无损读取文本文件呢?
以下是有损的
@Deprecated
public static String getFullContent(File file, String charset) {
BufferedReader reader = null;
if (!file.exists()) {
System.out.println("getFull
Firebase 相关文章索引
justjavac
firebase
Awesome Firebase
最近谷歌收购Firebase的新闻又将Firebase拉入了人们的视野,于是我做了这个 github 项目。
Firebase 是一个数据同步的云服务,不同于 Dropbox 的「文件」,Firebase 同步的是「数据」,服务对象是网站开发者,帮助他们开发具有「实时」(Real-Time)特性的应用。
开发者只需引用一个 API 库文件就可以使用标准 RE
C++学习重点
lx.asymmetric
C++ 笔记
1.c++面向对象的三个特性:封装性,继承性以及多态性。
2.标识符的命名规则:由字母和下划线开头,同时由字母、数字或下划线组成;不能与系统关键字重名。
3.c++语言常量包括整型常量、浮点型常量、布尔常量、字符型常量和字符串性常量。
4.运算符按其功能开以分为六类:算术运算符、位运算符、关系运算符、逻辑运算符、赋值运算符和条件运算符。
&n
java bean和xml相互转换
q821424508
java bean xml xml和bean转换 java bean和xml转换
这几天在做微信公众号
做的过程中想找个java bean转xml的工具,找了几个用着不知道是配置不好还是怎么回事,都会有一些问题,
然后脑子一热谢了一个javabean和xml的转换的工具里,自己用着还行,虽然有一些约束吧 ,
还是贴出来记录一下
顺便你提一下下,这个转换工具支持属性为集合、数组和非基本属性的对象。
packag
C 语言初级 位运算
1140566087
位运算 c
第十章 位运算 1、位运算对象只能是整形或字符型数据,在VC6.0中int型数据占4个字节 2、位运算符: 运算符 作用 ~ 按位求反 << 左移 >> 右移 & 按位与 ^ 按位异或 | 按位或 他们的优先级从高到低; 3、位运算符的运算功能: a、按位取反: ~01001101 = 101
14点睛Spring4.1-脚本编程
wiselyman
spring4
14.1 Scripting脚本编程
脚本语言和java这类静态的语言的主要区别是:脚本语言无需编译,源码直接可运行;
如果我们经常需要修改的某些代码,每一次我们至少要进行编译,打包,重新部署的操作,步骤相当麻烦;
如果我们的应用不允许重启,这在现实的情况中也是很常见的;
在spring中使用脚本编程给上述的应用场景提供了解决方案,即动态加载bean;
spring支持脚本