最近身體不太好,轉貼一則文章,提醒自己多多休息和鍛煉。
------------------------
只要踏入在我們IT這個行業, 過不了幾年身體就是亞健康狀態,過渡的話就可能會“過勞死”,要想防止“過勞死”,就必須了解身體為我們發出的“過勞死”信號。
??? 研究者認為:在這27項癥狀和因素中占有7項以上,即是有過度疲勞危險者,占10項以上就可能在任何時候發生“過勞死”。同時,在第1項到第9項中占兩項以上或者在第10項到18項中占3項以上者也要特別注意,這27項癥狀和因素分別是:
1.經常感到疲倦,忘性大;
2.酒量突然下降,即使飲酒也不感到有滋味;
3.突然覺得有衰老感;
4.肩部和頸部發木發僵;
5.因為疲勞和苦悶失眠;
6.有一點小事也煩躁和生氣;
7.經常頭痛和胸悶;
8.發生高血壓、糖尿病,心電圖測試結果不正常;
9.體重突然變化大,出現“將軍肚”;
10.幾乎每天晚上聚餐飲酒;
11.一天喝5杯以上咖啡;
12.經常不吃早飯或吃飯時間不固定;
13.喜歡吃油炸食品;
14.一天吸煙30支以上;
15.晚上10時也不回家或者12時以后回家占一半以上;
16.上下班單程占2小時以上;
17.最近幾年運動也不流汗;
18.自我感覺身體良好而不看病;
19.一天工作10小時以上;
20.星期天也上班;
21.經常出差,每周只在家住兩三天;
22.夜班多,工作時間不規則;
23.最近有工作調動或工作變化;
24.升職或者工作量增多;
25.最近以來加班時間突然增加;
26.人際關系突然變壞;
27.最近工作失誤或者發生不和。
針對如何擺脫過度疲勞,何永成博士開出如下處方:
消除腦力疲勞法:適當參加體育鍛煉和文娛活動,積極休息。如果是心理疲勞,千萬不要濫用鎮靜劑、安眠藥等,應找出引起感情憂郁的原因,并求得解脫。病理性疲勞,應及時找醫生檢查和治療。
飲食補充法:注意飲食營養的搭配。多吃含蛋白質、脂肪和豐富的B族維生素食物,如豆腐、牛奶、魚肉類,多吃水果、蔬菜,適量飲水。
休息恢復法:每天都要留出一定的休息時間。聽音樂、繪畫、散步等有助解除生理疲勞。
科學健身方法:一是有氧運動,如跑步、打球、打拳、騎車、爬山等;二是腹式呼吸,全身放松后深呼吸,鼓足腹部,憋一會兒再慢慢呼出;三是做保健操;四是點穴按摩。
??? 哥們, 上面27條在你身上出現幾條癥狀了?? 怕怕吧??
建議哥們們每天早上和傍晚各抽出一小時鍛煉身體,畢竟身體是革命的本錢!
轉自: 電子商務論壇 http://bbs.eczn.com/
Hibenate作為一種Java對象持久化技術,在很多大型的多層體系構架中得到應用,比如在開發一套電子商務系統可以以J2EE作為體系構架,Structs作為java Web應用框架,以Hibenate實現對象持久化任務,以EJB或者普通的javabean實現業務邏輯,其實現過程的復雜度可想而知,下面收集一些在Hibenate中多對多關系中應用技巧給大家分享
1.cascade="..."?
cascade屬性并不是多對多關系一定要用的,有了它只是讓我們在插入或刪除對像時更方便一些,只要在cascade的源頭上插入或是刪除,所有cascade的關系就會被自己動的插入或是刪除。便是為了能正確的cascade,unsaved-value是個很重要的屬性。
Hibernate通過這個屬性來判斷一個對象應該save還是update,如果這齠韻蟮膇d是unsaved-value的話,那說明這個對象不是persistence object要save(insert);如果id是非unsaved-value的話,那說明這個對象是persistence object(數據庫中已存在),只要update就行了。saveOrUpdate方法用的也是這個機制。
2.inverse="ture"?
inverse屬性默認是false的,就是說關系的兩端都來維護關系。這個意思就是說,如有一個Student, Teacher和TeacherStudent表,Student和Teacher是多對多對多關系,這個關系由TeacherStudent這個表來表現。那么什么時候插入或刪除TeacherStudent表中的記錄來維護關系呢?在用hibernate時,我們不會顯示的對TeacherStudent表做操作。
對TeacherStudent的操作是hibernate幫我們做的。hibernate就是看hbm文件中指定的是"誰"維護關系,那個在插入或刪除"誰"時,就會處發對關系表的操作。前提是"誰"這個對象已經知道這個關系了,就是說關系另一頭的對象已經set或是add到"誰"這個對象里來了。前面說過inverse默認是false,就是關系的兩端都維護關系,對其中任一個操作都會處發對表系表的操作。當在關系的一頭,如Student中的bag或set中用了inverse="true"時,那就代表關系是由另一關維護的(Teacher)。就是說當這插入Student時,不會操作TeacherStudent表,即使Student已經知道了關系。只有當Teacher插入或刪除時才會處發對關系表的操作。
所以,當關系的兩頭都用inverse="true"是不對的,就會導致任何操作都不處發對關系表的操作。當兩端都是inverse="false"或是default值是,在代碼對關系顯示的維護也是不對的,會導致在關系表中插入兩次關系。在一對多關系中inverse就更有意義了。在多對多中,在哪端inverse="true"效果差不多(在效率上)。但是在一對多中,如果要一方維護關系,就會使在插入或是刪除"一"方時去update"多"方的每一個與這個"一"的對象有關系的對象。
而如果讓"多"方面維護關系時就不會有update操作,因為關系就是在多方的對象中的,直指插入或是刪除多方對象就行了。當然這時也要遍歷"多"方的每一個對象顯示的操作修關系的變化體現到DB中。不管怎樣說,還是讓"多"方維護關系更直觀一些。
3.cascade和inverse有什么區別?
可以這樣理解,cascade定義的是關系兩端對象到對象的級聯關系;而inverse定義的是關系和對象的級聯關系。
4.net.sf.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): 2, of class: Xxxxx
這個問題出現在要刪除關系的一頭時。如,要刪除一個已經和Student有關系的Teacher。當tx.commit();時才會拋出這個異常。這時一個在關系另一頭的Student對象中的Set或是List中把這個Teacher對象顯示的remove掉,再session.delete(這個teacher);。這是為了防止在Student端有cascade時把這個Teacher對象再存回DB。
所以,這個異常的只有在Student的關系定義中有cascade="...",而且沒有像上面說的顯示的解除關系時才會出現。所以防止出現這個異常的方法就是:1,在Student端不用cascade;2,或是用cascade的話,就顯示的刪除對像中的關系。 3,在Teacher端要用cascade。
5.net.sf.hibernate.HibernateException: identifier of an instance of my.MyObject altered from N to N
這個異常其實不是多對多中常遇到的,但是這個異常的提示不make sense,所以提一下,是因為id的java對象中的type和hbm文件中定義的不一樣,如:java中用long,而hbm中用type="integer",并且generator用的是identity時就會出現。
延遲初始化錯誤是運用Hibernate開發項目時最常見的錯誤。如果對一個類或者集合配置了延遲檢索策略,那么必須當代理類實例或代理集合處于持久化狀態(即處于Session范圍內)時,才能初始化它。如果在游離狀態時才初始化它,就會產生延遲初始化錯誤。
下面把Customer.hbm.xml文件的<class>元素的lazy屬性設為true,表示使用延遲檢索策略:
<class name="mypack.Customer" table="CUSTOMERS" lazy="true">
當執行Session的load()方法時,Hibernate不會立即執行查詢CUSTOMERS表的select語句,僅僅返回Customer類的代理類的實例,這個代理類具由以下特征:
(1) 由Hibernate在運行時動態生成,它擴展了Customer類,因此它繼承了Customer類的所有屬性和方法,但它的實現對于應用程序是透明的。
(2) 當Hibernate創建Customer代理類實例時,僅僅初始化了它的OID屬性,其他屬性都為null,因此這個代理類實例占用的內存很少。
(3) 當應用程序第一次訪問Customer代理類實例時(例如調用customer.getXXX()或customer.setXXX()方法),Hibernate會初始化代理類實例,在初始化過程中執行select語句,真正從數據庫中加載Customer對象的所有數據。但有個例外,那就是當應用程序訪問Customer代理類實例的getId()方法時,Hibernate不會初始化代理類實例,因為在創建代理類實例時OID就存在了,不必到數據庫中去查詢。
提示:Hibernate采用CGLIB工具來生成持久化類的代理類。CGLIB是一個功能強大的Java字節碼生成工具,它能夠在程序運行時動態生成擴展Java類或者實現Java接口的代理類。關于CGLIB的更多知識,請參考:http://cglib.sourceforge.net/。
以下代碼先通過Session的load()方法加載Customer對象,然后訪問它的name屬性:
tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,new Long(1));
customer.getName();
tx.commit();
在運行session.load()方法時Hibernate不執行任何select語句,僅僅返回Customer類的代理類的實例,它的OID為1,這是由load()方法的第二個參數指定的。當應用程序調用customer.getName()方法時,Hibernate會初始化Customer代理類實例,從數據庫中加載Customer對象的數據,執行以下select語句:
select * from CUSTOMERS where ID=1;
select * from ORDERS where CUSTOMER_ID=1;
當<class>元素的lazy屬性為true,會影響Session的load()方法的各種運行時行為,下面舉例說明。
1.如果加載的Customer對象在數據庫中不存在,Session的load()方法不會拋出異常,只有當運行customer.getName()方法時才會拋出以下異常:
ERROR LazyInitializer:63 - Exception initializing proxy
net.sf.hibernate.ObjectNotFoundException: No row with the given identifier exists: 1, of class:
mypack.Customer
2.如果在整個Session范圍內,應用程序沒有訪問過Customer對象,那么Customer代理類的實例一直不會被初始化,Hibernate不會執行任何select語句。以下代碼試圖在關閉Session后訪問Customer游離對象:
tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,new Long(1));
tx.commit();
session.close();
customer.getName();
由于引用變量customer引用的Customer代理類的實例在Session范圍內始終沒有被初始化,因此在執行customer.getName()方法時,Hibernate會拋出以下異常:
ERROR LazyInitializer:63 - Exception initializing proxy
net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed
由此可見,Customer代理類的實例只有在當前Session范圍內才能被初始化。
3.net.sf.hibernate.Hibernate類的initialize()靜態方法用于在Session范圍內顯式初始化代理類實例,isInitialized()方法用于判斷代理類實例是否已經被初始化。例如:
tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,new Long(1));
if(!Hibernate.isInitialized(customer))
Hibernate.initialize(customer);
tx.commit();
session.close();
customer.getName();
以上代碼在Session范圍內通過Hibernate類的initialize()方法顯式初始化了Customer代理類實例,因此當Session關閉后,可以正常訪問Customer游離對象。
4.當應用程序訪問代理類實例的getId()方法時,不會觸發Hibernate初始化代理類實例的行為,例如:
tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,new Long(1));
customer.getId();
tx.commit();
session.close();
customer.getName();
當應用程序訪問customer.getId()方法時,該方法直接返回Customer代理類實例的OID值,無需查詢數據庫。由于引用變量customer始終引用的是沒有被初始化的Customer代理類實例,因此當Session關閉后再執行customer.getName()方法,Hibernate會拋出以下異常:
ERROR LazyInitializer:63 - Exception initializing proxy
net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed
使用FileUpload組件實現文件上傳
文件上傳在web應用中非常普遍,要在servlet/jsp環境中實現文件上傳功能非常容易,因為網上已經有許多用java開發的組件用于文件上傳,本文以commons-fileupload組件為例,為servlet/jsp應用添加文件上傳功能。
common-fileupload組件是apache的一個開源項目之一,可以從http://jakarta.apache.org/commons/fileupload/下載。該組件簡單易用,可實現一次上傳一個或多個文件,并可限制文件大小。
下載后解壓zip包,將commons-fileupload-1.0.jar復制到tomcat的webapps\你的webapp\WEB-INF\lib\下,如果目錄不存在請自建目錄。
新建一個servlet: Upload.java用于文件上傳:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
public class Upload extends HttpServlet {
????private String uploadPath = "C:\\upload\\"; // 用于存放上傳文件的目錄
????private String tempPath = "C:\\upload\\tmp\\"; // 用于存放臨時文件的目錄
????public void doPost(HttpServletRequest request, HttpServletResponse response)
????????throws IOException, ServletException
????{
????}
}
當servlet收到瀏覽器發出的Post請求后,在doPost()方法中實現文件上傳。以下是示例代碼:
public void doPost(HttpServletRequest request, HttpServletResponse response)
????throws IOException, ServletException
{
????try {
????????DiskFileUpload fu = new DiskFileUpload();
????????// 設置最大文件尺寸,這里是4MB
????????fu.setSizeMax(4194304);
????????// 設置緩沖區大小,這里是4kb
????????fu.setSizeThreshold(4096);
????????// 設置臨時目錄:
????????fu.setRepositoryPath(tempPath);
????????// 得到所有的文件:
????????List fileItems = fu.parseRequest(request);
????????Iterator i = fileItems.iterator();
????????// 依次處理每一個文件:
????????while(i.hasNext()) {
????????????FileItem fi = (FileItem)i.next();
????????????// 獲得文件名,這個文件名包括路徑:
????????????String fileName = fi.getName();
????????????if(fileName!=null) {
????????????????// 在這里可以記錄用戶和文件信息
????????????????// ...
????????????????// 寫入文件a.txt,你也可以從fileName中提取文件名:
????????????????fi.write(new File(uploadPath + "a.txt"));
????????????}
????????}
????????// 跳轉到上傳成功提示頁面
????}
????catch(Exception e) {
????????// 可以跳轉出錯頁面
????}
}
如果要在配置文件中讀取指定的上傳文件夾,可以在init()方法中執行:
public void init() throws ServletException {
????uploadPath = ....
????tempPath = ....
????// 文件夾不存在就自動創建:
????if(!new File(uploadPath).isDirectory())
????????new File(uploadPath).mkdirs();
????if(!new File(tempPath).isDirectory())
????????new File(tempPath).mkdirs();
}
編譯該servlet,注意要指定classpath,確保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar。
配置servlet,用記事本打開tomcat\webapps\你的webapp\WEB-INF\web.xml,沒有的話新建一個。典型配置如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
????PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
????"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
????<servlet>
????????<servlet-name>Upload</servlet-name>
????????<servlet-class>Upload</servlet-class>
????</servlet>
????<servlet-mapping>
????????<servlet-name>Upload</servlet-name>
????????<url-pattern>/fileupload</url-pattern>
????</servlet-mapping>
</web-app>
配置好servlet后,啟動tomcat,寫一個簡單的html測試:
<form action="fileupload" method="post"
enctype="multipart/form-data" name="form1">
??<input type="file" name="file">
??<input type="submit" name="Submit" value="upload">
</form>
注意action="fileupload"其中fileupload是配置servlet時指定的url-pattern。
spring下載包中doc目錄下的MVC-step-by-step和sample目錄下的例子都是比較好的spring開發的例子.
1、如何學習Spring?
你可以通過下列途徑學習spring:
(1) spring下載包中doc目錄下的MVC-step-by-step和sample目錄下的例子都是比較好的spring開發的例子。
(2) AppFuse集成了目前最流行的幾個開源輕量級框架或者工具 Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo's WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts 。
你可以通過AppFuse源代碼來學習spring。
AppFuse網站:http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse
(3)Spring 開發指南(夏昕)(http://www.xiaxin.net/Spring_Dev_Guide.rar)
一本spring的入門書籍,里面介紹了反轉控制和依賴注射的概念,以及spring的bean管理,spring的MVC,spring和hibernte,iBatis的結合。
(4) spring學習的中文論壇
SpringFramework中文論壇(http://spring.jactiongroup.net)
Java視線論壇(http://forum.javaeye.com)的spring欄目
2、利用Spring框架編程,console打印出log4j:WARN Please initialize the log4j system properly?
說明你的log4j.properties沒有配置。請把log4j.properties放到工程的classpath中,eclipse的classpath為bin目錄,由于編譯后src目錄下的文件會拷貝到bin目錄下,所以你可以把log4j.properties放到src目錄下。
這里給出一個log4j.properties的例子:
log4j.rootLogger=DEBUG,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n |
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> <property name="dataSource"><ref bean="dataSource"/></property> <property name="mappingResources"> <list> <value>User.hbm.xml</value> 錯,改為: <value>com/yz/spring/domain/User.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> net.sf.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> |
public class PostManageImpl extends BaseManage implements PostManage { private PostDAO dao = null; public void setPostDAO(PostDAO postDAO){ this.dao = postDAO; } } |
<bean id="postManage" parent="txProxyTemplate"> <property name="target"> <bean class="com.yz.spring.service.implement.PostManageImpl"> <property name="postDAO"><ref bean="postDAO"/></property> 對 <property name="dao"><ref bean="postDAO"/></property> 錯 </bean> </property> </bean> |
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="userManage" parent="txProxyTemplate"> <property name="target"> <bean class="com.yz.spring.service.implement.UserManageImpl"> <property name="userDAO"><ref bean="userDAO"/></property> </bean> </property> </bean> |
String[] paths = {"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml", "com/yz/spring/service/applicationContext-service.xml"}; ctx = new ClassPathXmlApplicationContext(paths); |
<servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext-hibernate.xml</param-value> <param-value>/WEB-INF/applicationContext-service.xml</param-value> </context-param> |
<context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param> |
Expert One on one J2EE Design and Development Expert One on one J2EE Development Without EJB |
http://www.martinfowler.com/articles/injection.html |
http://www.jactiongroup.net/reference/html/index.html(中文版,未全部翻譯) |
我們可以通過helloworld來理解這幾個縮寫詞的具體含義:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("helloworld");
}
}
編譯之后, 我們得到了HelloWorld.class(圖中的"Your program's class files")
在HelloWorld里面, 我們調用了 JAVA API中的 java.lang.System這個類的靜態成員對象 out, out 的靜態方法: public static void println(String string);
然后我們讓虛擬機器來執行這個HelloWorld。
1. 虛擬機會在classpath中找到HelloWorld.class。
2. 虛擬機中的解釋器(interpret)會把HelloWorld.class解釋成字節碼。
3. 把解釋后的字節碼交由execution engin執行。
4. execution engin會調用native method(即平臺相關的字節碼)來在host system的stdout(顯示器)的指定部分打印出指定的字符串。
5. 這樣, 我們就看到"helloworld"字樣了。
有了這個流程后, 我們就好理解上面幾個術語了:
a. JDK: java develop kit (JAVA API包)
b. SDK: software develop kit, 以前JDK 叫做java software develop kit, 后來出了1.2版本后, 就改名叫jdk了, 省時省力, 節約成本。
c. JRE. java runtime environment 我們的helloworld必須在JRE(JAVA運行環境,JAVA運行環境又叫JAVA平臺)里面, 才能跑起來。 所以, 顯然地, JRE其實就是JDK + JVM
d.
JVM java virtual machine. 簡單地講, 就是把class文件變成字節碼, 然后送到excution engin中執行。
而為什么叫虛擬機, 而不叫真實機呢? 因為JVM本身是又不能運算, 又不能讓顯示器顯示"helloworld"的, 它只能再調用host
system的API, 比如在w32里面就會調c++的API, 來讓CPU幫他做做算術運算,
來調用c++里面的API來控制顯示器顯示顯示字符串。 而這些API不是JDK里面有的,我們平時又看不見的,所以我們就叫它native
api了(亦曰私房XX)。
e. 解釋平臺無關。 有人會說, 在linux的里面調用native api與w32里面調用的api肯定不一樣吧? 那為什么說JAVA是平臺無關的呢?
其
實是這樣的, 君不見java.sun.com里面又有jdk-for-w32又有jdk-for-linux下載嗎? 剛才不是說了嗎?
native api, native api, 就是我們平時看不見的api嗎! 調用native這些煩瑣的活兒都讓jdk去做了。
所以我們調用的時候只用知道jdk(java api) 里面的java.io.*能提供磁盤訪問功能, java.awt.*
能畫個框框畫個圓圓就行了嗎。 至于JDK又是怎么調用的, 在LINXU上更圓呢? 還是在W32上更圓,(x)
這個就是JDK個人的事情了。(理論上講是一樣圓的, 當然這又和顯示器是否純平相關了:D)
同時, 這里就引申出了另一個話題。
既如何編寫平臺無關的JAVA程序。 其中關鍵的一條, 就是調用且只調用jdk中的API, 而不要私自調用native api。 原因很簡單啊,
JDK-for-linux和JDK-for-w32表面都是一樣的,
所以我在w32里面調用JDK寫的java程序,在linux里面也會一樣的寫法啊, 所以就可以移植來移植去都沒問題。(b)
但是如果我在w32里面調用了 一個圖形顯示的native api, 當我移植到linux去的時候, 誰又能保證里面也有相同名稱,
相同參數,相同返回值, 相同功能的native api供我調用呢!(?)
-以上是個人理解, 如有錯漏之處, 萬望指出, 共同進步!
2.Re:[入門]什么叫JDK,SDK,JRE,JVM [Re: sojan] | Copy to clipboard |
Posted by: reddream Posted on: 2003-11-27 13:02 sojan wrote: 這句話不對。JRE顧名思義只是java class運行時需要的環境,JDK不僅包含了JRE,還提供了開發調試java程序需要的工具 |
3.Re:[入門]什么叫JDK,SDK,JRE,JVM [Re: sojan] | Copy to clipboard |
Posted by: sojan Posted on: 2003-11-27 13:30 我將JRE(Java運行環境)理解為JAVA PLATFORM, 既JAVA平臺。 reddream 的話也是對的, JRE同時也包括讓JAVA運行起來的工具,比如: javac(編譯), java(運行), javap(反編譯)這些。 |
??? JRE的地位就象一臺PC機一樣,我們寫好的Win32應用程序需要操作系統幫我們運行,同樣的,我們編寫的Java程序也必須要JRE才能運行。所以當 你裝完JDK后,如果分別在硬盤上的兩個不同地方安裝了兩套JRE,那么你可以想象你的電腦有兩臺虛擬的Java PC機,都具有運行Java程序的功能。所以我們可以說,只要你的電腦安裝了JRE,就可以正確運行Jav a應用程序。
???? ?1、為什么Sun要讓JDK安裝兩套相同的JRE?這是因為JDK里面有很多用Java所編寫的開發工具(如javac.exe、jar.exe等),而且都放置在
???? 2、如果一臺電腦安裝兩套以上的JRE,誰來決定呢?這個重大任務就落在java.exe身上。Java.exe的工作就是找到合適的JRE來運行 Java程序。 Java.exe依照底下的順序來查找JRE:自己的目錄下有沒有JRE;父目錄有沒有JRE;查詢注冊表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 所以java.exe的運行結果與你的電腦里面哪個JRE被執行有很大的關系。
??? 3、介紹JVM JRE目錄下的Bin目錄有兩個目錄:server與client。這就是真正的jvm.dll所在。 jvm.dll無法單獨工作,當jvm.dll啟動后,會使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動態鏈接庫),而這些輔助用的動態鏈接庫(.dll)都必須位 于jvm.dll所在目錄的父目錄之中。因此想使用哪個JVM,只需要設置PATH,指向JRE所在目錄底下的jvm.dll。
JAVA_HOME,CLASSPATH,PATH.
只有這三個java環境變量。
JAVA_HOME指向的是JDK的安裝路徑,如C:\j2sdk1.4.2_09,在這路徑下你應該能夠找到bin、lib等目錄。當然,你愿意放哪里,就放哪里。我的是放在c盤根目錄
JAVA_HOME=C:\j2sdk1.4.2_09;
PATH環境變量,目的是為了指向JDK的bin目錄,這里面放的是各種編譯執行命令。
我的設置是:
PATH=C:\j2sdk1.4.2_09\bin;C:\j2sdk1.4.2_09\jre\bin;
需要說明,系統中本身就有PATH環境變量,只要把C:\j2sdk1.4.2_09\bin;C:\j2sdk1.4.2_09\jre\bin;直接放到后面即可,中間有分號間隔。
如果你的JAVA_HOME是別的目錄,就對照著該吧。
CLASSPATH最重要。
CLASSPATH=.;C:\j2sdk1.4.2_09\lib;C:\j2sdk1.4.2_09\lib\tools.jar;這時我的設置。這是類的路徑。前面加上點和分號,意為首先在當前目錄查找,以后你自己編寫類的時候自然明白這點。
那么為什么要設置環境變量,以前編寫c語言的時候怎么不設置呢?
由于WINDOWS默認的搜索順序,先搜索當前目錄的,再搜索系統目錄的,再搜索PATH環境變量設定的。你在編寫java程序時,在一個指定目錄,這里沒有編譯執行命令,而系統目錄里面,也沒有編譯執行命令。所以放在環境變量里面, 從這里你應該可以看出,環境變量是干什么用的了。簡單說就是告訴操作系統到那里去找指定的文件。你要是把系統目錄給改了,看你用dos命令還好不好使。
配置完后,在命令提示符下,鍵入java -version,如果出現java的一些信息,說明配置成功
//問題一
在命令行中輸入 javac HelloWorld.java 后出現如下錯誤:
′javac′ 不是內部或外部命令,也不是可運行的程序或批處理文件。
(javac: Command not found)
這個錯誤產生的原因是沒有設置好環境變量path。下面以windows xp為例子來講解如何設置環境變量path。右鍵單擊我的電腦->屬性->高級->環境變量,然后在系統變量中選擇添加,變量名為path,變量值為d:\j2se\bin(這里假設你的jdk的安裝d:\j2se,當然如果你的jdk的安裝目錄是別的目錄的話,比如c:\jdk1.2,那么你的path應該設置為c:\jdk1.2\bin。)。最后不要忘記了重新啟動,當然你也可以再接著設置完另一個環境變量classpath后再重新啟動。
//問題二
在命令行中輸入 java HelloWorld 后出現如下錯(注意不是 java HelloWorld.class 。)
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
這個錯誤產生的原因是沒有設置好環境變量classpath,這時只需要將classpath的值設置為
.;d:\j2se\lib\dt.jar;d:\j2se\lib\tools.jar
當然,如果你的jdk的安裝目錄是在別的地方的話,比如c:\jdk1.2,那么你的classpath變量應該設置為
.;c:\jdk1.2\lib\dt.jar;c:\jdk1.2\lib\tools.jar
最后重新啟動,然后再小心:)的去編譯你的HelloWorld.java程序
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl為數據庫的SID String user="test"; String password="test"; Connection conn= DriverManager.getConnection(url,user,password); |
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); String url="jdbc:db2://localhost:5000/sample"; //sample為你的數據庫名 String user="admin"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); |
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; //mydb為數據庫 String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); |
Class.forName("com.sybase.jdbc.SybDriver").newInstance(); String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB為你的數據庫名 Properties sysProps = System.getProperties(); SysProps.put("user","userid"); SysProps.put("password","user_password"); Connection conn= DriverManager.getConnection(url, SysProps); |
Class.forName("com.informix.jdbc.IfxDriver").newInstance(); String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; user=testuser;password=testpassword"; //myDB為數據庫名 Connection conn= DriverManager.getConnection(url); |
Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //myDB為數據庫名 Connection conn= DriverManager.getConnection(url); |
Class.forName("org.postgresql.Driver").newInstance(); String url ="jdbc:postgresql://localhost/myDB" //myDB為數據庫名 String user="myuser"; String password="mypassword"; Connection conn= DriverManager.getConnection(url,user,password); |
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ; String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb"); Connection conn = DriverManager.getConnection(url,"",""); Statement stmtNew=conn.createStatement() ; |
try{ Class.forName(com.mysql.jdbc.Driver); System.out.println(Success loading Mysql Driver!); }catch(Exception e) { System.out.println(Error loading Mysql Driver!); e.printStackTrace(); } |
jdbc:mysql://localhost/databasename[?pa=va][&pa=va] |
PreparedStatement pstmt3D null; try { ((OraclePreparedStatement)pstmt).setExecuteBatch(30); ... pstmt.executeUpdate(); } |
|
|
|
|
|
|