关系型数据库存储树形结构

一般比较普遍的就是四种方法:(具体见 SQL Anti-patterns这本书)

  • 邻接表(Adjacency List):每一条记录存parent_id,设计实现简单,但是查询子树复杂。
  • 枚举路径(Path Enumerations):每一条记录存整个tree path经过的node枚举,增删改查都较简单,查需要使用like,不能无限扩展。
  • 嵌套表(Nested Sets):每一条记录存 nleft 和 nright,不直观,设计实现都非常复杂。
  • 闭包表(Closure Table):维护一个表,所有的tree path作为记录进行保存。比较折中的一种设计。

四种方法比较

Read More

恢复七牛云过期域名图片并用Github Pages替换

有很长时间没有更新博客了,五一抽空打理了一下博客,更新了一些主题插件还有文章。之前七牛的临时域名很早就过期,刚开始图片还是可以显示的,也不知道从什么时候开始就不能显示,应该有挺长时间了,这次也解决了一下这个问题。如果要继续使用七牛就得绑定域名,但是去弄域名还得备案什么的,挺麻烦的,嫌麻烦那就得换一个图床了,最好还是免费的,看了一些介绍,最后还是决定就放GitHub好了,跟博客放一块也好管理。

Read More

MyBatis 类型处理器

问题描述

最近测试将 MyBatis 从 3.1.1 升级到 3.2.3 时遇到一个问题。原来可以正常工作的枚举类型处理器,抛异常了。

1
Caused by: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'member_type' from result set.  Cause: java.lang.IllegalArgumentException: No enum code 'MERCHANT'. class com...ChangeSceneType

涉及的代码及配置信息如下:

Read More

Git 内幕

基础

对待数据的方式

几乎所有版本控制工具都是记录与初始文件的差异,而 Git 是记录快照,每次提交更新时,就是当前工作目录下的所有文件的完整数据,而不是差异,当然如果提交时,文件没有被修改,不再重新存储该文件,而是指向上次存储的文件。

假设提交了5次,对于工作目录的文件A,在第三和第五次提交时有修改

1
2
3
4
# 其他版本控制
A (v1) -------------->1 (v3) --------------->2 (v5)
# Git
A (v1) ---> A (v2) ---> A1 (v3) ---> A1 (v4) ---> A2 (v5)

Read More

Hexo日历插件

如果你在使用 Hexo 并且你在寻找一款 Hexo 下可用的日历插件,你还希望这款日历插件能像博客园或者WordPress的日历小工具一样,如果某天有文章,日期就会显示为文章链接,那么本文介绍的这个插件就是你所需要的。

实际上之前在 Landscape-F 主题中已经实现过一个日历插件(hexo-calendar)了,只不过当时这个插件很挫,打开一篇文章时,日历中才能显示文章链接,而且只能显示文章发表当月的文章的链接,你要查看其他月的日历时,就算有文章也不会在日历中显示,因为当时的做法是在生成页面直接在页面的日历中嵌入文章当月所有文章的链接,是完全静态的。现在我重新实现了日历插件(hexo-generator-calendar),很简单,就是在Hexo generator的时候,把所有文章的标题、链接、发布时间信息以json格式存入文件中,然后在前端用ajax方法请求日历数据,解析并生成日历表格。下面简单介绍下这个插件的安装和使用。

Read More

AES加密时报java.security.InvalidKeyException Illegal key size

Contents

使用 AES 加密时,密钥大于128bit的话会抛出java.security.InvalidKeyException异常。因为密钥长度是受限的,根据网上一些博客中说的,这种限制是因为美国对软件出口的控制。解决办法很简单,下载对应版本的jce包,解压并覆盖 ${JAVA_HOME}/jre/lib/security/ 下的同名文件即可。

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download

JavaScript 面向对象程序设计、函数表达式和异步编程

JavaScript 基本语法JavaScript 引用类型JavaScript 面向对象程序设计、函数表达式和异步编程三篇笔记是对《JavaScript 高级程序设计》和 《ECMAScript 6入门》两本书的总结整理。

面向对象程序设计

ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样(以及其他将要讨论的原因),我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数

Read More

JavaScript 引用类型

JavaScript 基本语法JavaScript 引用类型JavaScript 面向对象程序设计、函数表达式和异步编程三篇笔记是对《JavaScript 高级程序设计》和 《ECMAScript 6入门》两本书的总结整理。

引用类型

引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。尽管 ECMAScript从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。

Read More

JavaScript 基本语法

JavaScript 基本语法JavaScript 引用类型JavaScript 面向对象程序设计、函数表达式和异步编程三篇笔记是对《JavaScript 高级程序设计》和 《ECMAScript 6入门》两本书的总结整理。

简介

一个完整的JavaScript实现应该由三个不同的部分组成:核心(ECMAScript)、文档对象模型(DOM)、浏览器对象模型(BOM)

JavaScript实现了ECMAScript,Adobe ActionScript同样也实现了ECMAScript。

Read More