(讀者注:事實上這個應該叫作很是基礎的入門一下下,假設你看過Hibernate了那這個就很是的簡單)web
文章來源:http://blog.csdn.net/techbirds_bao/article/details/9233599/
spring
寫在這個系列前面的話:sql
之前之前用過ibatis,這是mybatis的前身。當時在作項目時。感受很是不錯,比hibernate靈活。性能也比hibernate好。數據庫
而且也比較輕量級。因爲當時在項目中,沒來的及作很是很是多筆記。後來項目結束了,我也沒寫總結文檔。已通過去很久了。apache
但近期忽然又對這個ORM 工具感興趣。因爲接下來本身的項目中很是有可能採用這個ORM工具。因此在此又一次溫習了一下 mybatis, 所以就有了這個系列的 mybatis 教程.
什麼是mybatis
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。編程
MyBatis消除了差點兒所有的JDBC代碼和參數的手工設置以及結果集的檢索。api
MyBatis使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成數據庫中的記錄.
orm工具的基本思想
不論是用過的hibernate,mybatis,你都可以法相他們有一個共同點:
1. 從配置文件(通常是XML配置文件裏)獲得 sessionfactory.
2. 由sessionfactory 產生 session
3. 在session 中完畢對數據的增刪改查和事務提交等.
4. 在用完以後關閉session 。數組
5. 在java 對象和 數據庫之間有作mapping 的配置文件。也通常是xml 文件。
2. 將 mybatis-3.2.0-SNAPSHOT.jar。mysql-connector-java-5.1.22-bin.jar 複製到 webproject的lib文件夾.
3. 建立mysql 測試數據庫和用戶表,注意。這裏採用的是 utf-8 編碼
建立用戶表,並插入一條測試數據
1. 在MyBatis 裏面建立兩個源代碼文件夾,分別爲 src_user,test_src, 用例如如下方式創建,鼠標右鍵點擊 JavaResource.
2. 設置mybatis 配置文件:Configuration.xml, 在src_user文件夾下創建此文件,內容例如如下:
>
< !DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
< configuration>
<typeAliases>
<typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/>
</typeAliases>
<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://127.0.0.1:3306/mybatis" />
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/yihaomen/mybatis/model/User.xml"/>
</mappers>
< /configuration>
>
< !DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
< mapper namespace="com.yihaomen.mybatis.models.UserMapper">
<select id="selectUserByID" parameterType="int" resultType="User">
select * from `user` where id = #{id}
</select>
< /mapper>
要保持一致,固然這裏的 resultType 還有另外單獨的定義方式,後面再說。
2. Configuration.xml 裏面 的<mapper resource="com/yihaomen/mybatis/model/User.xml"/>是包括要映射的類的xml配置文件。
3. 在User.xml 文件中面 主要是定義各類SQL 語句,以及這些語句的參數。以及要返回的類型等.
開始測試
在test_src 源代碼文件夾下創建com.yihaomen.test這個package,並創建測試類Test:
整個project文件夾結構例如如下:
假設不一致就會出錯,這一章主要在上一講基於接口編程的基礎上完畢例如如下事情:
1. 用 mybatis 查詢數據,包含列表
2. 用 mybatis 添加數據
3. 用 mybatis 更新數據.
4. 用 mybatis 刪除數據.
查詢數據。前面已經講過簡單的。主要看查詢出列表的
查詢出列表。也就是返回list, 在咱們這個樣例中也就是 List<User> , 這樣的方式返回數據。需要在User.xml 裏面配置返回的類型 resultMap, 注意不是 resultType, 而這個resultMap 所相應的應該是咱們本身配置的
假設是查詢單個數據的話,用第二講用過的方法就可以了。
用mybatis 添加數據
在 IUserOperation 接口中添加方法:public void addUser(User user);
在 User.xml 中配置
以#{name}的形式引用Student參數
的name屬性,MyBatis將使用反射讀取Student參數
的此屬性。#{name}中name大寫和小寫敏感。
引用其它
的gender等屬性與此一致。seGeneratedKeys設置
爲"true"代表要MyBatis獲取由數據庫本身主動生成的主
鍵;keyProperty="id"指定把獲取到的主鍵值注入
到Student的id屬性-->
<insert id="addUser" parameterType="User"
useGeneratedKeys="true" keyProperty="id">
insert into user(userName,userAge,userAddress)
values(#{userName},#{userAge},#{userAddress})
</insert>
SqlSession session = sqlSessionFactory.openSession();
try {
IUserOperation userOperation=session.getMapper(IUserOperation.class);
User user = userOperation.selectUserByID(4);
user.setUserAddress("原來是魔都的浦東創新園區");
userOperation.updateUser(user);
session.commit();
} finally {
session.close();
}
}
到此爲止,簡單的單表操做,應該都會了。接下來的時間了,我會講多表聯合查詢,以及結果集的選取。
多對一的實現
場景:在讀取某個用戶發表的所有文章。
固然仍是需要在User.xml 裏面配置 select 語句, 但重點是這個 select 的resultMap 相應什麼樣的數據呢。這是重點。這裏要引入 association 看定義例如如下:
用spring 來管理 mybatis 與管理hibernate 有很是多相似的地方。今天的重點就是數據源管理以及 bean的配置。
你可以下載源代碼後,對照着看,源代碼沒有帶jar包,太大了,空間有限. 有截圖,你可以看到用到哪些jar包,源代碼在本文最後.
1. 首先對前面的project結構作一點改變,在src_user源碼目錄下創建目錄config ,並將原來的 mybatis 配置文件 Configuration.xml 移動到這個目錄中, 並在config 文家夾中創建 spring 配置文件:applicationContext.xml ,這個配置文件中最基本的配置:
characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--dataSource屬性指定要用到的鏈接池-->
<property name="dataSource" ref="dataSource"/>
<!--configLocation屬性指定mybatis的核心配置文件-->
<property name="configLocation" value="config/Configuration.xml"/>
</bean>
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!--sqlSessionFactory屬性指定要用到的SqlSessionFactory實例-->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<!--mapperInterface屬性指定映射器接口,用於實現此接口並生成映射器對象-->
<property name="mapperInterface" value="com.yihaomen.mybatis.inter.IUserOperation" />
</bean>
characterEncoding=utf8"
p:username="root" p:password="password"
p:maxActive="10" p:maxIdle="10">
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--dataSource屬性指定要用到的鏈接池-->
<property name="dataSource" ref="dataSource"/>
<!--configLocation屬性指定mybatis的核心配置文件-->
<property name="configLocation" value="classpath:config/Configuration.xml" />
<!-- 所有配置的mapper文件 -->
<property name="mapperLocations" value="classpath*:com/yihaomen/mapper/*.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yihaomen.inter" />
</bean>
4. 編寫 controller 層
源代碼下載:
mybatis spring3 MVC 程序下載
數據庫下載:
spring mvc 數據庫測試文件
對於物理分頁方案,不一樣的數據庫,有不一樣的實現方法,對於mysql 來講 就是利用 limit offset,pagesize 方式來實現的。oracle 是經過rownum 來實現的。假設你熟悉相關數據庫的操做,是同樣的很是好擴展。本文以mysql 爲樣例來說述.先看一下效果圖(源碼在文章最後提供下載):
實現mybatis 物理分頁。一個最簡單的方式是,是在你的mapper的SQL語句中直接寫相似例如如下方式 :
這是簡單的一種方式。但更通用的一種方式是用 mybatis 插件的方式. 參考了網上的很是多資料 ,mybatis plugin 方面的資料。寫本身的插件.
不然將不會分頁處理.
插件寫好了,現在就可以在 spring mvc 中的controller 層中寫一個方法來測試這個分頁:
foreach元素的屬性主要有item。index。collection,open。separator,close。item表示集合中每一個元素進行迭代時的別名,index指定一個名字,用於表示在迭代過程當中,每次迭代到的位置,open表示該語句以什麼開始,separator表示在每次進行迭代之間以什麼符號做爲分隔符,close表示以什麼結束,在使用foreach的時候最關鍵的也是最easy出錯的就是collection屬性,該屬性是必須指定的。但是在不一樣狀況下。該屬性的值是不同的,主要有一下3種狀況:
假設傳入的是單參數且參數類型是一個List的時候。collection屬性值爲list
假設傳入的是單參數且參數類型是一個array數組的時候。collection的屬性值爲array
假設傳入的參數是多個的時候,咱們就需要把它們封裝成一個Map了。固然單參數也可以封裝成map。實際上假設你在傳入參數的時候,在MyBatis裏面也是會把它封裝成一個Map的。map的key就是參數名。因此這個時候collection屬性值就是傳入的List或array對象在本身封裝的map裏面的key
1.1.單參數List的類型
解壓下載後的 mybatis-generator-core-1.3.2-bundle.zip 文件。當中有兩個文件夾:一個文件夾是文檔文件夾docs,主要介紹這個代碼生成工具怎樣使用。還有一個是lib文件夾,裏面的內容主要是jar 包,這裏咱們需要 mybatis-generator-core-1.3.2.jar,這個 jar 包. 將它複製到咱們剛剛建立的 webproject的 WebContent/WEB-INF/lib 文件夾下.在這個文件夾下也放入 mysql 驅動jar包.因爲用 mysql 作測試的.
2.在數據庫中建立測試表
在mybatis數據庫中建立 用來測試的category表(假設沒有mybatis這個數據庫,要建立。這是基於前面這個系列文章而寫的。已經有了mybatis 這個數據庫)
假設你想用命令行方式處理,也是可以的.
代碼下載:mybatis 代碼生成工具
但其實。假設有這個mapper接口不能完畢的工做。或者需要更復雜的擴展的時候,你就需要本身的DAO 層. 其實 mybatis 3 也是支持DAO 層設計的。相似於ibatis 2 .如下介紹下.
在此以前,請下載 上一篇文章提供的代碼:http://www.yihaomen.com/article/java/326.htm
首先建立一個com.yihaomen.dao的package.而後在裏面分別建立接口UserDAO,以及實現該接口的UserDAOImpl
在controller層中測試,直接調用dao層方法
在controller中增長方法: