最近抽空學習了Mybatis這個框架,在學習的過程當中也找了不少的文章,我的感受官網上的東西太多太雜,不適合許多但願一步步快速上手的朋友們,固然以爲查閱問題的時候能夠直接經過官網找還比較快或者是StackOverflow,鑑於此緣由把本身想把本身學習過程當中的經驗留做筆記以供分享參考之用,儘可能少繞彎路。由於想直接瞭解Mybatis的使用方式,而網上有許多學習文章是Mybatis與Spring的結合範例,或者說直接在Web Project項目下創立的範例,感受對於只是純粹想了解那個東西怎麼使用的朋友應該不須要那麼多附加的條件,因此本系列中直接用最簡單的Java Project做範例演示。html
什麼是Mybatis,前身iBatis(我的沒用過,因此沒什麼發言權),引述官網的原意來講,Mybatis是支持普通SQL查詢,能夠更簡單直接的操做SQL,存儲過程和高級映射的一種優秀的持久層框架,使用它基本能夠消除全部的JDBC大麥和參數的手工設置以及結果集的檢索,其實我的使用下來感受,其實主要工做都是在配置XML或者註解上,而後將接口和Java的POJO(普通Java對象映射成數據庫的記錄),我的沒用過Java的Hb,因此對於二者之間的差別性也沒權限發表意見,我相信各個事物的產生總有它本身的目的。java
這段時間學習下來,其實對Mybatis來講主要的過程沒法是如下幾步mysql
1. 從XML配置文件中獲取SessionFactory,而後由SessionFactory產生相應的Session。git
2. 是用Session對象對業務數據完成相應的CRUD操做(增刪改查)和相應的事務控制。github
3. 使用完畢後關閉相應的Session,以避免過分佔用資源sql
4. 使用配置相應的Mapper xml文件進行業務實體的JavaBean與數據庫表之間作相應的Map操做數據庫
戰前準備:apache
1. 開發環境Eclipse JavaEE IDE,JDK 1.6,數據庫mysql 5.5session
2. 下載相應Jar包,以備後用mybatis
mybatis-3.2.3.zip 解壓後拿出 mybatis-3.2.3.jar,=> 下載地址: http://code.google.com/p/mybatis/ (Mybatis核心包)
mybatis-generator-core-1.3.1.jar => 下載地址: http://code.google.com/p/mybatis/wiki/Generator (Mybatis自動生成配置文件包)
mysql-connector-java-5.1.26-bin.jar => 下載地址:http://dev.mysql.com/downloads/connector/j/ (Mysql 的jdbc驅動包)
接下來你們能夠再Eclipse下面建一個名爲MybatisDemo的Java Project項目,按照以下圖中所示新建相應的包結構和文件夾結構,其中config與mapper分別爲文件夾,
包david.mybatis.demo與包david.mybatis.model下分別存放相應的demo運行程序與Javabean對象,lib文件夾下存放剛剛下載的那幾個第三方jar包。
建完下面的目錄,咱們能夠添加相應的Jar包,以下圖
完成後,執行下面SQL,創建DEMO所需的表結構,分別有3張表,Visitor(訪問者表),Website(網站表),Channel(頻道表)
/*建立Visitor*/ CREATE TABLE Visitor ( Id INT(11) NOT NULL AUTO_INCREMENT, Name VARCHAR(1000) NOT NULL, Email VARCHAR(1000) NOT NULL, Status INT NOT NULL DEFAULT 1, CreateTime DateTime, PRIMARY KEY(Id) ) /*建立網站表*/ CREATE TABLE Website ( Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(1000) NOT NULL, VisitorId INT REFERENCES Visitor(Id), Status INT NOT NULL DEFAULT 1, CreateTime DateTime ) /*建立頻道表*/ CREATE TABLE Channel ( Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(1000) NOT NULL, WebsiteId INT REFERENCES Website(Id), Status INT NOT NULL DEFAULT 1, CreateTime DateTime )
全部這些都完成後,咱們就要開始動手啦~
就像開頭說的,Mybatis的全部配置都源於一份XML配置文件,咱們須要在config文件夾下,新建名爲mybatis_demo_config.xml的配置文件,這一份東西就是咱們後面所須要操做的核心之一。
在配置這個文件千萬要注意<configuration>節點內的元素都是有層級順序的要求的,不可以隨意更換次序,不然在加載xml配置文件的時候會出現異常而致使後續操做不成功。
具體的節點說明你們能夠查看http://mybatis.github.io/mybatis-3/zh/configuration.html#,這裏只說比較經常使用的節點,typeAliases,environments,mappers。
1. typeAliases => 別名節點,能夠經過設置這個節點的屬性,這樣配置文件中其餘須要實體名字的地方均可以使用此別名而不是徹底限定名
例如 <typeAlias type="david.mybatis.model.Visitor" alias="Visitor" />
2. environments => 環境節點,配置數據鏈接相關的信息
3. mappers => 配置SQL映射語句。
最簡單的配置以下:
<?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> <typeAliases> <typeAlias type="david.mybatis.model.Visitor" alias="Visitor" /> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <!-- ?useUnicode=true&characterEncoding=utf8爲了支持中文插入 --> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_db?useUnicode=true&characterEncoding=utf8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/VisitorMapper.xml" /> </mappers> </configuration>
在包david.mybatis.demo下面新建一個名爲MyBatisUtils類,裏面存放獲取SqlSession與關閉SqlSession的方法,提煉出來方便屢次複用。
package david.mybatis.demo; 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; import david.mybatis.model.CRUD_Enum; public class MybatisUtils { private static final String CONFIG_PATH = "config/mybatis_demo_config.xml"; /* * 獲取數據庫訪問連接 */ public static SqlSession getSqlSession() { SqlSession session = null; try { InputStream stream = Resources.getResourceAsStream(CONFIG_PATH); //能夠根據配置的相應環境讀取相應的數據庫環境 // SqlSessionFactory factory = new SqlSessionFactoryBuilder().build( // stream, "development"); SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(stream); session = factory.openSession(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return session; } /* * 獲取數據庫訪問連接 */ public static void closeSession(SqlSession session) { session.close(); } /* * 返回操做記錄消息 */ public static void showMessages(CRUD_Enum type, int count) { switch (type) { case Add: System.out.println("添加了" + count + "條記錄。"); break; case Delete: System.out.println("刪除了" + count + "條記錄。"); break; case Update: System.out.println("更新了" + count + "條記錄。"); break; case Query: System.out.println("匹配了" + count + "條記錄。"); break; case List: System.out.println("共有" + count + "條記錄。"); break; default: break; } } }
在包david.mybatis.model下面新建一個名爲Visitor的類,用來做相應的OR Mapping。
package david.mybatis.model; import java.text.SimpleDateFormat; import java.util.Date; public class Visitor { private int id; private String name; private String email; private int status; private Date createTime; public Visitor() { // TODO Auto-generated constructor stub createTime = new Date(); } public Visitor(String name, String email) { this.name = name; this.email = email; this.status = 1; this.createTime = new Date(); } public int getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setEmail(String email) { this.email = email; } public String getEmail() { return email; } public Date getCreateTime() { return createTime; } @Override public String toString() { // TODO Auto-generated method stub return String.format("{Id: %d, Name: %s, CreateTime: %s}", id, name, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime)); } }
在包david.mybatis.demo下面新建一個VisitorMapper.xml,用來映射相應SQL語句。
這裏要注意namespace=>david.mybatis.demo.IVisitorOperation必定要與對應這個包下面的實際文件名,IVisitorOperation不然沒法成功加載相應的映射文件
<mapper namespace="david.mybatis.demo.IVisitorOperation"> <select id="basicQuery" parameterType="int" resultType="Visitor"> select * from visitor where id=#{id} and Status>0 order by Id </select> </mapper>
接下來運行下面的程序
public static void testBasicQuery(int id) { SqlSession session = MybatisUtils.getSqlSession(); try { Visitor visitor = (Visitor) session.selectOne("david.mybatis.demo.IVisitorOperation.basicQuery", id); MybatisUtils.closeSession(session); System.out.println(visitor); } catch (Exception e) { // TODO: handle exception } }
一個最簡單的執行結果就出來啦
這算是Mybatis系列的HelloWord,下回會講述關於使用接口的方式進行相應操做。