MyBatis 以前叫 iBatis, 相對於 HIbernate 是一個輕量級的 ORM 框架, 一般的小型的項目使用 HIbernate 實在是大材小用. 這兩天學了學 MyBatis, 就好好的總結一下吧.
先來一個快速入門吧!
我的開發環境:
jdk1.8, windows7, EclipseJ2EE, MySQL, SQLyog
一: MyBatis 開發環境搭建.
1. 建項目
新建一個 JavaProject, 新建一個 lib 目錄, 用來存放所需的 jar 包的.
2. 下載需要的jar包
MyBatis 的 jar 包點擊 MyBatis In Maven 上下載
MySQL 數據庫連接驅動點擊 MySQL-connector 下載.
3. 添加 jar 包
把兩個 jar 包粘貼到新建的 lib 目錄下面, 然後選中兩個 jar 包, 右擊, Build Path -> Add To Path, 把 jar 包添加到當前的項目中.
如下:
二: 對數據表的簡單 CRUD
1. 建庫
CREATE DATABASE mybatis; USE mybatis; CREATE TABLE person(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT); INSERT INTO person(NAME, age) VALUES('Tom', 23); INSERT INTO person(NAME, age) VALUES('Mike', 14); INSERT INTO person(NAME, age) VALUES('Jack', 18);
2. 添加 MyBatis 的配置文件 conf.xml
在 src 目錄下建立一個 conf.xml 文件, 並添加一下內容, 連接信息需自己修改.
<?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="oracle" /> </dataSource> </environment> </environments> </configuration>
其中:
①. environments及environment 的 default 屬性指定模式
development: 開發模式(一般選用這個)
work: 工作模式
②. transactionManager 的 type 屬性用於指定事務管理器類型
JDBC:使用JDBC的提交和回滾設置,依賴從數據源獲取的連接來管理事務範圍.
MANAGED:讓容器(如Spring)來管理事務的生命週期。默認情況會關閉連接.
③. dataSource 的 type 屬性指定連接池類型
UNPOOLED:連接用完就關閉,不放到連接池
POOLED:連接用完則放在連接池
裏邊的連接屬性就不用說了.
3. 建立與數據表對應實體類 Person
在 src 下面建立一個 com.mybatis.entities 包用來存放 Person 實體類. 然後在包下建立實體類 Person.
具體的 setter 和 getter 以及 toString 方法自己寫好, 如果添加了一個 有參的構造方法, 一定要加上一個無參的構造方法, 因爲 MyBatis 會利用反射爲屬性賦值.
4. 添加操作 person 數據表的 SQL 映射文件 PersonMapper.xml
在 com.mybatis.entities 包下新建一個 PersonMapper.xml(類名+Mapper.xml) 文件,添加
一下內容到文件中
<?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.mybatis.entities.PersonMapper"> <!-- 通過 id 查找一個 Perosn 對象 --> <select id="getPerson" parameterType="int" resultType="com.mybatis.entities.Person"> SELECT * FROM person WHERE id=#{id} </select> </mapper>
①. mapper 標籤的 namespace 屬性的值這樣填寫:
PersonMapper.xml 文件所在的包 + PersonMapper.xml 去掉 .xml
就是: com.mybatis.entities.PersonMapper
②. <select> 標籤表示是一個 select 查詢, 如果按 Eclipse 的提示鍵沒有提示的話, 說明沒有關聯 .dtd 文件, 關聯方法點擊這裏 Eclipse中在XML中如何關聯.dtd文件.
③. <select> 標籤的屬性
a). id: 我們在調用內部 SQL 語句的時候會利用這個, 保證本文件中唯一不衝突.
b). parameterType: 傳進來的參數的類型, 因爲我們通過 id 查找一個 Person 對象.所以傳進來一個 int 類型的 id.
c). resultType: 返回值類型, 這裏寫全類名, 帶着包名.
內部就是SQL語句, 至於 #{id} 這個就是用來接收傳進來的 int 類型的數字.
5. 在 conf.xml 文件中關聯 PersonMapper.xml 映射文件
利用 <mappers> 標籤來關聯映射文件. 如下:
<mappers> <mapper resource="com/mybatis/entities/PersonMapper.xml"/> </mappers>
<mappers>標籤與<environments>標籤處於同一個級別.
6. 編寫測試類. 獲取一個 Person 對象
新建一個 com.mybatis.test 包, 在包下建立一個 TestPerson 類. 利用 Junit 單元測試來測試.
代碼如下:
import java.io.InputStream; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import com.mybatis.entities.Person; public class TestPerson { @Test public void testGetPerson(){ InputStream is = getClass().getClassLoader() .getResourceAsStream("conf.xml"); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder() .build(is); SqlSession session = sessionFactory.openSession(); String statement = "com.mybatis.entities.PersonMapper.getPerson"; Person person = session.selectOne(statement , 1); System.out.println(person); // Person [id=1, name=Tom, age=23] } }
與 Hibernate 一樣, 我們需要一個 SessionFactory 和一個 Session,
SessionFactory的創建需要一個流, 這個流對應着就是 conf.xml 文件的流.
session 的創建也很簡單, openSession 就可以了.
告知 MyBatis 要調用哪一個 SQL 語句:
String statement = "com.mybatis.entities.PersonMapper.getPerson";
最後邊的 getPerson 就是剛纔我們<select>標籤配置的 id 值.
因爲我們需要傳一個參數 id 給 SQL 語句, 所以我們需要在第二個參數上帶一個 1.
Person person = session.selectOne(statement , 1);
表示查詢 id 爲 1 的 Person 對象.
最後打印, 查詢完成!
本篇博文代碼可以點擊 http://pan.baidu.com/s/1gexNy3T 下載.