表的主键应当不具有任何业务含义

表的主键应当不具有任何业务含义 http://blog.sina.com.cn/s/blog_8020e4110101befz.html 表的主键应当不具有任何业务含义 (2012-12-17 15:10:36)转载▼ 标签: it 分类: DB/SQL 表的主键应当不具有任何业务含义 表通过主键来保证每条记录的唯一性,表的主键应当不具有任何业务含义,因为任何有业务含义的列都有改变的可能性。关系数据库学的最重要的一个理论就是: 不要给关键字赋予任何业务意义。假如关键字具有了业务意义,当用户决定改变业务含义,也许他们想要为关键字增加几位数字或把数字改为字母,那么就必须修改相关的关键字。一个表中的主关键字有可能被其他表作为外键。就算是一个简单的改变,譬如在客户号码上增加一位数字,也可能会造成极大的维护上的开销。 为了使表的主键不具有任何业务含义,一种解决方法是使用代理主键,例如为表定义一个不具有任何业务含义的ID字段 (也可以叫其他的名字) ,专门作为表的主键。 ——孙卫琴《精通Hibernate: Java对象持久化技术详解 本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/jackie_lee/archive/2006/08/01/1007948.aspx ======================================= 昨天令狐因为处理动网论坛的数据库时,发现它是用帖子号来作为主键,由于无意中对它作了一些修改,导致帖子的关联变得混乱了。于是我们讨论了一下数据库表中主键的选择问题。因为对动网论坛的程序不熟,所以我也不知道它是怎么设计实现的,今天令狐把JavaEye上的一个关于这个方面的话题拿来讨论就好办了。 我起初也觉得用一个无意义的逻辑主键是一个好办法,至少说用一个字段就可以唯确定一条记录,使用上会很方便,速度应该也会快些。但是看了JavaEye那个帖里的讨论,以及在QQ群里的讨论后,我发现不完全是这样的。 其实这是两种不同的设计思路,谈不上用逻辑主键一定比用业务主键好。 用业务主键是传统的C/S应用开发的思路,包括我现在用的SAP里,也大量使用业务主键。但如果用O/R Mapping,则可能用逻辑主键好一些。 因 为对于传统C/S应用来说,以典型的两层结构看,前端处理的是一个数据表示的工作,后端处理的是一个数据持久化的工作。业务逻辑分散在两端,特别是在后 端。因为需要在后端通过Stored Procedure和View等来实现业务逻辑,应用直接与关系数据库打交道,所以数据的记录不但要求便于程序访问,对开发者来说,还要易读。也就是说需 要数据库的关系逻辑能够清晰地表达出业务逻辑来。主键采用业务主键是自然甚至是必须的。 而ORM应用恰恰相反。它需要一个最简单的 办法来标记一条唯一记录,但不需要有具体的意义,就像在OOP中,我们访问一个Object总是通过指针 (或相似的引用) ,但我们并不需要知道这个指针具 体的值是0x89ABCDEF还是0xFEDCBA98。逻辑主键就相当于一个指针,当别的关联表引用到这条记录时,用一个外键字段记录了这个逻辑主键, 就相当于那个Object中有一个属性记录了一个指向这个Object的指针。这时如果用业务主键-特别是复合业务主键-就是存心给自己打麻烦了。最 糟糕的情况就是当需要修改这个业务主键的值的时候,会导致所有的关联发生混乱-在传统C/S应用中,我们是用Trigger来解决这个问题,但是在 ORM中不可能这样做,否则那还要ORM干什么? 当然,对于开发者来说,在ORM这样的情况下,用逻辑主键存在一个至关重要的问题 就在于数据的可读性将要变差。也就是说,除非通过OO的视角来看数据才是易于理解的。但如果直接进入后端看关系数据库,将变得困难。因此,基本上,逻辑主 键与ORM是相辅相成的,缺一不可,并且采用ORM的开发者要尽可能避免与后端的关系数据打交道,否则就会非常的痛苦。 正如令狐所作的总结: 一个是从OO角度看,一个是直接深入数据库内部看。 关于数据库表应该采用逻辑主键还是业务主键的讨论 ============================= 数据库主键不应该具有任何业务意义 关系数据库学的最重要的一个理论是: 不要给关键字赋予任何业余意义。假如关键字具有了业务意义,当用户决定业务含义,也许他们想要为关键字增加几位数字或者把数字改为字母,那么就必须修改相关的关键字。一个表中的主关键字有可能被其他表做为外键。就算是一个简单的改变,也可能会造成极大的维护上的开销。 为了使表的主键不具有任何业务意义,一种解决办法是使用代理主键,例如为表定义一个不具有任何业务含义的ID字段 (也可以叫其他名字) ,专门做为表的主键。 我回顾我以前设计的很多数据库,都在某些地方没有考虑周到,即使大部分的主键都没有业务意义,还是会有某些表的主键和业务联系起来。因为我一直认为,主键是用来保持唯一性的,之所以要有代理主键,是因为有一些记录的内容没办法保持唯一性。例如设计一个用户表,用户的名字有可能重复,这个人可能叫blue,那么人也可能叫blue。这样就需要一个ID来分清。 由于我之前的想法,导致我数据库设计上的一些错误。例如我曾经在一次数据库设计中使用一个ID来做为一个表的主键,该表是记录一些报表的。每个报表上都有一个ID,这个ID是具有业务意义的,是可以让客户输入,也可以自动生成的,但是客户说明这个ID是唯一的,是数字类型。因此由于它的唯一性,我在数据库中设计这个ID为数字类型的。但是到了后来客户要求使用文字类型的,例如原来的是"111111",他要求可以写成"11111A",“11111B”。这个时候由于这个ID做了很多表的外键,就会产生很多维护上面的麻烦。即使在数据库表之间做了级联更新和级联删除,修改数据类型还是很麻烦的事情。 这次RFID项目数据库设计我原来想使用RFID标签的ID做为产品的主键,因为RFID标签ID具有唯一性,使用它作为主键在查找的时候速度应该会快些。但是后来发现问题并不是这么简单。如果使用RFID标签ID做为主键,那么就具有了业务意义。当产品表和其他表关联,产品表的主键做为其他表的外键的时候,如果出现一些业务上的情况,例如RFID标签坏了,要更换,就会产生更改主键内容的问题了。 回顾一下,还是发现自己的基础不扎实。学习数据库的时候都不去上课。少年不努力,老大徒悲伤。 ==================================== 数据库中主键和外键的设计原则 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。 主键: 关系数据库依赖于主键-它是数据库物理模式的基石。主键在物理层面上只有两个用途: 惟一地标识一行。 作为一个可以被外键有效引用的对象。 基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则: 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 主键应该是单列的,以便提高连接和筛选操作的效率。 注: 使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是: 复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。 注: 这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。 ...

2014-05-28 · 1 min · 83 words · -

mybatis 动态 sql

mybatis 动态 sql <update id="updateAuthorIfNecessary"> update Author <set> <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#{bio}</if> </set> where id=#{id} </update> http://mybatis.github.io/mybatis-3/zh/dynamic-sql.html

2014-05-27 · 1 min · 29 words · -

Meson

Meson 一、什么是Meson Meson(The Meson Build System)是个项目构建系统,如Makefile,automake,CMake…。Meson是一个Python实现的开源项目,其思想是,开发人员花费在构建调试上的每一秒都是浪费,同样等待构建过程直到真正开始编译都是不值得的。 因此,Meson的设计目的是在用户友好的同时不损害性能,Meson提供客户语言(custom language)作为主要工具,用户可以使用它完成项目构建的描述。客户语言的设计目标是简单(simplicity)、清晰(clarity)、简洁(conciseness),其中很多灵感来源于Python语言。 Meson的另个一主要设计目的是为现代编程工具提供优秀的支持和最好的实现。这包括一些特性如:单元测试(unit testing)、代码覆盖率报告(code coverage reporting)、头文件预编译(precompiled headers)。用户不需要寻找三方宏指令(third party macros)或编写shell脚本来实现这些特性,Meson只要开箱即用(work out of the box)。 二、Meson有什么特点 对Linux,macOS,Windows,GCC,Clang,Visual Studio等提供多平台支持 支持的语言包括C,C ++,D,Fortran,Java,Rust 在非常易读且用户友好的非图灵完整DSL中构建定义 适用于许多操作系统和裸机的交叉编译 针对极快的完整和增量构建进行了优化,而不会牺牲正确性 内置的多平台依赖提供程序,可与发行版软件包一起使用 好玩! ———————————————— 版权声明:本文为CSDN博主「espresso_yu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u010074726/article/details/108695256

2014-05-26 · 1 min · 34 words · -

Java写xml文件的编码问题

Java写xml文件的编码问题 http://itindex.net/detail/49012-java-xml-%E6%96%87%E4%BB%B6 最近项目中需要生成xml格式的配置文件,用的是 javax.xml.transform.Transformer 类中提供的transform方法,在本地执行没问题,但是一旦把工程部署到Tomcat下运行,就会出现中文乱码的现象,纠结了许久,在大神的帮助下终于解决了。 有篇文章其实已经讲的很清楚了,链接如下: http://www.cnblogs.com/yunmou/archive/2013/02/19/2917646.html 但是按照他给的方法还是不行,问题就出在 OutputStreamWriter osw = new OutputStreamWriter(fos); // 注意。。。 这一行,作者虽然加了注意,但没说明怎么办,让我更加迷惑。 最后查了若干资料,发现确实是需要在这个地方进行注意。 最终代码如下: Source source = new DOMSource((Document) obj); // Create a new Transformer that performs a copy of the Source to the Result. TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transFormer = transFactory.newTransformer(); transFormer.setOutputProperty(OutputKeys.ENCODING, “UTF-8”); transFormer.setOutputProperty(OutputKeys.METHOD, “xml”); transFormer.setOutputProperty(OutputKeys.INDENT, “no”); OutputStreamWriter outputStreamWriter = new OutputStreamWriter( new FileOutputStream(path), “UTF-8”); Result xmlResult = new StreamResult(outputStreamWriter); // Transform the XML Source to a Result. ...

2014-05-26 · 1 min · 77 words · -

java 自定义异常, customized exception

java 自定义异常, customized exception 编写自定义异常类的模式 编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。常用的编写自定义异常类的模式如下: public class CustomException extends Exception { //或者继承任何标准异常类 public CustomException() {} //用来创建无参数对象 public CustomException(String message) { //用来创建指定参数对象 super(message); //调用超类构造器 } } 当然也可选用Throwable作为超类。其中无参数构造器为创建缺省参数对象提供了方便。第二个构造器将在创建这个异常对象时提供描述这个异常信息的字符串,通过调用超类构造器向上传递给超类,对超类中的toString()方法中返回的原有信息进行覆盖。 来讨论一个具体例子。假设程序中需要验证用户输入的表示年龄的数据必须是正整数值。我们可以按照以上模式编写这个自定义异常类如下: public class NegativeAgeException extends Exception { //或者: extends Throwable public NegativeAgeException() {} public NegativeAgeException(String message) { super(message); } } 下面是应用这个自定义异常类的例子: //完整程序存在本书配套资源目录为Ch11中名为NegativeAgeExceptionTest.java … try{ String ageString = JOptionPane.showInputDialog(“Enter your age: “); if (Integer.parseInt(ageString) < 0) throw new NegativeAgeException(“Please enter a positive age”); else JOptionPane.showMessageDialog(null, ageString, “Age”, 1); } catch(NegativeAgeException e){ ...

2014-05-22 · 1 min · 172 words · -

JPA EntityManager——persist,merge,refresh和remove

JPA EntityManager——persist,merge,refresh和remove public void persist(Object entity) persist 方法可以将实例转换为 managed( 托管 ) 状态。在调用 flush() 方法或提交事物后,实例将会被插入到数据库中。 对不同状态下的实例 A , persist 会产生以下操作 : 如果 A 是一个 new 状态的实体,它将会转为 managed 状态; 如果 A 是一个 managed 状态的实体,它的状态不会发生任何改变。但是系统仍会在数据库执行 INSERT 操作; 如果 A 是一个 removed( 删除 ) 状态的实体,它将会转换为受控状态; 如果 A 是一个 detached( 分离 ) 状态的实体,该方法会抛出 IllegalArgumentException 异常,具体异常根据不同的 JPA 实现有关。 public void merge(Object entity) merge 方法的主要作用是将用户对一个 detached 状态实体的修改进行归档,归档后将产生一个新的 managed 状态对象。 对不同状态下的实例 A , merge 会产生以下操作 : 如果 A 是一个 detached 状态的实体,该方法会将 A 的修改提交到数据库,并返回一个新的 managed 状态的实例 A2 ; ...

2014-05-22 · 1 min · 183 words · -

JPA

JPA (1) 、JPA介绍: JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。 为什么要使用JAP? 在说为什么要使用JPA之前,我们有必要了解为什么要使用ORM技术。 ORM 是Object-Relation-Mapping,即对象关系影射技术,是对象持久化的核心。ORM是对JDBC的封装,从而解决了JDBC的各种存在问题: a) 繁琐的代码问题 用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。例如: PreparedStatement pstmt=con.prepareStatment(“insert into account value(?,?,?,?,?,?,?,?,?)”); ORM则建立了Java对象与数据库对象之间的影射关系,程序员不需要编写复杂的SQL语句,直接操作Java对象即可,从而大大降低了代码量,也使程序员更加专注于业务逻辑的实现。 b) 数据库对象连接问题 关系数据对象之间,存在各种关系,包括1对1、1对多、多对1、多对多、级联等。在数据库对象更新的时候,采用JDBC编程,必须十分小心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很费时费力的过程。 ORM建立Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系创建Java对象的关系,并且提供了维持这些关系完整、有效的机制。 c) 系统架构问题 JDBC属于数据访问层,但是使用JDBC编程时,必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创建了什么索引等等与后台数据库相关的详细信息。 使用ORM技术,可以将数据库层完全隐蔽,呈献给程序员的只有Java的对象,程序员只需要根据业务逻辑的需要调用Java对象的Getter和 Setter方法,即可实现对后台数据库的操作,程序员不必知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。 d) 性能问题 采用JDBC编程,在很多时候存在效率低下的问题。 pstmt =conn.prepareStatement(“insert into user_info values(?,?)”); for (int i=0; i<1000; i++) { pstmt.setInt(1,i); pstmt.setString(2,“User”+i.toString()); pstmt.executeUpdate(); } 以上程序将向后台数据库发送1000次SQL语句执行请求,运行效率较低。 采用ORM技术,ORM框架将根据具体数据库操作需要,会自动延迟向后台数据库发送SQL请求,ORM也可以根据实际情况,将数据库访问操作合成,尽量减少不必要的数据库操作请求。 JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势: 1 标准化 JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。 2 对容器级特性的支持 JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。 3 简单易用,集成方便 ...

2014-05-22 · 1 min · 144 words · -

在web.xml中classpath和classpath*的区别

‘在web.xml中classpath和classpath*的区别’ 写spring的代码到现在,一直都很习惯性的拷贝web.xml中的内容,没怎么在意里面的内容,最近认真研究了下,很多东西都不是很理解,特别是classpath和classpath*的区别,研究了许久才搞明白,记录下备忘。 classpath 和 classpath* 区别: classpath: 只会到你指定的class路径中查找找文件; classpath*: 不仅包含class路径,还包括jar文件中(class路径)进行查找. 举个简单的例子,在我的web.xml中是这么定义的: classpath*:META-INF/spring/application-context.xml 那么在META-INF/spring这个文件夹底下的所有application-context.xml都会被加载到上下文中,这些包括META-INF/spring文件夹底下的 application-context.xml,META-INF/spring的子文件夹的application-context.xml以及jar中的application-context.xml。 如果我在web.xml中定义的是: classpath:META-INF/spring/application-context.xml 那么只有META-INF/spring底下的application-context.xml会被加载到上下文中。

2014-05-21 · 1 min · 17 words · -

DB 事务

DB 事务 事务(Transaction): 是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,sql server 能将逻辑相关的一组操作绑定在一起,以便服务器 保持数据的完整性。事务通常是以begin transaction开始,以commit或rollback结束。Commint表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据的更新写回到磁盘上的物理数据库中去,事务正常结束。Rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态。 1、事务的特性 (ACID): 原一隔持 原子性 (Atomic) : 即事务是不可分割的最小工作单元,事务内的操作,要么全部执行,要么全部不执行。 一致性 (Consistency) : 事务在完成时,必须是所有的数据都保持一致状态。 在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏;如银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致 (不正确) 的状态。 隔离性 (Isolation) : 一个事务的执行不能被其他事务所影响。 并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性; 事务必须是互相隔离的,防止并发读写同一个数据的情况发生 。 持久性 (Durable) : 一个事务一旦提交,事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。 事务类型 数据库事务类型有本地事务和分布式事务: 本地事务: 就是普通事务,能保证单台数据库上的操作的ACID,被限定在一台数据库上; 分布式事务: 涉及两个或多个数据库源的事务,即跨越多台同类或异类数据库的事务 (由每台数据库的本地事务组成的) ,分布式事务旨在保证这些本地事务的所有操作的ACID,使事务可以跨越多台数据库; Java事务类型有JDBC事务和JTA事务: JDBC事务: 就是数据库事务类型中的本地事务,通过Connection对象的控制来管理事务; JTA事务: JTA指Java事务API(Java Transaction API),是Java EE数据库事务规范, JTA只提供了事务管理接口,由应用程序服务器厂商 (如WebSphere Application Server) 提供实现,JTA事务比JDBC更强大,支持分布式事务。 Java EE事务类型有本地事务和全局事务: 本地事务: 使用JDBC编程实现事务; 全局事务: 由应用程序服务器提供,使用JTA事务; 按是否通过编程实现事务有声明式事务和编程式事务; 声明式事务: 通过注解或XML配置文件指定事务信息; 编程式事务: 通过编写代码实现事务。 隐式事务: 当连接以隐式事务模式进行操作时,sql server数据库引擎实例将在提交或回滚当前事务后自动启动新事务。无须描述事物的开始,只需提交或回滚每个事务。但每个事务仍以commit或rollback显式结束。连接将隐性事务模式设置为打开之后,当数据库引擎实例首次执行下列任何语句时,都会自动启动一个隐式事务: alter table,insert,create,open ,delete,revoke ,drop,select, fetch ,truncate table,grant,update在发出commit或rollback语句之前,该事务将一直保持有效。在第一个事务被提交或回滚之后,下次当连接执行以上任何语句时,数据库引擎实例都将自动启动一个新事务。该实例将不断地生成隐性事务链,直到隐性事务模式关闭为止。 ...

2014-05-21 · 5 min · 898 words · -

MySQL "ON DUPLICATE KEY UPDATE"

MySQL “ON DUPLICATE KEY UPDATE” 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1; UPDATE TABLE SET c=c+1 WHERE a=1; 如果行作为新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2。 这个语法还可以这样用: 如果INSERT多行记录(假设 a 为主键或 a 是一个 UNIQUE索引列): 1.INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=c+1; 执行后, c 的值会变为 4 (第二条与第一条重复, c 在原值上+1). 2.INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=VALUES(c); ...

2014-05-21 · 1 min · 85 words · -

maven setting, mirror, repository

maven setting, mirror, repository maven mirror, repository mirror和 repository 1 Repository (仓库) 1.1 Maven仓库主要有2种: remote repository: 相当于公共的仓库,大家都能访问到,一般可以用URL的形式访问 local repository: 存放在本地磁盘的一个文件夹,例如,windows上默认是C:\Users\{用户名}.m2\repository目录 1.2 Remote Repository主要有3种: 中央仓库: http://repo1.maven.org/maven2/ 私服: 内网自建的maven repository,其URL是一个内部网址 其他公共仓库: 其他可以互联网公共访问maven repository,例如 jboss repository等 repository里存放的都是各种jar包和maven插件。当向仓库请求插件或依赖的时候,会先检查local repository,如果local repository有则直接返回,否则会向remote repository请求,并缓存到local repository。也可以把做的东西放到本地仓库,仅供本地使用;或上传到远程仓库,供大家使用。 2 Mirror mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。 2.1 没有配置mirror: 2.2 配置mirror: 此时,B Repository被称为A Repository的镜像。 如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都胡够从它的镜像中获取。 2.3 标签里面放置的是要被镜像的Repository ID。为了满足一些复杂的需求,Maven还支持更高级的镜像配置: ...

2014-05-18 · 2 min · 217 words · -

java version

java version Java class file format major version numbers Java 1.2 uses major version 46 Java 1.3 uses major version 47 Java 1.4 uses major version 48 Java 5 uses major version 49 Java 6 uses major version 50 Java 7 uses major version 51 Java 8 uses major version 52 Java 9 uses major version 53 Java 10 uses major version 54 Java 11 uses major version 55 Java 12 uses major version 56 Java 13 uses major version 57 Java 14 uses major version 58 Java 15 uses major version 59 Java 16 uses major version 60 Java 17 uses major version 61

2014-05-13 · 1 min · 105 words · -

instanceof

instanceof Java中的instanceof关键字是一个二元操作符,和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子: String s = "I AM an Object!"; boolean isObject = s instanceof Object; 我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。 instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类: public class Bill {//省略细节} public class PhoneBill extends Bill {//省略细节} public class GasBill extends Bill {//省略细节} 在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断: public double calculate(Bill bill) { if (bill instanceof PhoneBill) { //计算电话账单 } if (bill instanceof GasBill) { //计算燃气账单 } … } 这样就可以用一个方法处理两种子类。 然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了: public double calculate(PhoneBill bill) { //计算电话账单 } public double calculate(GasBill bill) { //计算燃气账单 } 所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。 http://rodney.cnblogs.com/archive/2005/08/18/instanceof.html instanceof 判断对象类型 当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型之前需要养成一个良好习惯,就是判断父类对象是否为子类对象的实例。这个判断通常使用instanceof操作符来完成。可以使用instanceof操作符判断是否一个类实现了某个接口 (接口会在10.6节中进行介绍) ,也可以用它来判断一个实例对象是否属于一个类。 instanceof的语法格式如下: myobject instanceof ExampleClass ...

2014-05-09 · 1 min · 154 words · -

Thank you very much & Thanks a lot

‘Thank you very much & Thanks a lot’ Thank you is more formal than thanks.Thanks a bunch is extremely informal.

2014-05-09 · 1 min · 20 words · -

spring mvc annotation

spring mvc annotation 参数处理 (明确指定参数 匹配 自动转换类型) 普通属性和对象及属性: @RequestParam(“id”)注解,所以它将和id的URL参数绑定 @RequestBody 将HTTP请求正文转换为适合的HttpMessageConverter对象。 @ResponseBody 将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流。 @PathVariable @PathVariable是用来对指定请求的URL路径里面的变量 eg: Java代码 <img class="star" src="http://yeak2001.iteye.com/images/icon_star.png" alt="收藏代码" /> "form/{id}/apply", method = {RequestMethod.PUT, RequestMethod.POST}) @PathVariable和@RequestParam的区别就在于: @RequestParam用来获得静态的URL请求入参 、 @PathVariable 当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。 示例代码: ```java``` http://blog.csdn.net/walkerjong/article/details/7946109# @Controller "/owners/{ownerId}") class RelativePathUriTemplateController { "/pets/{petId}") @PathVariable String petId, Model model) { // implementation omitted } } 上面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable("name")指定uri template中的名称。 http://blog.csdn.net/zshake/article/details/9716849 http://yeak2001.iteye.com/blog/465336 http://blog.sina.com.cn/s/blog_72827fb10101pl9j.html

2014-05-07 · 1 min · 70 words · -

MyBatis_当实体属性与表字段名不一致

MyBatis_当实体属性与表字段名不一致 http://m.blog.csdn.net/blog/wuqinfei_cs/12873135 映射 /*

2014-05-07 · 1 min · 4 words · -

MySQL 日志 log

MySQL 日志 log https://mariadb.com/kb/en/mariadb/general-query-log/ 查询日志: 编辑/etc/MySQL/my.cnf, 在[MySQLd]段下添加以下三行并重启MySQL(MySQL用户写权限) general-log=1 general-log-file=/data/logs/MySQL/MySQL.log log-output=file 查看配置: SHOW GLOBAL VARIABLES LIKE '%log%'; MySQL日志: 主要包含: 错误日志、查询日志、慢查询日志、事务日志、二进制日志; 日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化;也就是说用来记录MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。 错误日志 在MySQL数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在MySQL数据库的数据文件中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。 错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息: 服务器启动和关闭过程中的信息 (未必是错误信息,如MySQL如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等) 、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。 下面我们来定义MySQL错误日志的功能: 一般而言,日志级别的定义没有回话变量都只是在全局级别下进行定义。 MySQL> SHOW GLOBAL VARIABLES LIKE ‘%log%’; +————–+————+ | Variable_name | Value | +————–+————+ | back_log | 50 | | binlog_cache_size | 32768 | | binlog_direct_non_transactional_updates | OFF | | binlog_format | MIXED | | binlog_stmt_cache_size | 32768 | | expire_logs_days | 0 | | general_log | OFF | | general_log_file | /mydata/data/stu18.log | ...

2014-05-07 · 10 min · 2093 words · -

MySQL中的datetime与timestamp

MySQL中的datetime与timestamp 相同 显示 TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。 不同 范围 datetime 以’YYYY-MM-DD HH:MM:SS’格式检索和显示DATETIME值。支持的范围为'1000-01-01 00:00:00’到'9999-12-31 23:59:59’TIMESTAMP值不能早于1970或晚于2037 储存 TIMESTAMP 1.4个字节储存 (Time stamp value is stored in 4 bytes) 2.值以UTC格式保存 ( it stores the number of milliseconds) 3.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。 datetime 1.8个字节储存 (8 bytes storage) 2.实际格式储存 (Just stores what you have stored and retrieves the same thing which you have stored.) 3.与时区无关 (It has nothing to deal with the TIMEZONE and Conversion.) 实例对比 现在我来做个时区对他们的影响。 1.先插入一个数据insert into `t8` values(now(), now()); ...

2014-05-07 · 1 min · 128 words · -

spring mvc + mybatis

spring mvc + mybatis

2014-05-06 · 1 min · 4 words · -

命令行 创建多模块的Maven项目(父模块,子模块)

命令行 创建多模块的Maven项目(父模块,子模块) 我们都知道,我们常常将一个复杂的java应用拆分成多个java子应用。由于maven的出现,这种拆分就更加容易了,因为我们通过maven可以创建多个关联模块的项目 (Multiple Module Projects) 。由一个总的模块,下面包含多个子模块 (子模块还可以包含子模块) 。 一、通过在Maven命令行创建。 创建父模块 (总的POM) - cms-validator 使用命令mvn archetype:create -DgroupId=com.ebay.tools.cms.validator -DartifactId=cms-validator 创建一个maven项目,然后修改该项目的pom.xml文件,将package类型改为pom pom 并删除其中的src目录。 cd cms-validator 创建提供rest service的子模块: validator-rest 在父模块的目录下, 使用命令mvn archetype:create -DgroupId=com.ebay.tools.cms.validator.rest -DartifactId=validator-rest 创建一个maven (子) 项目。 创建一个web子模块: validator-web 在父模块的目录下, mvn archetype:create -DgroupId=com.ebay.tools.cms.validator.web -DartifactId=validator-web -DarchetypeArtifactId=maven-archetype-webapp 完成以上3步以后,会在总的pom.xml中已经自动加入: validator-rest validator-web ...

2014-05-06 · 1 min · 92 words · -