Month: November 2011

ibatis的statement的命名空间问题

只要保证一个sql-map文件里面不重复就可以了: 原文是: 3.2.4.1. id The required id attribute provides a name for this statement, which must be unique within this <SqlMap>.

复习ibatis

Ibatis 相比于 spring jdbc template的好处: 1.把 column value <=> JavaBean这种映射放到XML里来做会比在java代码里来做方便(作者很谦虚地说这只是他个人的体会) 2.SQL里的parameter可以用#age#, #name#来表示,而不是问号; 这可以增强sql的可读性 3.可以方便地将ResultSet一步映射为组合对象(如类A里面关联了类B的实例作为属性),免于用java进行手工组装。这意味着你的数据层bean可以写成domain风格,而不是table model风格 4.可以把动态SQL的拼写放在XML里,维持一个相对整洁的外观。这个在多条件搜索时大有用武之地。 5.可以在XML里重用SQL片断,比在JAVA里重用要直观一些 ========================================== 一些边角的东西: 1.“null value replacement”可以让你设置:在参数值为空时,用某个值来填充 2. 尽量用resultMap,而不是resultClass. 看这里 3. 支持复合主键 4. 动态SQL拼写除了支持<isNull>和<isNotNull>,还支持<isPropertyAvailable>(对付多态对象有效),<isEmpty>(对付未trimToNull的字符串有效)和它们的反义词

隔离,分层,专注

把核心服务隔离出来,做成独立的层次;并使它内聚于自身,而不必受到非核心的东西的干扰。它向外界提供简明的视图,并只按自己的特性和目标变化,不必屈从于其它东西的需要。 其他的东西,不再跟核心服务混杂在一起;它们只能通过依赖、组合核心服务,实现自己的目标。 代价是: 处处需要适配

Service层的单元测试:在测试方法单元性和所需Mock的次数上取得平衡

都说单元测试应该喵准单个方法,每个测试方法只测一小部分逻辑。 但另一方面,如果测试时总是要Mock,你就要想办法少Mock一些东西,因为Mock代码写起来是很累、很难看的 Service层的代码往往就是这种情况。看个例子: 你会怎么测下面这样的代码: //仔细看下,这是一棵4层的判定树 public class Service { //为了层次清晰,没有使用驼峰式命名 public boolean do_biz() { if (!is_biz_one_valid()) { return false; } return is_biz_two_valid(); } boolean is_biz_two_valid() { if (!is_two_a_valid()) { return false; } return is_two_b_valid(); } boolean is_two_b_valid() { if (!is_two_b_left_valid()) { return false; } return is_two_b_right_valid(); } … 本着每个测试方法只测一小块逻辑的原则,你可能会这样写: @Test public void test_do_biz() { Service …

Service层的单元测试:在测试方法单元性和所需Mock的次数上取得平衡 Read More »

Service层的单元测试:与其Mock别人,不如Mock自己

此为抛砖贴,希望能引出更好的见解。 你会怎么单元测试这样一个service层的类? public class Service { private BizOne bizOne; private BizTwo bizTwo; public boolean doBiz(Object param) { Object resultOne = bizOne.getIt(param); if (resultOne == null) { return false; } return bizTwo.getIt(param) == null; } … } 不管怎么测,对bizOne和bizTwo的调用都得mock掉,否则你的测试类可能会直接访问数据库或者依赖容器。所以你可能会这样写测试代码: // do mocking BizOne bizOne = expectBizOneNotReturnNull(param); BizTwo bizTwo = expectBizTwoReturnNull(param); // inject mocked objects service.setBizOne(bizOne); service.setBizTwo(bizTwo); assertTrue(service.doBiz(param)); …

Service层的单元测试:与其Mock别人,不如Mock自己 Read More »

Spring的集成测试测什么?

spring reference的原文:     *The correct wiring of your Spring IoC container contexts.     * Data access using JDBC or an ORM tool. This would include such things as the correctness of SQL statements, Hibernate queries, JPA entity mappings, etc.

Ubuntu下强行杀死多个java进程中的一个

有时候你必须用kill -9强行杀死一个java进程,但由于你机上启了多个java程序,你不知道你要杀的进程号是哪个。办法是: ps a|grep java (后面还可以再接|grep xxx, xxx为你这个java_opts的一些关键字) 通过这个命令找到PID,然后再kill -9 之

收藏一些“思维方式” 方面的术语

收藏一些“思维方式” 方面的术语,有时间应该好好学学 1.以解决问题为目标的思维方式 linear thinking thinking in systems analytic thinking convergent thinking 2.以“创新”为目标的思维方式 non-linear thinking creative thinking literal thinking divergent thinking

Lobo: Java Web Browser

Lobo 是一款用java写的开源浏览器 有时间可以读读它的源码,可以帮助你学习http规范 http://lobobrowser.org/java-browser.jsp

ibatis: 能select出对象,但对象的每个属性都是null ?

这很有可能是因为:   1. 你的select statement没用resultMap,但用了resultClass   2. 而且你的select语句里没有使用 select coloumn_name as propertName 这种格式。 你可能省略了 as propertName 另外,使用 "select coloumn_name as propertName"属于取巧的做法;官方文档建议用resultMap: Using SQL aliases to map columns to properties saves defining a <resultMap> element, but there are limitations. There is no way to specify the types of the output columns (if needed), there is no …

ibatis: 能select出对象,但对象的每个属性都是null ? Read More »