结论:
在进行Intege,Short,Long对象比较时,应使用equals方法进行值判断。亦或使用其对应的非包装类型进行==比较(注意为空的情况)。
遇到一个坑,当Interge对象值大于127时,使用 == 比较时会返回false。参看源码会发现Interge对象使用了 IntegerCache进行了值缓存。默认情况下,当Interge的值在 -128到127 时使用IntegerCache缓存。

阅读全文......

T-SQL即Transact-SQL,是SQL在 Microsoft SQL Server上的增强版。 主要记录一些没有特别注意到的语法特性和使用细节

数据表相关

数据库表创建后,
  • sysobjects 系统表中记录表的名称、对象ID、表类型、创建时间集所有者信;
  • syscolumns 系统表中记录字段ID、字段数据类型及字段长度等信息;。。。

表结构查看

阅读全文......

类似指针。可以对SELECT返回数据逐行进行处理。支持以下功能:
  • 定位结果集中的特定行;
  • 从结果集的当前位置检索一行或多行;
  • 支持对结果集中当前位置行数据进行修改;

分类

  • 静态游标:打开游标时在tempdb中建立SELECT结果集的快照。只展示打开游标时的结果集,不同步展示当前其他对该数据集的实际更新。
  • 动态游标:与静态游标对应,当滚动游标时,反映结果集中的所有更改。结果集中的行数据值、顺序和成员在每次提取时都会改变,所有用户的UPDATE,INSERT,DELETE语句均通过游标可见。
  • 只进游标:不可滚动,只支持从头到尾顺序提取数据。
  • 键集游标:游标中各行成员身份和顺序固定。健集驱动游标由一组唯一标识符(键)控制,这组键称为健集。键是根据唯一方式标识结果集中各行的一组列生成的。健集是打开游标时来自符合SELECT语句要求的所有行中的一组键值。健集驱动的游标对应的健集是打开游标时在数据库tempdb中生成的。

定义

/* 声明游标名 */
DECLARE cursor_name CURSOR
/* 游标作用域 */
[LOCAL|GOBAL]
/* 游标移动方向。默认FORWARD_ONLY */
[FORWARD_ONLY|SCROLL]
/* 游标类型 */
[STATIC|KEYSET|DYNAMIC|FAST_FORWARD]
/* 访问属性 */
[READ_ONLY|SCROLL_LOCKS|OPTIMISTIC]
/* 类型转换警告信息 */
[TYPE_WARNING]
FOR SELECT_statement
/* 可修改的列 */
[FOR UPDATE [OF column_name[,...n]]]
  • LOCAL:指明该游标仅在存储过程、触发器或批处理文件内。当其建立结果执行时,即自动解除。
  • GOBAL:session范围内的所有存储过程、触发器或批处理。连接结束时,自动解除。
  • FORWARD_ONLY:只能由第一行数据向前到最后一行。默认选项
  • SCROLL:可以查看前后行数据。具体可取值:
    • FIRST:游标第一行
    • LAST:最后一行
    • PRIOR:上一行
    • NEXT:下一行
    • RELATIVE n:当前位置的前或后n行数据。n为正为向下,否则为向上
    • ABSULUTE n:指定行
  • STATIC:静态游标
  • KEYSET:健集游标。指定当游标打开时,系统在tempdb内部建立一个keyset,keyset的键值可唯一标识游标的数据。用户更改非键值时,能反映出其变动。新增一行符合游标范围的数据时,无法由此游标读到;删除游标中的一行时,用该游标读取该行数据会得到一个 @@FETCH_status-2 的返回值;
  • DYNAMIC:动态有标
  • FAST_FORWARD:当设定FOR READ_ONLY 或者 READ_ONLY时,该选项将启动系统的效能最佳化;
  • READ_ONLY:内容不可改
  • SCROLL_LOCKS:数据读入游标时,锁定读入数据。可确保成功更新或删除游标内的数据。与选项 FAST_FORWARD 冲突;
  • OPTIMISTIC:用WHERE CURRENT OF方式修改或删除有标内数据时,如果该行数据已被其他用户变动过,则该方式不会成功;
  • TYPE_WARNING:若游标的类型被内部更改为和用户要求说明的类型不同时,发送一个警告信息给客户

打开游标

OPEN [GLOBAL] cursor_name | @cursor_variable_name
  • GLOBAL: 全局游标
  • cursor_name:游标名称
  • @cursor_variable_name:有标变量名称,该变量引用一个游标
可以通过判断全局变量 @@ERRORS 是否为0来确认游标是否打开成功。打开成功可通过全局变量 @@CURSOR_ROWS 获取游标中的记录行数。
@@ERRORS 说明
-m 游标采用异步方式填充,m为当前健集中已填充的行数
-1 动态游标,游标中的行数时动态变化的,不能确定
0 游标没被打开或者已被关闭或释放
m 填充完成,返回有标中的行数

获取数据

FETCH [NEXT|PRIOR|FIRST|LAST|ABSOLUTE{n|@nvar}|RELATIVE{n|@nvar}]
FROM [GLBAL] cursor_name | @cursor_variable_name
[INTO @variable_name[,...n]]
参数 说明
NEXT 当前行后一行。第一使用次,则返回第一行。默认
PRIOR 当前行前一行
FIRST 返回第一行并将其当作当前行
LAST 返回最后一样并将其当作当前行
ABSOLUTE{n|@nvar} n>0返回从游标头开始的第n行;n<0返回从游标尾之前的第n行;游标移到该行
RELATIVE{n|@nvar} n>0当前行后第n行;n<0当前行前第n行;游标移到该行
INTO @variable_name[,...n] 存入变量
@@FETCH_STATUS 返回获取语句执行的最终状态。需要说明的是:

阅读全文......

本文基于mockito-core:2.8.9进行介绍。详细内容可在这里查看具体的文档说明进一步了解。

Mock对象:

// normal
List<String> mockList = Mockito.mock(List.class);
// one-liner mock and stub
List<String> mockList1 = Mockito.when(List.class).get(0)).thenReturn(“mock").getMock();
mock与new的区别在于:
  1. mock返回对象属性为空或者为初始值,具体取决于对象属性类型是原始类型还是包装类型。
  2. 调用mock对象未被stub的方法,默认情况下会根据具体的返回值类型返回null、原始/包装类型值或者空集合。比如:
    1. int/Integer返回0
    2. List/Map返回[]
    3. String/Object返回null

Spy对象:

创建真实对象的spy
// spy对象有无参构造函数
List<String> spyList = Mockito.spy(ArrayList.class);

// spy对象构造函数均带参
// public User(String name){...}
User spyUser = Mockito.spy(new User("spy"));
  1. spy方法返回对象是对该对象进行new操作后的包装对象
  2. spy对象具有和原始对象相同的行为,除非某些方法被stub。

阅读全文......

实际开发场景中,经常会需要将List对象转成Map的情况出现。通常的做法是通过遍历List对象然后进行相应处理。JDK8后开始支持lambda表达式,同时提供针对集合的Stream方法,使得对集合的操作大大简化。下面就备份下如何使用lambda表达式和Guava1实现List到Map的转换。 首先定义测试用的TestBean, 代码如下:
public class TestBean {
	private String name;
	private Integer age;

	public TestBean() {
	}

	public TestBean(String name, Integer age) {
		this.name = name;
		this.age = age;
	}
	// 省略 set/get 方法
	@Override
	public String toString() {
		if (this != null) {
			return "TestBean{" +
					"name='" + name + '\'' +
					", age=" + age +
					'}';
		}
		return "null";
	}
}
测试对象:
List<TestBean> beanList = Lists.newArrayList(
	, new TestBean("jack", 29)
	, new TestBean("Tom", 25)
	, new TestBean("kitty", 25)
	, new TestBean("hurry", 30));

简单的List到Map的转换

阅读全文......

常见代理方式有正向代理、反向代理和透明代理。他们具体如下:

正向代理 forward proxy

C要访问目标机器T,但是无法直接访问,那么通过告诉P,由P去访问T,然后将访问T的结果告诉给C 其中C是客户端,T是目标访问机器,P是代理

关键点

阅读全文......

最近配置spring、mybatis框架时,遇到了无法找到mapper类的问题。最后发现是MapperScannerConfigurerbasePackage配置的问题。 项目mapper类存放目录
com/leeyee/xcode/mapper/*Mapper.java

阅读全文......

原文地址:https://stripesframework.atlassian.net/wiki/display/STRIPES/Wizard+Forms 向导表单(跨越多个页面的逻辑表单)经常会出现问题。基于无状态的web处理跨多个页面的交互可能是相当棘手的。一个标准的示例是新用户的注册流程。因为用户需要通过被拆分成的多个页面一部分一部的输入信息。同时输入的信息在每一个页面都应被校验,并始终保留在同一个流中,并在结束的时候在一个原子事物中被提交。

Stripes向导

在Stripes中创建一个向导流实际上是非常简单的。简单来说,它涉及编写一个单独的ActionBean去管理页面之间的流,并且通过使用@Wizard注解来标记它。除此之外,还取决于你是否想用单独的事件/方法去处理导航,或者每个事件一个方法。每个页面用不同的事件(方法)会使流的管理变得容易。下面是一个来自Bugzooky的简短示例:

阅读全文......

原文地址:https://stripesframework.atlassian.net/wiki/display/STRIPES/Use+Defaults+More 这篇文章介绍Stripes中用来减少那些需要在每一个ActionBeans上配置(通常是注解形式)数量的技术。

URL绑定和事件名

从Stripes 1.2开始,Stripes附带了一个名叫NameBasedActionResolver的类,这个类继承子类AnnotatedClassActionResolver. 当URL注解不存在时,NameBasedActionResolver将自动创建默认的URL绑定和事件名。当注解存在时优先使用注解。

阅读全文......

原文地址:https://stripesframework.atlassian.net/wiki/display/STRIPES/Unit+Testing 这篇文档介绍两种主要的方式用来测试ActionBeans和与之关联的外部容器类,比如Tomcat,Resin或者Jetty。要决定哪种方式适合你,应该大概去了解下两者。这不是用一个方案就可以解决所有问题的,你可能需要在你的项目中同时使用这两种技术。 但是首先,让我们先说明一些事情……
  1. 自动化测试是一件好事情。自动化测试可以让你方便的对代码进行重构,直到写出更高质量的代码。
  2. 我不想通过哲学层面去说明单元测试的好与不好;但良好的可自动运行的测试是值得提倡的,这不关乎他们是否是技术性的单元测试。
  3. 有工具可以让你测试整个包含在常规servelt容器内渲染的JSP的周期;我发现这有一点像是努力工作并当可能的时候去测试我的外部容器1
  4. 对每个Stripes用户,我个人比较推荐使用TestNG。它要比JUnit先进,如果你有做过任何的单元测试,那么TestNG的上手时间也就大概15分钟。

阅读全文......