2014年12月23日 星期二
2014年12月22日 星期一
2014年11月24日 星期一
2014年11月16日 星期日
2014年10月21日 星期二
2014年10月15日 星期三
2014年10月14日 星期二
2014年10月8日 星期三
2014年10月7日 星期二
2014年10月5日 星期日
2014年9月29日 星期一
2014年9月28日 星期日
2014年9月25日 星期四
2014年9月18日 星期四
2014年9月17日 星期三
2014年9月16日 星期二
2014年9月12日 星期五
2014年9月11日 星期四
[輕鬆小品] 小明又出現了 。。。老師瘋了!
小明又出現了 。。。老師瘋了!
課堂上,漂亮女老師嚴肅地給小朋友解釋:“乳”就是“小”的意思。比如“乳猪”就是“小猪”,“乳鴿”就是“小鴿”。
小明,請你用“乳”字造個句。
小明:我家經濟條件不太好,只能住十幾坪的乳房。
老師:(我暈)……這個不行……換一個。
小明:我每天上學都要跳過我家門口的一條乳溝。
老師:(昏倒)……不行……再換一個。
小明:……老師,我實在想不出來了。把我的乳頭都想破了!
老師:……
小明,請你用“乳”字造個句。
小明:我家經濟條件不太好,只能住十幾坪的乳房。
老師:(我暈)……這個不行……換一個。
小明:我每天上學都要跳過我家門口的一條乳溝。
老師:(昏倒)……不行……再換一個。
小明:……老師,我實在想不出來了。把我的乳頭都想破了!
老師:……
小明又出現了……
老師:“多位數減法,遇到低位數不够減時,就向高位數去借。”
小明:“高位數不借怎麼辦?”
老師:“你出去..!”
老師:“多位數減法,遇到低位數不够減時,就向高位數去借。”
小明:“高位數不借怎麼辦?”
老師:“你出去..!”
老師講到大洪水把地球上生物全淹死了。
小明問老師:你確定?
老師說:確定。
小明:那魚呢?
老師:你出去!
小明問老師:你確定?
老師說:確定。
小明:那魚呢?
老師:你出去!
老師突然發話:“好,誰要是能答出我問的下一個問題,就能直接下課回家。”
小明當即把書包往窗外一扔。
“是誰扔的?”
“我扔的!那我回家了啊……”
小明當即把書包往窗外一扔。
“是誰扔的?”
“我扔的!那我回家了啊……”
老師:……
老師出對聯“國興旺,家興旺,國家興旺”。
班長對下聯“天恢宏,地恢宏,天地恢宏”。
小明對的下聯是“你媽的,他媽的,你他媽的”。
老師:“你出去!”
老師出對聯“國興旺,家興旺,國家興旺”。
班長對下聯“天恢宏,地恢宏,天地恢宏”。
小明對的下聯是“你媽的,他媽的,你他媽的”。
老師:“你出去!”
老師說:“猪是一種很有用的動物,它的肉可以吃,它的皮可以做皮革,它的毛可以做刷子,現在有誰說得出它還有其他用途嗎?”
“老師,”小明答,“它的名字可以罵人。”
老師:“你出去!”
“老師,”小明答,“它的名字可以罵人。”
老師:“你出去!”
老師:“請大家想像一下,假如你在一個有恐龍的世界裡,而有一條正準備要吃你,你該麼辦?”
小明:“這還不簡單!馬上停止想像就行。”
老師:“你出去!”
小明:“這還不簡單!馬上停止想像就行。”
老師:“你出去!”
歷史課,老師問小明:你知道李時珍的著作是什麼嗎?
小明答道:我不知道他的著作但是我知道他死前最後一句話說的是什麼。
老師很好奇,問他說什麼。
小明:這草有毒.....
老師:你出去!
小明答道:我不知道他的著作但是我知道他死前最後一句話說的是什麼。
老師很好奇,問他說什麼。
小明:這草有毒.....
老師:你出去!
哈哈………您笑了嗎?動動您的手指頭轉發出去,獨樂樂不如眾樂樂。
程式寫多了,偶爾也要休息一下吧 ^^
2014年9月2日 星期二
2014年9月1日 星期一
2014年8月26日 星期二
2014年8月25日 星期一
2014年8月21日 星期四
2014年8月20日 星期三
2014年8月19日 星期二
2014年8月12日 星期二
2014年8月11日 星期一
2014年8月10日 星期日
2014年8月7日 星期四
2014年7月31日 星期四
2014年7月29日 星期二
2014年7月28日 星期一
2014年7月24日 星期四
2014年7月23日 星期三
2014年7月21日 星期一
2014年7月20日 星期日
2014年7月18日 星期五
2014年7月17日 星期四
2014年7月16日 星期三
2014年7月13日 星期日
[Android]點選兩次返回鍵離開/關閉程式 範例
分享給大家~
以下使用 @Override onKeyDown 這個事件來做,
一開始 先設定一個flag 用來判斷是否連續按了兩次
接著判斷按下的是哪個按鍵,再來
在 onKeyDown 的 Method 中 使用 Thread 來做 該flag的變更
程式碼如下
還有更多的變化可以使用,比如說變更 Toast 的樣式等...
有賴自己的發揮囉
其他方式:
《Android》實現再按一次返回鍵退出應用程式
以下使用 @Override onKeyDown 這個事件來做,
一開始 先設定一個flag 用來判斷是否連續按了兩次
接著判斷按下的是哪個按鍵,再來
在 onKeyDown 的 Method 中 使用 Thread 來做 該flag的變更
程式碼如下
//判斷離開的flag,設定成全域變數
private boolean is_exit = false;
//點兩次返回鍵離開程式
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean returnValue = false;
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()==0 && is_exit == false){
Toast.makeText(getBaseContext(), getText(R.string.str_notice_ExitonDoubleKeyDown), Toast.LENGTH_SHORT).show();
is_exit = true;
//一開始 先設定 返回的 flag = true ,若使用者兩秒內沒有動作,則將該 flag 恢復為 false
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
is_exit = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
returnValue = true;
}else{
returnValue = super.onKeyDown(keyCode, event);
}
return returnValue;
}
還有更多的變化可以使用,比如說變更 Toast 的樣式等...
有賴自己的發揮囉
其他方式:
《Android》實現再按一次返回鍵退出應用程式
2014年7月1日 星期二
[IntelliJ IDEA] 學習資源 + 常用快捷鍵
認識 Gradle
http://www.codedata.com.tw/java/understanding-gradle-1-ant/
http://www.codedata.com.tw/java/understanding-gradle-2-maven/
http://www.codedata.com.tw/java/understanding-gradle-3-getting-started/
http://www.codedata.com.tw/java/understanding-gradle-4-gradle-script/
http://www.codedata.com.tw/java/understanding-gradle-3-gradle-task-abc/
使用 IntelliJ IDEA 13 與 Gradle 打造下一個 Java 專案!
http://blog.lyhdev.com/2013/12/intellij-idea-13-gradle-java.html
利用 IntelliJ IDEA Community Edition (Free) 輕鬆開發 Gradle / Java 專案
http://blog.lyhdev.com/2013/11/intellij-idea-community-edition-free.html
原來IntelliJ IDEA也有中文的網站
http://jdev.tw/blog/787/intellij-idea-chinese-forum
Intellij IDEA 入门 - 配置 Project
http://bigc.at/intellij-idea-project.orz
intellij idea 簡單使用教程
http://rritw.com/a/bianchengyuyan/C__/20120713/185966.html
http://blog.csdn.net/luckarecs/article/details/7474582
使用IntelliJ IDEA 12的Android UI Designer輕鬆寫Android App
http://jdev.tw/blog/2700/intellij-idea-12-android-ui-designer
强烈推荐Java+前端开发工具:IntelliJ IDEA之安装和简单优化配置(视频+配图+福利机)
http://www.youmeek.com/intellij-idea-install-and-optimize-configuration/
常用快捷鍵
【常規】
Ctrl+Shift + Enter,語句完成
“!”,否定完成,輸入運算式時按 “!”鍵
Ctrl+E,最近的檔
Ctrl+Shift+E,最近更改的檔
Shift+Click,可以關閉檔
Ctrl+[ OR ],可以跑到大括弧的開頭與結尾
Ctrl+F12,可以顯示當前檔的結構
Ctrl+F7,可以查詢當前元素在當前檔中的引用,然後按 F3 可以選擇
Ctrl+N,可以快速打開類
Ctrl+Shift+N,可以快速打開檔
Alt+Q,可以看到當前方法的聲明
Ctrl+P,可以顯示參數資訊
Ctrl+Shift+Insert,可以選擇剪貼板內容並插入
Alt+Insert,可以生成構造器/Getter/Setter等
Ctrl+Alt+V,可以引入變數。例如:new String(); 自動導入變數定義
Ctrl+Alt+T,可以把代碼包在一個塊內,例如:try/catch
Ctrl+Enter,導入包,自動修正
Ctrl+Alt+L,格式化代碼
Ctrl+Alt+I,將選中的代碼進行自動縮進編排,這個功能在編輯 JSP 檔時也可以工作
Ctrl+Alt+O,優化導入的類和包
Ctrl+R,替換文本
Ctrl+F,查找文本
Ctrl+Shift+Space,自動補全代碼
Ctrl+空格,代碼提示(與系統輸入法快速鍵衝突)
Ctrl+Shift+Alt+N,查找類中的方法或變數
Alt+Shift+C,最近的更改
Alt+Shift+Up/Down,上/下移一行
Shift+F6,重構 - 重命名
Ctrl+X,刪除行
Ctrl+D,複製行
Ctrl+/或Ctrl+Shift+/,注釋(//或者/**/)
Ctrl+J,自動代碼(例如:serr)
Ctrl+Alt+J,用動態範本環繞
Ctrl+H,顯示類結構圖(類的繼承層次)
Ctrl+Q,顯示注釋文檔
Alt+F1,查找代碼所在位置
Alt+1,快速打開或隱藏工程面板
Ctrl+Alt+left/right,返回至上次流覽的位置
Alt+left/right,切換代碼視圖
Alt+Up/Down,在方法間快速移動定位
Ctrl+Shift+Up/Down,向上/下移動語句
F2 或 Shift+F2,高亮錯誤或警告快速定位
Tab,代碼標籤輸入完成後,按 Tab,生成代碼
Ctrl+Shift+F7,高亮顯示所有該文本,按 Esc 高亮消失
Alt+F3,逐個往下查找相同文本,並高亮顯示
Ctrl+Up/Down,游標中轉到第一行或最後一行下
Ctrl+B/Ctrl+Click,快速打開游標處的類或方法(跳轉到定義處)
Ctrl+Alt+B,跳轉到方法實現處
Ctrl+Shift+Backspace,跳轉到上次編輯的地方
Ctrl+O,重寫方法
Ctrl+Alt+Space,類名自動完成
Ctrl+Alt+Up/Down,快速跳轉搜索結果
Ctrl+Shift+J,整合兩行
Alt+F8,計算變數值
Ctrl+Shift+V,可以將最近使用的剪貼板內容選擇插入到文本
Ctrl+Alt+Shift+V,簡單粘貼
Shift+Esc,不僅可以把焦點移到編輯器上,而且還可以隱藏當前(或最後活動的)工具視窗
F12,把焦點從編輯器移到最近使用的工具視窗
Shift+F1,要打開編輯器游標字元處使用的類或者方法 Java 文檔的流覽器
Ctrl+W,可以選擇單詞繼而語句繼而行繼而函數
Ctrl+Shift+W,取消選擇游標所在詞
Alt+F7,查找整個工程中使用地某一個類、方法或者變數的位置
Ctrl+I,實現方法
Ctrl+Shift+U,大小寫轉化
Ctrl+Y,刪除當前行
Shift+Enter,向下插入新行
psvm/sout,main/System.out.println(); Ctrl+J,查看更多
Ctrl+Shift+F,全域查找
Ctrl+F,查找/Shift+F3,向上查找/F3,向下查找
Ctrl+Shift+S,高級搜索
Ctrl+U,轉到父類
Ctrl+Alt+S,打開設置對話方塊
Alt+Shift+Inert,開啟/關閉列選擇模式
Ctrl+Alt+Shift+S,打開當前專案/模組屬性
Ctrl+G,定位行
Alt+Home,跳轉到巡覽列
Ctrl+Enter,上插一行
Ctrl+Backspace,按單詞刪除
Ctrl+"+/-",當前方法展開、折疊
Ctrl+Shift+"+/-",全部展開、折疊
【調試部分、編譯】
Ctrl+F2,停止
Alt+Shift+F9,選擇 Debug
Alt+Shift+F10,選擇 Run
Ctrl+Shift+F9,編譯
Ctrl+Shift+F10,運行
Ctrl+Shift+F8,查看中斷點
F8,步過
F7,步入
Shift+F7,智能步入
Shift+F8,步出
Alt+Shift+F8,強制步過
Alt+Shift+F7,強制步入
Alt+F9,運行至游標處
Ctrl+Alt+F9,強制運行至游標處
F9,恢復程式
Alt+F10,定位到中斷點
Ctrl+F8,切換行中斷點
Ctrl+F9,生成項目
Alt+1,項目
Alt+2,收藏
Alt+6,TODO
Alt+7,結構
Ctrl+Shift+C,複製路徑
Ctrl+Alt+Shift+C,複製引用,必須選擇類名
Ctrl+Alt+Y,同步
Ctrl+~,快速切換方案(介面外觀、代碼風格、快速鍵映射等功能表)
Shift+F12,還原默認佈局
Ctrl+Shift+F12,隱藏/恢復所有視窗
Ctrl+F4,關閉
Ctrl+Shift+F4,關閉活動選項卡
Ctrl+Tab,轉到下一個拆分器
Ctrl+Shift+Tab,轉到上一個拆分器
【重構】
Ctrl+Alt+Shift+T,彈出重構菜單
Shift+F6,重命名
F6,移動
F5,複製
Alt+Delete,安全刪除
Ctrl+Alt+N,內聯
【查找】
Ctrl+F,查找
Ctrl+R,替換
F3,查找下一個
Shift+F3,查找上一個
Ctrl+Shift+F,在路徑中查找
Ctrl+Shift+R,在路徑中替換
Ctrl+Shift+S,搜索結構
Ctrl+Shift+M,替換結構
Alt+F7,查找用法
Ctrl+Alt+F7,顯示用法
Ctrl+F7,在文件中查找用法
Ctrl+Shift+F7,在檔中高亮顯示用法
【VCS】
Alt+~,VCS 操作功能表
Ctrl+K,提交更改
Ctrl+T,更新項目
Ctrl+Alt+Shift+D,顯示變化
【常用】
CTRL + space Autocomplete 自動完成CTRL + SHIFT + space (new 後面自動提示)
CTRL + SHIFT + ENTER (智能完善代碼 如 if ())
ALT + ENTER (創建測試類和子類) 類似 Eclipse quick fix
CTRL + Q,顯示注釋文檔 javadoc
CTRL + P 顯示方法所需參數
CTRL + SHIFT + I (快速查看實現)
ALT + Insert (自動生成構造函數,get,set方法)
CTRL + SHIFT + / (注釋)
itar後面tab (for循環)
it後面 CTRL + J (很多智能代碼生成)
CTRL + ALT + T (自動生成try,catch)
CTRL + SHIFT + backspace (最後編輯的地方)
CTRL + e (查看所有文件)
CTRL + SHIFT + V (剪貼簿)
ALT + SHIFT + C (最近變更曆史)
CTRL + SHIFT + up/down (移動行、合並選中行)
CTRL + SHIFT + A (自動完成指令 copy 等)
Alt+Up and Alt+Down 在方法間快速移動
CTRL + F12 可以顯示當前檔的結構 等同 ECLIPSE CTRL + O
SHIFT + Esc 切換編輯頁面為主要焦點
ALT + F8,計算變數值 等同 ECLIPSE CTRL + SHIFT + I
Ctrl + Shift + J 可以整合兩行
CTRL + Y 行刪除
CTRL + D 行複製
CTRL + ALT + SHIFT + N 找尋所有名稱(類似 eclipse CTRL + H 的功能)
可直接下載快捷鍵參考文件 Keymap for Windows/Linux
另外習慣使用eclipse 的,可以在操作畫面使用 ctrl+` 來 switch keymap
切換成 eclipse,這樣一來會更得心應手喔
使用 IntelliJ IDEA 所做的Hello World 範例
2014年6月26日 星期四
[MyBatis]簡易CRUD教學
使用工具:
Eclipse Kepler Service Release 2
MySQL 5
使用API:
假設您使用 Maven 來建立專案, .pom 的 dependencies 配置 可以參考
我目前正在使用的配置檔
本範例使用 xml 來設置對應的 mapper 無使用 Annotation
接下來先建立 MaBatis 所需要的 configuration file
在這邊我先設定為 mybatis-config.xml ,習慣上的放置位置在專案中的 resource 目錄中
mybatis-config.xml
properties 標籤 :放置外部配置
typeAliases 標籤:放置別名
environment 標籤:放置環境設定,以id為辨識名稱,可藉此切換環境設定
transactionManage 標籤:type分為JDBC / MANAGEN,JBDC適用於
Tomcat,MANAGEN 適用於 JBoss, WebLogic or GlassFish 這一類可使用EJB來管理
transaction 的環境
dataSource 標籤:type分為POOLED / UNPOOLED 兩種,POOLED 會建立一個連接池(
pool)來管理connection,而UNPOOLED 則是每次連結接建立一個新的 connection
typeHandlers 標籤:在Mappers xml檔案中的SQL對應的輸入資料屬性,如#{studID}等,
皆可自動對應java 的主要屬性及Wrapper,如String/Integer/enum等,若遇到非上述屬性內
的資料,比如說是一個自訂的Object,則需建立一個 extends BaseTypeHandler <T>
的類別,並複寫當中的Method,再藉由typeHandlers 去配置,讓MyBatis 可以找到對應
的資料類別。
jdbc.properties 一樣放置在 resource 目錄中
接著建立 Table Student 所對應的 java bean Student.java
放置在 resource/Models 中
當中的三個 Method,正對應 StudentMapper.xml 中各標籤的 id
代表著該而 xml 的 SQL 語法正與該方法對應
parameterType 傳遞的參數型態
resultType 返回的參數型態
resultMap 為一類別返回型態,而其中的 type="Student" Student 正是之前在
mybatis-config.xml 中 typeAlias 標籤所設定的對應資料方便使用別名而不需使用
com.Models.XXX 的全名
準備用來存取資料用
最後使用junit 來做測試 StudentServiceTest.java
Java Persistence with MyBatis 3
demo程式(右鍵另開視窗下載)
Eclipse Kepler Service Release 2
MySQL 5
使用API:
<mybatis.version>3.2.7</mybatis.version>
<mysql-connector-java.version>5.1.30</mysql-connector-java.version>
<slf4j-api.version>1.7.7</slf4j-api.version>
<slf4j-log4j12.version>1.7.7</slf4j-log4j12.version>
<log4j.version>1.2.17</log4j.version>
流程:
1.建立測試用Table
2.配置 MyBatis 配置檔
3.建立 Table 對應之 java bean
4.建立 Table 對應之 Mapper
5.建立 Mapper對應之 Interface
6.建立 SqlSessionFactory
7.建立 Service
8.建立 TestUnit
首先使用 MySQL 5 Workbench 建立 table
CREATE TABLE STUDENTS
(
stud_id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
email varchar(50) NOT NULL,
dob date DEFAULT NULL,
PRIMARY KEY (stud_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
--塞入測試資料
insert into students(stud_id,name,email,dob)
values (1,'Student1','student1@gmail.com','1983-08-09');
insert into students(stud_id,name,email,dob)
values (2,'Student2','student2@gmail.com','1983-10-21');
--驗證
select * from students;
假設您使用 Maven 來建立專案, .pom 的 dependencies 配置 可以參考
我目前正在使用的配置檔
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>MyBatis_003</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MyBatis_003</name>
<url>http://maven.apache.org</url>
<!-- 設定各dependency 使用的版本 -->
<properties>
<final_name>MyBatis_003</final_name>
<jdk.version>1.6</jdk.version>
<asm.version>3.3.1</asm.version>
<asm-commons.version>3.3.1</asm-commons.version>
<asm-tree.version>3.3.1</asm-tree.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<commons-logging.version>1.1.3</commons-logging.version>
<commons-io.version>2.2</commons-io.version>
<freemarker.version>2.3.9</freemarker.version>
<junit.version>4.11</junit.version>
<javassist.version>3.18.1-GA</javassist.version>
<jquery.version>1.8.2</jquery.version>
<log4j.version>1.2.17</log4j.version>
<mysql-connector-java.version>5.1.30</mysql-connector-java.version>
<mybatis.version>3.2.7</mybatis.version>
<ognl.version>3.0.8</ognl.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<struts2-core.version>2.3.16.3</struts2-core.version>
<struts2-dojo-plugin.version>2.3.16.3</struts2-dojo-plugin.version>
<struts2-json-plugin.version>2.3.16.3</struts2-json-plugin.version>
<struts2-spring-plugin.version>2.3.8</struts2-spring-plugin.version>
<struts2-junit-plugin.version>2.3.16.3</struts2-junit-plugin.version>
<!-- 頁面排版用 siteMesh -->
<struts2-sitemesh-plugin.version>2.3.16.3</struts2-sitemesh-plugin.version>
<!-- Annotation 用 -->
<struts2-convention-plugin.version>2.3.16.3</struts2-convention-plugin.version>
<!-- 頁面排版用 siteMesh -->
<sitemesh.version>2.4.2</sitemesh.version>
<slf4j-api.version>1.7.7</slf4j-api.version>
<slf4j-log4j12.version>1.7.7</slf4j-log4j12.version>
<spring-test.version>3.2.0.RELEASE</spring-test.version>
<spring-web.version>3.2.0.RELEASE</spring-web.version>
<spring-context.version>3.2.0.RELEASE</spring-context.version>
<spring-core.version>3.2.0.RELEASE</spring-core.version>
<spring-beans.version>3.2.0.RELEASE</spring-beans.version>
<xwork-core.version>2.3.16.3</xwork-core.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts2-core.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<dependency>
<groupId>freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>${javassist.version}</version>
</dependency>
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>${ognl.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts.xwork</groupId>
<artifactId>xwork-core</artifactId>
<version>${xwork-core.version}</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>${asm.version}</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-commons</artifactId>
<version>${asm-commons.version}</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-tree</artifactId>
<version>${asm-tree.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-dojo-plugin</artifactId>
<version>${struts2-dojo-plugin.version}</version>
</dependency>
<dependency>
<groupId>com.efsavage.jquery</groupId>
<artifactId>jquery-maven</artifactId>
<version>${jquery.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>${struts2-json-plugin.version}</version>
</dependency>
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-beans.version}</version>
</dependency>
-->
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-core.version}</version>
</dependency>
-->
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-context.version}</version>
</dependency>
-->
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-web.version}</version>
</dependency>
-->
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-test.version}</version>
</dependency>
-->
<!--
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts2-spring-plugin.version}</version>
</dependency>
-->
<!-- junit -->
<!--
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-junit-plugin</artifactId>
<version>${struts2-junit-plugin.version}</version>
</dependency>
-->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-sitemesh-plugin</artifactId>
<version>${struts2-sitemesh-plugin.version}</version>
</dependency>
<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>${sitemesh.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>${struts2-convention-plugin.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-log4j12.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${final_name}</finalName>
<plugins>
<!-- 強制專案編輯使用的compiler版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!-- 可產生java source -->
<!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
-->
<!-- 可產生javadoc 文件 -->
<!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
-->
<!-- 自動下載相關javadoc 及 source -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<downloadSources>false</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
</plugins>
</build>
</project>
本範例使用 xml 來設置對應的 mapper 無使用 Annotation
接下來先建立 MaBatis 所需要的 configuration file
在這邊我先設定為 mybatis-config.xml ,習慣上的放置位置在專案中的 resource 目錄中
mybatis-config.xml
properties 標籤 :放置外部配置
typeAliases 標籤:放置別名
environment 標籤:放置環境設定,以id為辨識名稱,可藉此切換環境設定
transactionManage 標籤:type分為JDBC / MANAGEN,JBDC適用於
Tomcat,MANAGEN 適用於 JBoss, WebLogic or GlassFish 這一類可使用EJB來管理
transaction 的環境
dataSource 標籤:type分為POOLED / UNPOOLED 兩種,POOLED 會建立一個連接池(
pool)來管理connection,而UNPOOLED 則是每次連結接建立一個新的 connection
typeHandlers 標籤:在Mappers xml檔案中的SQL對應的輸入資料屬性,如#{studID}等,
皆可自動對應java 的主要屬性及Wrapper,如String/Integer/enum等,若遇到非上述屬性內
的資料,比如說是一個自訂的Object,則需建立一個 extends BaseTypeHandler <T>
的類別,並複寫當中的Method,再藉由typeHandlers 去配置,讓MyBatis 可以找到對應
的資料類別。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!-- 設定jdbc相關配置檔 -->
<properties resource='jdbc.properties'/>
<!-- 設定對應名稱 -->
<typeAliases>
<typeAlias alias="Student" type="com.Models.Student"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="Models/StudentMapper.xml"/>
</mappers>
</configuration>
jdbc.properties 一樣放置在 resource 目錄中
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=admin
接著建立 Table Student 所對應的 java bean Student.java
package com.Models;接著建立 Student 對應的 Mapper 檔 StudentMapper.xml
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Student {
private Integer studId;
private String name;
private String email;
private Date dob;
@Override
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd",Locale.TAIWAN);
System.out.println("studId=" + studId + " name=" + name + " email=" + email + " dob=" + sdf.format(dob));
return super.toString();
}
public Integer getStudId() {
return studId;
}
public void setStudId(Integer studId) {
this.studId = studId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
}
放置在 resource/Models 中
<?xml version="1.0" encoding="UTF-8"?>接著建立 Interface for StudentMapper.xml StudentMapper.java
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.Models.mappers.StudentMapper">
<resultMap type="Student" id="StudentResult">
<id property="studId" column="stud_id"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="dob" column="dob"/>
</resultMap>
<select id="findAllStudents" resultMap="StudentResult">
SELECT * FROM STUDENTS
</select>
<select id="findStudentById" parameterType="int" resultType="Student">
SELECT STUD_ID AS STUDID, NAME, EMAIL, DOB
FROM STUDENTS WHERE STUD_ID=#{Id}
</select>
<insert id="insertStudent" parameterType="Student">
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB)
VALUES(#{studId },#{name},#{email},#{dob})
</insert>
</mapper>
當中的三個 Method,正對應 StudentMapper.xml 中各標籤的 id
代表著該而 xml 的 SQL 語法正與該方法對應
parameterType 傳遞的參數型態
resultType 返回的參數型態
resultMap 為一類別返回型態,而其中的 type="Student" Student 正是之前在
mybatis-config.xml 中 typeAlias 標籤所設定的對應資料方便使用別名而不需使用
com.Models.XXX 的全名
package com.Models.mappers;接下來建立一Util MyBatisSqlSessionFactory.java 用來建立 MyBatis 所需要的 SqlSessionFactory
import java.util.List;
import com.Models.Student;
public interface StudentMapper {
ListfindAllStudents();
Student findStudentById(Integer id);
void insertStudent(Student student);
}
package com.Utils;接著建立一Service StudentService.java
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory;
public static SqlSessionFactory getSqlSessionFactory() {
if(sqlSessionFactory==null) {
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e.getCause());
}
}
return sqlSessionFactory;
}
public static SqlSession openSession() {
return getSqlSessionFactory().openSession();
}
}
準備用來存取資料用
package com.Services;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.Models.Student;
import com.Models.mappers.StudentMapper;
import com.Utils.MyBatisSqlSessionFactory;
public class StudentService {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* 查詢全部學生
* @return
*/
public ListfindAllStudents()
{
SqlSession sqlSession =
MyBatisSqlSessionFactory.openSession();
try {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
return studentMapper.findAllStudents();
} finally {
//If sqlSession is not closed
//then database Connection associated this sqlSession will not be returned to pool
//and application may run out of connections.
sqlSession.close();
}
}
/**
* studId 尋找學生
* @param studId
* @return
*/
public Student findStudentById(Integer studId)
{
logger.debug("Select Student By ID :{}", studId);
SqlSession sqlSession = MyBatisSqlSessionFactory.openSession();
try {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
return studentMapper.findStudentById(studId);
//上面也可以用下面取代,不須再經過mapper手續
//Student student = (Student)sqlSession. selectOne("com.mybatis3.mappers.StudentMapper.findStudentById", studId);
} finally {
sqlSession.close();
}
}
/**
* 新增學生
* @param student
*/
public void createStudent(Student student)
{
SqlSession sqlSession = MyBatisSqlSessionFactory.openSession();
try {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
studentMapper.insertStudent(student);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
}
最後使用junit 來做測試 StudentServiceTest.java
package com.Tests;參照資料:
import java.util.Date;
import java.util.List;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import com.Models.Student;
import com.Services.StudentService;
public class StudentServiceTest {
private static StudentService studentService;
@BeforeClass
public static void setup(){
studentService = new StudentService();
}
@AfterClass
public static void teardown(){
studentService = null;
}
@Test
public void testFindAllStudents(){
Liststudents = studentService.findAllStudents();
Assert.assertNotNull(students);
for (Student student : students) {
System.out.println(student);
}
}
@Test
public void testFindStudentById() {
Student student = studentService.findStudentById(1);
Assert.assertNotNull(student);
System.out.println(student);
}
@Test
public void testCreateStudent() {
Student student = new Student();
int id = 5;
student.setStudId(id);
student.setName("student_"+id);
student.setEmail("student_"+id+"gmail.com");
student.setDob(new Date());
studentService.createStudent(student);
Student newStudent = studentService.findStudentById(id);
Assert.assertNotNull(newStudent);
}
}
Java Persistence with MyBatis 3
demo程式(右鍵另開視窗下載)
訂閱:
文章 (Atom)