实体不同类型拥有不同属性的数据库设计
背景
以最常见的电商系统作为例子,电商系统中有商品这样的实体。在数据库设计中,通常我们会使用一个商品表来表示商品实体,但不同类型的商品拥有不同的属性,导致商品表的字段设计成为一个问题。与此同时,前端页面在开发商品表单时,由于商品属性是不确定的,无法预先定义好要显示的表单项,各表单项的显示名称、属性名以及表单控件需要由后端提供该商品类型的模式数据来确定
需求案例
我们通过一个简单的需求案例来说明各种可能的设计方案
同样以电商系统中的商品为例,假设有两类商品,分别为饮料和图书。两类商品都有名称这个属性,饮料另有包装属性,而图书另有页数属性
设计方案
固定大宽表
商品表中预留足够的备用属性,备用属性的含义根据商品类型的不同而改变
商品类型表t_type
...
遍历HashMap最佳实践
代码实例
使用EntrySet的Iterator遍历HashMap能具有最佳性能,且在遍历过程中能安全删除元素
@Test
void testMapIterator() {
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.has...
Java字符串常量池
字符串常量池的位置
JDK 6及之前,字符串常量池位于方法区
JDK 7及之后,字符串常量池位于堆空间
字符串常量池常量的来源
class文件的静态常量池,主要包含文本字面量和被final修饰的字符串常量
运行时通过String类的intern方法动态添加
字符串常量池数据结构
字符串常量池底层为一个定长的Hashtable,管理的是字符串的引用。字符串的对象本身一定在堆空间。
intern方法
调用intern方法,会判断常量池引用指向的对象里面有没有与当前字符串值相等的对象。如果有,则返回常量池相应的引用。如果没有,则将当前字符串的引用放入常量池,并返回。
字符串常量池的一些例子
字面量在类加载时进入常量池
String s1 = "He...
Java中String类的+运算符重载
String的运算符重载
String中的+和+=是Java中仅有的两个重载运算符
String s = "a" + "b" + "c";
上面代码块相当于
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("a");
stringBuilder.append("b");
stringBuilder.append("c");
String s = stringBuilder.toString();
每次使用+或+=运算符,都会创建一个StringBuilder对象,因此要注意不要在for循环内部使用,否则可能会创建过多的StringBuilder对象,降低性能
Java对象的hashCode与equals方法重写原则
唯一原则
equals方法判断为true,则hashCode方法返回的哈希值也必须相等
逆否命题
hashCode方法返回的哈希值不相等,则equals方法必须判断为false
推论
hashCode方法返回的哈希值相等,无法判断equals方法的返回结果
equals方法判断为false,无法判断hashCode方法返回的哈希值是否相等
Oracle获取日期
SQL例子
获取当前日期
update t_project_app set proctm = sysdate where py_project_type = 2;
获取指定日期
update t_project_app set proctm = to_date('2016-05-26','yyyy-mm-dd') where py_project_type = 2;
日期转换字符串,可用to_char函数
332 post articles, 34 pages.