hibernate-HQL語(yǔ)句(1)
http://java.chinaitlab.com/Hibernate/809957.html
當(dāng)月第一天 select timestamp(concat(year(curdate()),'-',month(curdate()),'-','1')) 如2010-08-01 00:00:00
當(dāng)前時(shí)間 select now()
測(cè)試對(duì)于保證軟件開(kāi)發(fā)質(zhì)量有著非常重要的作用,單元測(cè)試更是必不可少,
JUnit是一個(gè)非常強(qiáng)
大的單元測(cè)試包,可以對(duì)一個(gè)/多個(gè)類的單個(gè)/多個(gè)方法測(cè)試,還可以將不同的TestCase組合成TestSuit,使測(cè)試
任務(wù)自動(dòng)化。Eclipse同樣集成了JUnit,可以非常方便地編寫(xiě)TestCase。
我們創(chuàng)
建一個(gè)Java工程,添加一個(gè)example.Hello類,首先我們給Hello類添加一個(gè)abs()方法,作用是返
回絕對(duì)值:

(圖一)
下一
步,我們準(zhǔn)備對(duì)這個(gè)方法進(jìn)行測(cè)試,確保功能正常。選中Hello.java,右
鍵點(diǎn)擊,選擇New->JUnit
Test Case:

(圖二)
Eclipse會(huì)詢問(wèn)是否添加junit.jar包,確定后新建一個(gè)HelloTest類,用來(lái)測(cè)試Hello類。

(圖三)
選中setUp()和tearDown(),然后點(diǎn)擊“Next”:

(圖
四)
選擇要
測(cè)試的方法,我們選中abs(int)方法,完成后在HelloTest.java中輸入:

(圖五)
JUnit會(huì)以以下順序執(zhí)行測(cè)試:(大致的代碼)
try {
HelloTest test = new HelloTest(); // 建立測(cè)試類實(shí)例
test.setUp(); // 初始化測(cè)試環(huán)境
test.testAbs();
// 測(cè)試某個(gè)方法
test.tearDown(); // 清理資源
}
catch…
setUp()是建立測(cè)試環(huán)境,這里創(chuàng)建一個(gè)Hello類的實(shí)例;tearDown()用于清理資源,如釋放打開(kāi)的文件等等。以test開(kāi)頭的方法被認(rèn)為是測(cè)試方法,JUnit會(huì)依次執(zhí)行testXxx()方法。在testAbs()方法中,我們對(duì)abs()的測(cè)試分別選擇
正數(shù),負(fù)數(shù)和0,如果方法返回值與期待結(jié)果相同,則assertEquals不會(huì)產(chǎn)生異常。
如果有
多個(gè)testXxx方法,JUnit會(huì)創(chuàng)建多個(gè)XxxTest實(shí)例,每次
運(yùn)行一個(gè)testXxx方法,setUp()和tearDown()會(huì)在testXxx前后被調(diào)用,因此,不要在一個(gè)testA()中依賴testB()。
直接運(yùn)
行Run->Run
As->JUnit Test,就可
以看到JUnit測(cè)試結(jié)果:

(圖六)
綠色表
示測(cè)試通過(guò),只要有1個(gè)測(cè)試未通過(guò),就會(huì)顯示紅色并列出未通過(guò)測(cè)試的方法。可以試圖改變abs()的代碼,故意返回錯(cuò)誤的結(jié)果(比如return n+1;),然后再運(yùn)行JUnit就會(huì)報(bào)告錯(cuò)誤。
如果沒(méi)
有JUnit面板,選擇Window->Show View->Other,打開(kāi)JUnit的View:

(圖七)
JUnit通過(guò)單元測(cè)試,能在開(kāi)發(fā)階段就找出許多Bug,并且,多個(gè)Test Case可以組合成Test Suite,讓
整個(gè)測(cè)試自動(dòng)完成,尤其適合于XP方法。每增加一個(gè)小的新功能或者對(duì)代碼進(jìn)行了小的修改,就立刻運(yùn)行一
遍Test Suite,確保新增和修改的代碼不會(huì)破壞原有的功能,大大增強(qiáng)軟件的可維護(hù)
性,避免代碼逐漸“腐爛”。
初次學(xué)會(huì)使用Junit的使用是通過(guò)這篇文章的(上文),自己嘗試跟著做了一遍,結(jié)果發(fā)現(xiàn)它上面提供的代碼例子是錯(cuò)誤
的,不過(guò)流程、圖片都很清楚。所以你可以先看看它上面是怎么說(shuō)的,至于測(cè)試的代碼我稍做了改動(dòng),為的是只要說(shuō)明問(wèn)題就行——其實(shí)不難。
被測(cè)試的類代碼:
public class HelloJunit {
public static int abs(int n){
return n>=0?n:(-n);
}
}
Junit的測(cè)試代碼:
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);
其中參數(shù)
的意義為:
HelloJunit.abs(10)執(zhí)行類HelloJunit的abs方法(參數(shù)為10,表示求10的絕對(duì)值)。
逗號(hào)后面
的10表示為預(yù)期的結(jié)果(期望值)。
該行表示
將期望值(10)與實(shí)際值(類HelloJunit的abs方法執(zhí)行結(jié)果)進(jìn)行比較,如果不相
等則拋出異常。
這里只是
一個(gè)簡(jiǎn)簡(jiǎn)單單的例子,Junit被大家稱為優(yōu)秀的白盒自動(dòng)化測(cè)試框架,當(dāng)然只有自己用過(guò)了才會(huì)了解。網(wǎng)上有許多的資料介紹這個(gè)框架,筆
者也是從自身情況出發(fā)來(lái)學(xué)習(xí)它的。當(dāng)然學(xué)習(xí)使用它是需要有一定基礎(chǔ)的,筆者擁有C和C++的基礎(chǔ),對(duì)Java的學(xué)習(xí)也開(kāi)始不久,所以在這里將力
所能及的知識(shí)共享出來(lái)與大家分享,希望能夠共同提高。另外筆者是專職的測(cè)試人員,所以在描述一些問(wèn)題時(shí)大多都會(huì)以測(cè)試的角度來(lái)闡述。學(xué)習(xí)此框架的目的在于
能夠在工作中進(jìn)行白盒測(cè)試,在以后的介紹中還會(huì)介紹白盒測(cè)試相關(guān)的理論和工具,希望大家能夠一起提高進(jìn)步。
由于MySQL目前字段的默認(rèn)值不支持函數(shù)的形式設(shè)置默認(rèn)值是不可能的。
代替的方案是使用TIMESTAMP類型代替DATETIME類型。
CURRENT_TIMESTAMP
:當(dāng)我更新這條記錄的時(shí)候,這條記錄的這個(gè)字段不會(huì)改變。
CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
:當(dāng)我更新這條記錄的時(shí)候,這條記錄的這個(gè)字段將會(huì)改變。即時(shí)間變?yōu)榱烁聲r(shí)候的時(shí)間。(注意一個(gè)UPDATE設(shè)置一個(gè)列為它已經(jīng)有的值,這將不引起
TIMESTAMP列被更新,因?yàn)槿绻阍O(shè)置一個(gè)列為它當(dāng)前的值,MySQL為了效率而忽略更改。)如果有多個(gè)TIMESTAMP列,只有第一個(gè)自動(dòng)更
新。
TIMESTAMP列類型自動(dòng)地用當(dāng)前的日期和時(shí)間標(biāo)記INSERT或UPDATE的操作。
如果有多個(gè)
TIMESTAMP列,只有第一個(gè)自動(dòng)更新。
自動(dòng)更新第一個(gè)TIMESTAMP列在下列任何條件下發(fā)生:
列
值沒(méi)有明確地在一個(gè)INSERT或LOAD DATA INFILE語(yǔ)句中指定。
列值沒(méi)有明確地在一個(gè)UPDATE語(yǔ)句中指定且另
外一些的列改變值。(注意一個(gè)UPDATE設(shè)置一個(gè)列為它已經(jīng)有的值,這將不引起TIMESTAMP列被更新,因?yàn)槿绻阍O(shè)置一個(gè)列為它當(dāng)前的
值,MySQL為了效率而忽略更改。)
你明確地設(shè)定TIMESTAMP列為NULL.
除第一個(gè)以外的
TIMESTAMP列也可以設(shè)置到當(dāng)前的日期和時(shí)間,只要將列設(shè)為NULL,或NOW()。
另外在5.0以上版本中也可以使用
trigger來(lái)實(shí)現(xiàn)此功能。
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 ;
生成 注釋
應(yīng)該是選取要注釋內(nèi)容后, ctrl+shift+c 按一下注釋,按兩下取消注釋
ctrl+shift+"反注釋!能講ctrl+shift+/ 多行注釋掉的內(nèi)容反注釋掉
CTRL+T 查看接口的實(shí)現(xiàn)
MyEclipse調(diào)試
1.首先在一個(gè)java文件中設(shè)斷點(diǎn),然后運(yùn)行debug,當(dāng)程序走到斷點(diǎn)處就會(huì)停下。
2.F5鍵與F6鍵均為單步調(diào)試,
F5是step into,也就是進(jìn)入本行代碼中執(zhí)行(進(jìn)入函數(shù)執(zhí)行),
F6是step over,也就是執(zhí)行本行代碼,跳到下一行執(zhí)行(不進(jìn)入函數(shù)),
3.F7是跳出函數(shù) step return
4.F8是執(zhí)行到最后。
=====================================
1.Step Into (F5) 跳入
2.Step Over (F6) 跳過(guò)
3.Step Return (F7) 執(zhí)行完當(dāng)前method,然后return跳出此method
4.step Filter 逐步過(guò)濾
一直執(zhí)行直到遇到未經(jīng)過(guò)濾的位置或斷點(diǎn)(設(shè)置Filter:window-preferences-java-Debug-step
Filtering)
5.resume 重新開(kāi)始執(zhí)行debug,一直運(yùn)行直到遇到breakpoint
6.hit count 設(shè)置執(zhí)行次數(shù) 適合程序中的for循環(huán)(設(shè)置 breakpoint view-右鍵hit
count)
7.inspect 檢查 運(yùn)算。執(zhí)行一個(gè)表達(dá)式顯示執(zhí)行值
8.watch 實(shí)時(shí)地監(jiān)視變量的變化
9.我們常說(shuō)的斷點(diǎn)(breakpoints)是指line breakpoints,除了line
breakpoints,還有其他的斷點(diǎn)類型:field(watchpoint)breakpoint,method
breakpoint,exception breakpoint.
10.field breakpoint 也叫watchpoint(監(jiān)視點(diǎn)) 當(dāng)成員變量被讀取或修改時(shí)暫掛
11.添加method breakpoint 進(jìn)入/離開(kāi)此方法時(shí)暫掛(Run-method breakpoint)
12.添加Exception breakpoint 捕抓到Execption時(shí)暫掛(待續(xù)...)
斷點(diǎn)屬性:
1.hit count 執(zhí)行多少次數(shù)后暫掛 用于循環(huán)
2.enable condition 遇到符合你輸入條件(為ture\改變時(shí))就暫掛
3.suspend thread 多線程時(shí)暫掛此線程
4.suspend VM 暫掛虛擬機(jī)
13.variables 視圖里的變量可以改變變量值,在variables 視圖選擇變量點(diǎn)擊右鍵--change
value.一次來(lái)進(jìn)行快速調(diào)試。
14.debug
過(guò)程中修改了某些code后--〉save&build-->resume-->重新暫掛于斷點(diǎn)
===========================
例如你有如下程序:
public class debugtest {
來(lái)源:(http://blog.sina.com.cn/s/blog_624aa0960100fkrr.html)
- MyEclipse調(diào)試_匆匆過(guò)客_新浪博客
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)處加斷點(diǎn),運(yùn)行到此處時(shí)如果Step Into (F5)為跳入(進(jìn)入函數(shù)),則接著執(zhí)行到(3)。
再執(zhí)行Step Over (F6)執(zhí)行本行,則執(zhí)行到(4)。
最后執(zhí)行Step Return (also F7),則跳出addDays方法,跳到(2)
轉(zhuǎn)http://blog.sina.com.cn/s/blog_624aa0960100fkrr.html
MyEclipse 中顯示行號(hào) 要想顯示行號(hào),按住 Ctrl + F10 選擇 show Line Numbers
eclipse/myeclipse注釋模板的修改 alt+shitf+j
Window --> Java --> Code Style --> Code Templates --> Comments --> types --> Edit
/**
*
* 項(xiàng)目名稱:${project_name}
* 類名稱:${type_name}
* 類描述:
* 創(chuàng)建人:${user}
* 創(chuàng)建時(shí)間:${date} ${time}
* 修改人:${user}
* 修改時(shí)間:${date} ${time}
* 修改備注:
* @version
*
*/
http://www.javaeye.com/topic/585168
myeclipse中如何配置自定義的代碼排版格式 ctrl+shift+f
http://www.tkk7.com/bolo/
http://www.tkk7.com/bolo/archive/2010/04/11/318004.html
com.test.action.user包下:
SaveUserAction.java
SaveUserAction-validation.xml
SaveUserAction.java文件的內(nèi)容:
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的文件內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "
<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文件的內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "
<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>
還有一個(gè)問(wèn)題,就是校驗(yàn)信息會(huì)重復(fù),在錯(cuò)誤的情況下。由以下代碼可以測(cè)試:
@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 是有狀態(tài)的
在spring 配置的action 中加上 scope="prototype";
配置如下:<bean id="saveUserAction"
class="com.test.action.user.SaveUserAction" scope="prototype">
<property name="service" ref="userService"></property>
</bean>
關(guān)鍵字: struts2,spring2,hibernate3,整合
今天在寢室窩了一天,由于前天老師給了個(gè)ss2+toplink的項(xiàng)目源碼,要我去消化。直接看那
三個(gè)整合具吃力,于是先從ssh2入手吧!
所使用的工具和環(huán)境。
jdk6+myeclipse6.5+tomcat6+mysql5+spring2.0+hibernate3+struts2
好了,開(kāi)始我們的第一個(gè)ssh2之旅吧。
首先先分析一下我們的第一個(gè)ssh2項(xiàng)目的需求,簡(jiǎn)單的說(shuō)就是有一張表單,
讓你填寫(xiě)用戶名和密碼,提交后存入數(shù)據(jù)庫(kù)。就這么簡(jiǎn)單,呵呵。
第一步:。我
們首先新建一張mysql數(shù)據(jù)表
sql如下
CREATE TABLE mytest.users (
id INT
NOT NULL,
username VARCHAR(50),
password VARCHAR(50),
PRIMARY KEY (id)
數(shù)據(jù)表創(chuàng)建好后結(jié)構(gòu)如下:
當(dāng)然我已經(jīng)有幾天數(shù)據(jù)添加進(jìn)去了
第二步
打開(kāi)myeclipse,新建一個(gè)web項(xiàng)目,
命名為ssh2-2, java ee規(guī)范我們選擇5,如圖
第三步 務(wù)必小心的一步
導(dǎo)
入ssh2的各個(gè)jar,步驟如下:
選中當(dāng)前的項(xiàng)目后,點(diǎn)擊菜單爛的myeclipse---project
capablities----add hibernate項(xiàng),跳出如圖
務(wù)必按照?qǐng)D示選擇,尤其是copy checkde……一項(xiàng),然后點(diǎn)擊next,默認(rèn)next,去掉specify
database……復(fù)選框,next,去掉create session……復(fù)選框,finish。
再次選中選中當(dāng)前的項(xiàng)目后,點(diǎn)擊
菜單爛的myeclipse---project capablities----add spring項(xiàng),跳出如圖
依然務(wù)必按照如是選擇,jar文件選擇如下5個(gè):
點(diǎn)擊next,
之后按下選擇,務(wù)必,
next后finsh即可。
然后導(dǎo)入struts2的jar
如下5個(gè)放到lib下
然后放入我們的數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar mysql-connector-java-5.0.8-bin.jar 沒(méi)得話附件中有
至
此,包都導(dǎo)入完畢
http://77857.blog.51cto.com/67857/149631
去網(wǎng)上找了一些相關(guān)錯(cuò)誤的信息看了下說(shuō)Hibernate core下面的xerces.jar包的問(wèn)題。刪除后正確了。
如果刪除后還是錯(cuò)誤,看一下項(xiàng)目的lib文件夾下面的是否還有xerces相關(guān)jar包,也刪掉。
記住把tomcat 里面xerces.jar也要?jiǎng)h掉