hibernate-HQL语句(1)
http://java.chinaitlab.com/Hibernate/809957.html
当月第一天 select timestamp(concat(year(curdate()),'-',month(curdate()),'-','1')) 如2010-08-01 00:00:00
当前时间 select now()
测试对于保证软件开发质量有着非常重要的作用,单元测试更是必不可少,
JUnit是一个非常强
大的单元测试包,可以对一个/多个类的单个/多个方法测试,还可以将不同的TestCase组合成TestSuit,使测试
任务自动化。Eclipse同样集成了JUnit,可以非常方便地编写TestCase。
我们创
建一个Java工程,添加一个example.Hello类,首先我们给Hello类添加一个abs()方法,作用是返
回绝对值:
(图一)
下一
步,我们准备对这个方法进行测试,确保功能正常。选中Hello.java,右
键点击,选择New->JUnit
Test Case:
(图二)
Eclipse会询问是否添加junit.jar包,确定后新建一个HelloTest类,用来测试Hello类。
(图三)
选中setUp()和tearDown(),然后点击“Next”:
(图
四)
选择要
测试的方法,我们选中abs(int)方法,完成后在HelloTest.java中输入:
(图五)
JUnit会以以下顺序执行测试:(大致的代码)
try {
HelloTest test = new HelloTest(); // 建立测试类实例
test.setUp(); // 初始化测试环境
test.testAbs();
// 测试某个方法
test.tearDown(); // 清理资源
}
catch…
setUp()是建立测试环境,这里创建一个Hello类的实例;tearDown()用于清理资源,如释放打开的文件等等。以test开头的方法被认为是测试方法,JUnit会依次执行testXxx()方法。在testAbs()方法中,我们对abs()的测试分别选择
正数,负数和0,如果方法返回值与期待结果相同,则assertEquals不会产生异常。
如果有
多个testXxx方法,JUnit会创建多个XxxTest实例,每次
运行一个testXxx方法,setUp()和tearDown()会在testXxx前后被调用,因此,不要在一个testA()中依赖testB()。
直接运
行Run->Run
As->JUnit Test,就可
以看到JUnit测试结果:
(图六)
绿色表
示测试通过,只要有1个测试未通过,就会显示红色并列出未通过测试的方法。可以试图改变abs()的代码,故意返回错误的结果(比如return n+1;),然后再运行JUnit就会报告错误。
如果没
有JUnit面板,选择Window->Show View->Other,打开JUnit的View:
(图七)
JUnit通过单元测试,能在开发阶段就找出许多Bug,并且,多个Test Case可以组合成Test Suite,让
整个测试自动完成,尤其适合于XP方法。每增加一个小的新功能或者对代码进行了小的修改,就立刻运行一
遍Test Suite,确保新增和修改的代码不会破坏原有的功能,大大增强软件的可维护
性,避免代码逐渐“腐烂”。
初次学会使用Junit的使用是通过这篇文章的(上文),自己尝试跟着做了一遍,结果发现它上面提供的代码例子是错误
的,不过流程、图片都很清楚。所以你可以先看看它上面是怎么说的,至于测试的代码我稍做了改动,为的是只要说明问题就行——其实不难。
被测试的类代码:
public class HelloJunit {
public static int abs(int n){
return n>=0?n:(-n);
}
}
Junit的测试代码:
import junit.framework.TestCase;
public class HelloJunitTest extends TestCase {
public void testAbs() {
assertEquals(HelloJunit.abs(10),10);
assertEquals(HelloJunit.abs(-10),10);
}
}
主要代码
行为assertEquals(HelloJunit.abs(10),10);
其中参数
的意义为:
HelloJunit.abs(10)执行类HelloJunit的abs方法(参数为10,表示求10的绝对值)。
逗号后面
的10表示为预期的结果(期望值)。
该行表示
将期望值(10)与实际值(类HelloJunit的abs方法执行结果)进行比较,如果不相
等则抛出异常。
这里只是
一个简简单单的例子,Junit被大家称为优秀的白盒自动化测试框架,当然只有自己用过了才会了解。网上有许多的资料介绍这个框架,笔
者也是从自身情况出发来学习它的。当然学习使用它是需要有一定基础的,笔者拥有C和C++的基础,对Java的学习也开始不久,所以在这里将力
所能及的知识共享出来与大家分享,希望能够共同提高。另外笔者是专职的测试人员,所以在描述一些问题时大多都会以测试的角度来阐述。学习此框架的目的在于
能够在工作中进行白盒测试,在以后的介绍中还会介绍白盒测试相关的理论和工具,希望大家能够一起提高进步。
由于MySQL目前字段的默认值不支持函数的形式设置默认值是不可能的。
代替的方案是使用TIMESTAMP类型代替DATETIME类型。
CURRENT_TIMESTAMP
:当我更新这条记录的时候,这条记录的这个字段不会改变。
CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
:当我更新这条记录的时候,这条记录的这个字段将会改变。即时间变为了更新时候的时间。(注意一个UPDATE设置一个列为它已经有的值,这将不引起
TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)如果有多个TIMESTAMP列,只有第一个自动更
新。
TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作。
如果有多个
TIMESTAMP列,只有第一个自动更新。
自动更新第一个TIMESTAMP列在下列任何条件下发生:
列
值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。
列值没有明确地在一个UPDATE语句中指定且另
外一些的列改变值。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的
值,MySQL为了效率而忽略更改。)
你明确地设定TIMESTAMP列为NULL.
除第一个以外的
TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。
另外在5.0以上版本中也可以使用
trigger来实现此功能。
create table test_time (
id int(11),
create_time
datetime
);
delimiter |
create
trigger default_datetime before insert on test_time
for each
row
if new.create_time is null then
set
new.create_time = now();
end if;|
delimiter ;
生成 注释
应该是选取要注释内容后, ctrl+shift+c 按一下注释,按两下取消注释
ctrl+shift+"反注释!能讲ctrl+shift+/ 多行注释掉的内容反注释掉
CTRL+T 查看接口的实现
MyEclipse调试
1.首先在一个java文件中设断点,然后运行debug,当程序走到断点处就会停下。
2.F5键与F6键均为单步调试,
F5是step into,也就是进入本行代码中执行(进入函数执行),
F6是step over,也就是执行本行代码,跳到下一行执行(不进入函数),
3.F7是跳出函数 step return
4.F8是执行到最后。
=====================================
1.Step Into (F5) 跳入
2.Step Over (F6) 跳过
3.Step Return (F7) 执行完当前method,然后return跳出此method
4.step Filter 逐步过滤
一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step
Filtering)
5.resume 重新开始执行debug,一直运行直到遇到breakpoint
6.hit count 设置执行次数 适合程序中的for循环(设置 breakpoint view-右键hit
count)
7.inspect 检查 运算。执行一个表达式显示执行值
8.watch 实时地监视变量的变化
9.我们常说的断点(breakpoints)是指line breakpoints,除了line
breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method
breakpoint,exception breakpoint.
10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂
11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint)
12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...)
断点属性:
1.hit count 执行多少次数后暂挂 用于循环
2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂
3.suspend thread 多线程时暂挂此线程
4.suspend VM 暂挂虚拟机
13.variables 视图里的变量可以改变变量值,在variables 视图选择变量点击右键--change
value.一次来进行快速调试。
14.debug
过程中修改了某些code后--〉save&build-->resume-->重新暂挂于断点
===========================
例如你有如下程序:
public class debugtest {
来源:(http://blog.sina.com.cn/s/blog_624aa0960100fkrr.html)
- MyEclipse调试_匆匆过客_新浪博客
public String addDays() {
System.out.println("1");//
=============》(3)
String result = "";
//=============》(4)
System.out.println("2");//
=============》(5)
return result;
}
public static void main(String args[]) {
debugtest aa = new
debugtest();
int ii=9;
aa.addDays();//
=============》(1)
System.out.println("eeeeeeeeeeeeeee");//=============》(2)
}
}
你在(1)处加断点,运行到此处时如果Step Into (F5)为跳入(进入函数),则接着执行到(3)。
再执行Step Over (F6)执行本行,则执行到(4)。
最后执行Step Return (also F7),则跳出addDays方法,跳到(2)
转http://blog.sina.com.cn/s/blog_624aa0960100fkrr.html
MyEclipse 中显示行号 要想显示行号,按住 Ctrl + F10 选择 show Line Numbers
eclipse/myeclipse注释模板的修改 alt+shitf+j
Window --> Java --> Code Style --> Code Templates --> Comments --> types --> Edit
/**
*
* 项目名称:${project_name}
* 类名称:${type_name}
* 类描述:
* 创建人:${user}
* 创建时间:${date} ${time}
* 修改人:${user}
* 修改时间:${date} ${time}
* 修改备注:
* @version
*
*/
http://www.javaeye.com/topic/585168
myeclipse中如何配置自定义的代码排版格式 ctrl+shift+f
http://www.blogjava.net/bolo/
http://www.blogjava.net/bolo/archive/2010/04/11/318004.html
com.test.action.user包下:
SaveUserAction.java
SaveUserAction-validation.xml
SaveUserAction.java文件的内容:
package com.test.action.user;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.User;
import com.test.service.UserService;
public class SaveUserAction extends ActionSupport
{
private User user;
private UserService service;
public User getUser()
{
return user;
}
public void setUser(User user)
{
this.user = user;
}
public UserService getService()
{
return service;
}
public void setService(UserService service)
{
this.service = service;
}
@Override
public String execute() throws Exception
{
this.service.save(this.user);
return SUCCESS;
}
@Override
@SuppressWarnings("unchecked")
public void validate()
{
Map map = this.getFieldErrors();
Set set = map.keySet();
for (Iterator iter = set.iterator(); iter.hasNext();)
{
System.out.println(map.get(iter.next()));
}
}
}
SaveUserAction-validation.xml的文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="user">
<field-validator type="visitor">
<param name="context">user</param>
<param name="appendPrefix">true</param>
<message>user's </message>
</field-validator>
</field>
</validators>
com.test.bean包下的文件:
User.java;
User-user-validation.xml
User-user-validation.xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="firstname">
<field-validator type="requiredstring">
<message>required first name</message>
</field-validator>
</field>
<field name="lastname">
<field-validator type="requiredstring">
<message>required last name</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<message>required age</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>age should be between ${min} and
${max}</message>
</field-validator>
</field>
</validators>
还有一个问题,就是校验信息会重复,在错误的情况下。由以下代码可以测试:
@Override
@SuppressWarnings("unchecked")
public void validate()
{
Map map = this.getFieldErrors();
Set set = map.keySet();
for (Iterator iter = set.iterator(); iter.hasNext();)
{
System.out.println(map.get(iter.next()));
}
}
}
解决方法:
applicationContext.xml 文件中的配置action中加入:Struts 2.0 的action 是有状态的
在spring 配置的action 中加上 scope="prototype";
配置如下:<bean id="saveUserAction"
class="com.test.action.user.SaveUserAction" scope="prototype">
<property name="service" ref="userService"></property>
</bean>
关键字: struts2,spring2,hibernate3,整合
今天在寝室窝了一天,由于前天老师给了个ss2+toplink的项目源码,要我去消化。直接看那
三个整合具吃力,于是先从ssh2入手吧!
所使用的工具和环境。
jdk6+myeclipse6.5+tomcat6+mysql5+spring2.0+hibernate3+struts2
好了,开始我们的第一个ssh2之旅吧。
首先先分析一下我们的第一个ssh2项目的需求,简单的说就是有一张表单,
让你填写用户名和密码,提交后存入数据库。就这么简单,呵呵。
第一步:。我
们首先新建一张mysql数据表
sql如下
CREATE TABLE mytest.users (
id INT
NOT NULL,
username VARCHAR(50),
password VARCHAR(50),
PRIMARY KEY (id)
数据表创建好后结构如下:
当然我已经有几天数据添加进去了
第二步
打开myeclipse,新建一个web项目,
命名为ssh2-2, java ee规范我们选择5,如图
第三步 务必小心的一步
导
入ssh2的各个jar,步骤如下:
选中当前的项目后,点击菜单烂的myeclipse---project
capablities----add hibernate项,跳出如图
务必按照图示选择,尤其是copy checkde……一项,然后点击next,默认next,去掉specify
database……复选框,next,去掉create session……复选框,finish。
再次选中选中当前的项目后,点击
菜单烂的myeclipse---project capablities----add spring项,跳出如图
依然务必按照如是选择,jar文件选择如下5个:
点击next,
之后按下选择,务必,
next后finsh即可。
然后导入struts2的jar
如下5个放到lib下
然后放入我们的数据库驱动jar mysql-connector-java-5.0.8-bin.jar 没得话附件中有
至
此,包都导入完毕
http://77857.blog.51cto.com/67857/149631
去网上找了一些相关错误的信息看了下说Hibernate core下面的xerces.jar包的问题。删除后正确了。
如果删除后还是错误,看一下项目的lib文件夹下面的是否还有xerces相关jar包,也删掉。
记住把tomcat 里面xerces.jar也要删掉