edyang

我干了什么 究竟拿了时间换了什么
技术分享时间线软件开发、设备接入、视觉与运维实践

MyBatis:分页不只是给 SQL 加 limit

翻到第二页出现重复记录,可能是排序不稳定,也可能是第一页之后数据发生变化。

翻到第二页出现重复记录,可能是排序不稳定,也可能是第一页之后数据发生变化。 本文使用MyBatis 3.2 系列、Java 7 与 JDBC 数据源,XML 为 Mapper 片段。MyBatis(SQL 映射框架)让查询显式可见,也要求开发者对参数、结果结构和执行成本负责。映射成功不代表查询满足权限与业务约束。 1. 从现象推到机制 分页必须有明确顺序,同值排序字段后面需要唯一键。深...

MyBatis:批处理执行、刷新和事务提交

批量接口返回了控制流,不代表每一行都已被数据库成功写入。

批量接口返回了控制流,不代表每一行都已被数据库成功写入。批执行需要检查真正刷新时的结果。 本文使用MyBatis 3.2 系列、Java 7 与 JDBC 数据源,XML 为 Mapper 片段。MyBatis(SQL 映射框架)让查询显式可见,也要求开发者对参数、结果结构和执行成本负责。映射成功不代表查询满足权限与业务约束。 1. 从现象推到机制 批处理执行器可能延后发送或汇集语句,...

MyBatis:一级缓存不等于全局实时数据

同一个查询在一个会话中重复执行,可能没有再次访问数据库。

同一个查询在一个会话中重复执行,可能没有再次访问数据库。缓存范围要与事务边界一起理解。 本文使用MyBatis 3.2 系列、Java 7 与 JDBC 数据源,XML 为 Mapper 片段。MyBatis(SQL 映射框架)让查询显式可见,也要求开发者对参数、结果结构和执行成本负责。映射成功不代表查询满足权限与业务约束。 1. 从现象推到机制 一级缓存通常属于 SqlSession...

MyBatis:联表结果的别名与 resultMap

两张表都有 id 和 name,联表后直接映射,容易让字段来源变得含糊。

两张表都有 id 和 name,联表后直接映射,容易让字段来源变得含糊。 本文使用MyBatis 3.2 系列、Java 7 与 JDBC 数据源,XML 为 Mapper 片段。MyBatis(SQL 映射框架)让查询显式可见,也要求开发者对参数、结果结构和执行成本负责。映射成功不代表查询满足权限与业务约束。 1. 从现象推到机制 结果列名是映射的输入接口。显式别名可以让订单编号与客...

MyBatis:动态 where 与空条件的业务风险

动态查询没有语法错误,却可能在条件为空时查出全表。

动态查询没有语法错误,却可能在条件为空时查出全表。语法拼接和业务范围需要分别控制。 本文使用MyBatis 3.2 系列、Java 7 与 JDBC 数据源,XML 为 Mapper 片段。MyBatis(SQL 映射框架)让查询显式可见,也要求开发者对参数、结果结构和执行成本负责。映射成功不代表查询满足权限与业务约束。 1. 从现象推到机制 where、if、trim 等标签帮助处理...

MyBatis:占位参数与字符串替换的边界

把用户输入直接拼入 SQL,即使页面限制了输入,也会把数据与语法混在一起。

把用户输入直接拼入 SQL,即使页面限制了输入,也会把数据与语法混在一起。 本文使用MyBatis 3.2 系列、Java 7 与 JDBC 数据源,XML 为 Mapper 片段。MyBatis(SQL 映射框架)让查询显式可见,也要求开发者对参数、结果结构和执行成本负责。映射成功不代表查询满足权限与业务约束。 1. 从现象推到机制 #{value} 通常通过预处理参数绑定值,${v...

Spring Boot 测试:不要每个规则都启动整个容器

业务判断很简单,却每次都启动完整应用,反馈速度会被环境成本拖慢。

业务判断很简单,却每次都启动完整应用,反馈速度会被环境成本拖慢。测试需要按边界选择层级。 本文使用JDK 7、Maven 与 Spring Boot 1.2.2.RELEASE,代码为工程片段。Spring Boot(约定化应用框架)减少常见装配代码,但自动配置仍有条件和来源。本文使用一代框架的属性与接口,不混入后续版本的配置名称。 1. 从现象推到机制 纯规则适合普通单元测试,组件装...

Linux后台进程管理利器:supervisor

小计安装过程

Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。 supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。 安装supervisor Debian /...

Spring Boot 部署:可执行 jar 与外部配置

可执行 jar 简化交付,但部署仍需要明确运行身份、工作目录、配置来源和日志位置。

可执行 jar 简化交付,但部署仍需要明确运行身份、工作目录、配置来源和日志位置。 本文使用JDK 7、Maven 与 Spring Boot 1.2.2.RELEASE,代码为工程片段。Spring Boot(约定化应用框架)减少常见装配代码,但自动配置仍有条件和来源。本文使用一代框架的属性与接口,不混入后续版本的配置名称。 1. 从现象推到机制 重新打包的 jar 包含启动器与依赖...

Spring Boot:把零散配置收敛成有类型的对象

配置散落在多个字符串读取语句中,字段拼错和单位不一致都难以及时发现。

配置散落在多个字符串读取语句中,字段拼错和单位不一致都难以及时发现。 本文使用JDK 7、Maven 与 Spring Boot 1.2.2.RELEASE,代码为工程片段。Spring Boot(约定化应用框架)减少常见装配代码,但自动配置仍有条件和来源。本文使用一代框架的属性与接口,不混入后续版本的配置名称。 1. 从现象推到机制 ConfigurationProperties(配...