1. 程式人生 > >MyBatis學習與使用(一)

MyBatis學習與使用(一)

如果 none con stack 重要 value 順序 package ase

寫在前面——

用 MyBatis 也做過幾個項目了,但是一直沒有很深入的去理解這個框架,最近決定從頭開始學習和整理MyBatis。

之前開發的項目並不是我先創建的,等我介入的時候發現他們已經稍稍封裝了一下對MyBatis的使用,反正不是那種官方文檔上代碼的樣子,所以我之前用得就糊裏糊塗的,今天就從官方文檔中展示的用法開始學習。

正文如下——

Mybatis核心類

1. SqlSessionFactory

用來生成SqlSession的實例。 這個類一旦被創建就應該在應用的運行期間一直存在,沒有任何理由對它進行清除或重建。使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重復創建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是應用作用域。有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

2. SqlSession

包含了面向數據庫執行SQL所需的所有方法。你可以通過SqlSession的實例來執行已經映射的SQL語句。 這個類的實例不是線程安全的,因此是不能被共享的。如果你現在正在使用一種 Web 框架,要考慮 SqlSession 放在一個和 HTTP 請求對象相似的作用域中。換句話說,每次收到的 HTTP 請求,就可以打開一個 SqlSession,返回一個響應,就關閉它。這個關閉操作是很重要的,你應該把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。

3. SqlSessionFactoryBuilder

用來生成SqlSessionFactory。 這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但是最好還是不要讓其一直存在以保證所有的 XML 解析資源開放給更重要的事情。

4. Mapper接口

映射器是一個你創建來綁定你映射的語句的接口。映射器接口的實例是從 SqlSession 中獲得的,其作用域最好也是方法內。

MyBatis的基本用法

1. 傳統用法(XML配置映射文件)

首先有整個MyBatis的配置文件一般命名為mybatis-config.xml,可以按順序(具體順序可以查看表頭鏈接指向的dtd文件)配置別名、環境數據源、映射器等。 技術分享圖片
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <typeAliases> 7 <typeAlias alias="Book" type="tech.ipush.model.Book" /> 8 </typeAliases> 9 <environments default="development"> 10 <environment id="development"> 11 <transactionManager type="JDBC"/> 12 <dataSource type="POOLED"> 13 <property name="driver" value="com.mysql.cj.jdbc.Driver"/> 14 <property name="url" value="jdbc:mysql://localhost:3306/webpractice?autoReconect=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT%2B8"/> 15 <property name="username" value="root"/> 16 <property name="password" value="root"/> 17 </dataSource> 18 </environment> 19 </environments> 20 <mappers> 21 <mapper resource="tech/ipush/mapper/BookMapper.xml" /> 22 </mappers> 23 </configuration>
mybatis-config.xml 基本上一個表需要對應一個mapper.xml文件,每寫好一個文件就要寫入到mybatis-config.xml配置文件的mappers中。 技術分享圖片
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="tech.ipush.mapper.BookMapper">
6 <select id="getBook" resultType="Book">
7 select * from book where id=#{id}
8 </select>
9 </mapper>
BookMapper.xml 如上所示,這裏配置了一個名為getBook的查詢語句。返回值是一個Book,這裏用的是mybatis-config.xml中的別名。 那麽到底如何使用這裏的配置呢?下邊給出了第一種用法。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
  Book book1 = (Book) session.selectOne("tech.ipush.mapper.BookMapper.getBook", 2);
  System.out.println("book1Name: " + book1.getName());
} finally {
session.close();
}

2. 跟第一種類似,只不過session使用mapper的方式不同。 第二種比第一種多一個顯示的接口文件,接口全名需要跟mapper.xml中的命名空間完全一致,如下:
public interface BookMapper {
  Book getBook(int id);
} 
調用方式如下:
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session2 = sqlSessionFactory.openSession();
try {
  BookMapper mapper = session2.getMapper(BookMapper.class);
  Book book = mapper.getBook(2);
  System.out.println("bookName: " + book.getName());
} catch (Exception e) {
  e.printStackTrace();
} finally {
  session.close();
}
3. 使用註解的方式 這一種方式不需要xml配置文件,但是需要跟代碼耦合度高一些。
package tech.ipush.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import tech.ipush.model.Bill;
@Repository
@Mapper
public interface BillMapper {
  @Select("select * from bill where id = #{id}")
  Bill selectBill(int id);
}

MyBatis學習與使用(一)