先看段代码:
String sDate = "2014-12-20";
try {
    DateFormat df = DateFormat.getDateInstance();
    Date date = df.parse(sDate);
} catch (Exception e) {
    e.printStackTrace();
}
这段代码在中文语言环境下是可以测试通过。但在其他语言环境中则会抛出异常。原因是DateFormat.getDateInstance()初始化时会跟据当前语言环境设置日期格式。
  1. DateFormat.getDateInstance() 根据当前语言环境设置日期模式:
     zh_CN : yyyy-MM-dd : 2014-05-19
     en_us : MMM d, yyyy : May 19, 2014
    
  2. 阅读全文......

我们这里模拟几种场景,以便您快速上手.

场景一:【本地建立GIT版本管理并添加文件】

step-1、创建项目根目录

$ mkdir gitProject

step-2、进入目录并初始版本管理

$ cd gitProject
$ git init
git init后,将在 gitProject目录下生成 .git隐藏文件。可使用 ls -a 进行查看

step-3、添加文件到目录gitProject

$ touch HelloWorld.java

step-4、查看当前版本仓库状态

$ git status     # 这里应该会显示HelloWorld.java为untracked files,也就是尚未进行版本管理

step-5、将HelloWorld.java添加到版本管理中

$ git add HelloWorld.java

step-6、再次查看版本仓库状态

$ git status     # 此时将会显示HelloWorld为一个new file,需要提交到版本库中

step-7、提交HelloWorld.java到版本库

$ git commit HelloWorld.java

step-8、为HelloWorld.java添加内容

$ vi HelloWorld.java

step-9、查看当前HelloWorld.java文件与提交的版本库中的差异

$ git diff

step-10、提交修改后的HelloWorld.java到版本库

$ git commit -m 'init import' HelloWorld.java

step-11、查看操作日志

$ git log
补充知识
  1. 阅读全文......

mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。

不返回自增主键值

如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式。
  1. Oracle Sequence 配置
     <sql id='TABLE_NAME'>TEST_USER</sql>
     <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
    
     <!-- 注意这里直接调用sequence的nextval函数 -->
     <insert id="insert" parameterType="User">
         insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
             values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )
     </insert>
    

    阅读全文......

加权因子Wi 从右到左依次定义为:
Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
  • 阅读全文......

  • Hibernate中实现缓存的对象有SessionSessionFactorySession的缓存为内置缓存,不可被卸载,称为Hibernate的一级缓存; SessionFactory有一个内置缓存和一个外置缓存。其中外置缓存可插拔,被称作Hibernate的二级缓存。

    阅读全文......

    用于读数据操作,他是非独占的,允许其他事务同时读取其锁定的资源,但不允许其他事务更新他。
    1. 加锁条件:当一个事务执行select语句时。
    2. 解锁条件:默认情况下,数据读取后,数据库系统立即释放共享锁。
    3. 兼容性:放置共享锁后还可放置共享锁和更新锁。
    4. 并发性:具有良好的并发性能。当多个事务读取相同的数据时,每个事务都会获得一把共享锁,因此可以同时读锁定的数据。

    独占锁

    也叫排他锁,使用与修改数据的场合。他锁定的资源,其他事务不能进行读写。
    1. 加锁条件:当一个事务执行insert,update,delete时,数据库系统会自动对被操作的数据使用独占锁。如果该数据已有其他锁存在,则不能放置独占锁。
    2. 解锁条件:事务结束。
    3. 兼容性:不和其他锁兼容。
    4. 并发性:并发性差,只允许有一个事务访问锁定数据。其他事务需等待,直到当前事务结束。

    更新锁

    更新操作的初始阶段用来锁定可以能要被修改资源的锁。更新锁可避免使用共享锁造成的死锁现象。
    1. 加锁条件:当执行update时,数据库系统会先为事务分配一个更新锁。
    2. 解锁条件:当读取数据完毕,执行更新操作时,更新锁升级为独占锁。
    3. 兼容性:与共享锁兼容。一个资源可同时放置更新锁和共享锁,但只能放置一把更新锁。
    4. 并发性:允许多个事务同时读锁定的资源,但不允许其他事务修改。

    如何防止死锁

    1. 合理安排表访问顺序;
    2. 阅读全文......

    利用 association 解决多对一、一对一问题时,在配置 resultMap 时使用 autoMapping 属性映射表字段时,生成的多端对象数据中是拿不到声明的外键的。 如果业务有需要在多的一端对象中直接获取外键属性,而不是通过对应的一端来获取,那么就需要在使用 autoMapping 时,重新为多端表指明主外键映射关系或者撇弃 autoMapping 而改用手工声明。 首先做如下定义:

    阅读全文......

    最近的项目中使用到了mybatis,发现mybatis不支持物理分页,只支持内存分页。因此为了解决这个问题,在网上搜索了一番,不过都比较繁琐。最后使用正则表达过滤查询语句的方式简单解决了该问题. mybatis物理分页的核心是使用mybatis的拦截器 org.apache.ibatis.plugin.Interceptor ,在mybatis准备好SQL的时候,对SQL字符串进行拦截,生成适合Oracle数据库的分页语句即可。废话不多讲了,直接上代码.
    Note: 该部分依赖commons-lang3.jar包进行反射写入,也可使用 mybatis 自带的反射类实现这部分功能

    拦截器代码

    package org.mybatis.test.interceptor;
    
    import java.sql.Connection;
    import java.util.*;
    
    import org.apache.commons.lang3.StringUtils;
    import org.apache.commons.lang3.reflect.FieldUtils;
    import org.apache.ibatis.executor.statement.StatementHandler;
    import org.apache.ibatis.mapping.BoundSql;
    import org.apache.ibatis.plugin.*;
    import org.apache.ibatis.session.RowBounds;
    
    @Intercepts(@Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }))
    public class PaginationInterceptor implements Interceptor {
    
    	private final static String SQL_SELECT_REGEX = "(?is)^\\s*SELECT.*$";
    	private final static String SQL_COUNT_REGEX = "(?is)^\\s*SELECT\\s+COUNT\\s*\\(\\s*(?:\\*|\\w+)\\s*\\).*$";
    
    	//@Override
    	public Object intercept(Invocation inv) throws Throwable {
    
    		StatementHandler target = (StatementHandler) inv.getTarget();
    
    		BoundSql boundSql = target.getBoundSql();
    
    		String sql = boundSql.getSql();
    
    		if (StringUtils.isBlank(sql)) {
    			return inv.proceed();
    		}
    		System.out.println("origin sql>>>>>" + sql.replaceAll("\n", ""));
    
    		// 只有为select查询语句时才进行下一步
    		if (sql.matches(SQL_SELECT_REGEX)
    				&& !Pattern.matches(SQL_COUNT_REGEX, sql)) {
    
    			Object obj = FieldUtils.readField(target, "delegate", true);
    			// 反射获取 RowBounds 对象。
    			RowBounds rowBounds = (RowBounds) FieldUtils.readField(obj,
    					"rowBounds", true);
    					
    			// 分页参数存在且不为默认值时进行分页SQL构造
    			if (rowBounds != null && rowBounds != RowBounds.DEFAULT) {
    				FieldUtils.writeField(boundSql, "sql", newSql(sql, rowBounds),
    						true);
    				System.out.println("new sql>>>>>"
    						+ boundSql.getSql().replaceAll("\n", ""));
    
    				// 一定要还原否则将无法得到下一组数据(第一次的数据被缓存了)
    				FieldUtils.writeField(rowBounds, "offset",
    						RowBounds.NO_ROW_OFFSET, true);
    				FieldUtils.writeField(rowBounds, "limit",
    						RowBounds.NO_ROW_LIMIT, true);
    			}
    		}
    		return inv.proceed();
    	}
    
    	public String newSql(String oldSql, RowBounds rowBounds) {
    		String start = " SELECT * FROM   (SELECT   row_.*, ROWNUM rownum_ FROM ( ";
    		String end = " ) row_ WHERE   ROWNUM <= " + rowBounds.getLimit()
    				+ ") WHERE   rownum_ > " + rowBounds.getOffset();
    
    		return start + oldSql + end;
    	}
    
    	//@Override
    	public Object plugin(Object target) {
    		return Plugin.wrap(target, this);
    	}
    
    	//@Override
    	public void setProperties(Properties arg0) {
    		System.out.println(arg0);
    	}
        
        //测试正则表达式是否能正常工作
    	public static void main(String[] args) {
    		String SQL_SELECT_REGEX = "^\\s*SELECT.*$";
    		String SQL_COUNT_REGEX = "^\\s*SELECT\\s+COUNT\\s*\\(\\s*(?:\\*|\\w+)\\s*\\).*$";
    		List<String> tests = new ArrayList<String>();
    		tests.add("select count(*) from abc \n\t\t where\n abc");
    		tests.add("SELECT 	COUNT(*) from abc");
    		tests.add(" select count  (*) from abc");
    		tests.add("  select count(  *) from abc");
    		tests.add("select count( *  ),id   from abc");
    		tests.add("select * from abc");
    		tests.add("select abc,test,fdas from abc");
    		tests.add("select count(adb) from abc");
    		tests.add("select count(0) from abc");
    		tests.add("select min(count(*)) from abc");
    		tests.add("update min(count(*)) from abc");
    		tests.add("delete min(count(*)) from abc");
    		Pattern p1 = Pattern.compile(SQL_SELECT_REGEX, Pattern.DOTALL
    				| Pattern.CASE_INSENSITIVE);
    		Pattern p2 = Pattern.compile(SQL_COUNT_REGEX, Pattern.DOTALL
    				| Pattern.CASE_INSENSITIVE);
    		for (String str : tests) {
    			Matcher m1 = p1.matcher(str);
    			Matcher m2 = p2.matcher(str);
    			System.out.println("匹配字符串: " + str);
    			System.out.println("	是select语句? " + m1.matches());
    			System.out.println("	是count语句? " + m2.matches());
    			System.out.println();
    		}
    	}
    }
    

    在spring中配置拦截器

    <bean name="paginationInterceptor" class="org.mybatis.test.interceptor.PaginationInterceptor"></bean>
    
    <!-- define the SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource" />
    	<property name="typeAliasesPackage" value="org.mybatis.test.domain" />
    	<property name="plugins">
    		<list>
    			<ref bean="paginationInterceptor" />
    		</list>
    	</property>
    </bean>
    

    使用

    public class Test(){
    	private String name;
    	private int age;
    	// set/get省
    }
    
    1. 阅读全文......

    null表示无值或不存在的对象;
  • undefined表示一个未声明的变量。声明但没有赋值的变量或者一个并不存在的对象属性;
     var param; // 声明但不赋值,其等价于
     var param = undefined;
    
     var obj = {}; //声明一个对象
     var param1 = obj.param; // 对象不存在的属性
     console.info(param1); // undefined
     console.info(param1 === undefined); // true
    
  • undefined不同于未定义,但在使用typeof方法时,该方法并不区分undefined未定义,其返回值均为字符串undefined
     var param; 
     console.info(typeof param); // 打印 "undefined"
     console.info(typeof param === 'undefined'); // true
    
     // 注意:param1并未被声明,属于首次使用
     console.info(typeof param1); // 打印 "undefined"
     console.info(typeof param1 === 'undefined'); // true
    
  • 阅读全文......

  • 原文地址:http://docs.jquery.com/Plugins/Authoring So you’ve become comfortable with jQuery and would like to learn how to write your own plugins. Great! You’re in the right spot. Extending jQuery with plugins and methods is very powerful and can save you and your peers a lot of development time by abstracting your most clever functions into plugins. This post will outline the basics, best practices, and common pitfalls to watch out for as you begin writing your plugin. 当你已经熟练掌握jQuery并且想学习如何编写属于自己的插件程序时,你可以参看这篇文章。使用插件程序和方法扩展jQuery是非常强大的。你可以将一些想法抽象为函数并封装到插件中以便为你和你的同事节省许多开发时间。

    目录(CONTENTS)

    1. 阅读全文......