2014年9月11日 星期四

[輕鬆小品] 小明又出現了 。。。老師瘋了!

小明又出現了 。。。老師瘋了!
課堂上,漂亮女老師嚴肅地給小朋友解釋:“乳”就是“小”的意思。比如“乳猪”就是“小猪”,“乳鴿”就是“小鴿”。
小明,請你用“乳”字造個句。
  小明:我家經濟條件不太好,只能住十幾坪的乳房。
  老師:(我暈)……這個不行……換一個。
  小明:我每天上學都要跳過我家門口的一條乳溝。
  老師:(昏倒)……不行……再換一個。
  小明:……老師,我實在想不出來了。把我的乳頭都想破了!
老師:……



小明又出現了……
老師:“多位數減法,遇到低位數不够減時,就向高位數去借。”
小明:“高位數不借怎麼辦?”
老師:“你出去..!”
老師講到大洪水把地球上生物全淹死了。
小明問老師:你確定?
老師說:確定。
小明:那魚呢?
老師:你出去!
老師突然發話:“好,誰要是能答出我問的下一個問題,就能直接下課回家。”
小明當即把書包往窗外一扔。
“是誰扔的?”
“我扔的!那我回家了啊……”
老師:……
老師出對聯“國興旺,家興旺,國家興旺”。
班長對下聯“天恢宏,地恢宏,天地恢宏”。
小明對的下聯是“你媽的,他媽的,你他媽的”。
老師:“你出去!”
老師說:“猪是一種很有用的動物,它的肉可以吃,它的皮可以做皮革,它的毛可以做刷子,現在有誰說得出它還有其他用途嗎?”
“老師,”小明答,“它的名字可以罵人。”
老師:“你出去!”
老師:“請大家想像一下,假如你在一個有恐龍的世界裡,而有一條正準備要吃你,你該麼辦?”
小明:“這還不簡單!馬上停止想像就行。”
老師:“你出去!”
歷史課,老師問小明:你知道李時珍的著作是什麼嗎?
小明答道:我不知道他的著作但是我知道他死前最後一句話說的是什麼。
老師很好奇,問他說什麼。
小明:這草有毒.....
老師:你出去!

哈哈………您笑了嗎?動動您的手指頭轉發出去,獨樂樂不如眾樂樂。
程式寫多了,偶爾也要休息一下吧 ^^

2014年7月13日 星期日

[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 範例

其他相關資料
http://blog.csdn.net/jackrex/article/details/37912071
Android Studio 快捷鍵

2014年6月26日 星期四

[MyBatis]簡易CRUD教學

使用工具:
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;

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;
}
}

接著建立 Student 對應的 Mapper 檔 StudentMapper.xml 
放置在 resource/Models 中

<?xml version="1.0" encoding="UTF-8"?>
<!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>

接著建立 Interface for StudentMapper.xml StudentMapper.java
當中的三個 Method,正對應 StudentMapper.xml 中各標籤的 id
代表著該而 xml 的 SQL 語法正與該方法對應
parameterType 傳遞的參數型態
resultType 返回的參數型態  
resultMap 為一類別返回型態,而其中的 type="Student" Student 正是之前在
 mybatis-config.xml 中 typeAlias 標籤所設定的對應資料方便使用別名而不需使用
 com.Models.XXX 的全名
  
package com.Models.mappers;

import java.util.List;

import com.Models.Student;

public interface StudentMapper {
List findAllStudents();
Student findStudentById(Integer id);
void insertStudent(Student student);
}

接下來建立一Util MyBatisSqlSessionFactory.java 用來建立 MyBatis 所需要的 SqlSessionFactory
 
package com.Utils;

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();
}
}
接著建立一Service StudentService.java
準備用來存取資料用
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 List findAllStudents()
{
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(){
List students = 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程式(右鍵另開視窗下載)
Related Posts Plugin for WordPress, Blogger...