MyBatis | 入門和基礎
一、什麼是 MyBatis ?
官方部落格是這麼說的:MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
簡單的來說,就是之前將資料庫表中的欄位與 JavaBean 的屬性相對映,同時,Sql 語句可以不用嵌在程式碼中,而只需要寫在 XML 配置檔案中
二、如何使用 Mybatis ?
2.1 所需架包
mybatis-3.4.6.jar
mysql-connector-java-5.1.41.jar
log4j-1.2.17.jar
#####2.2 配置檔案
######①. log4j.properties
配置 log4j 日誌檔案
# Global logging configuration
# developer–>DEBUG productor–>INFO or ERROR
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration…
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output…
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
中引用 sql 對映檔案,這在後面也會詳細講述
2.3 編寫程式碼
首先得有一個 POJO 類,這裡我定義的是 Employee.java
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
}
…
}
當然只列舉了部分
①. 從 XML 中構建 SqlSessionFactory
這裡我參照的是 MyBatis 官方文件給出的程式碼,我先寫一個獲取 SqlSessionFactory 物件的類,該類返回的是 SqlSessionFactory 的例項
private SqlSessionFactory getSqlSessionFactoty() throws IOException {
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
這裡使用類路徑下的資原始檔進行配置,該資原始檔是全域性配置。
②. 從 SqlSessionFactory 中獲取 SqlSession
SqlSession 包含了面向資料庫執行 SQL 命令所需的所有方法,包括增、刪、改、查等等
selectOne(String statement, Object parameter)
statement:sql 唯一標識, 即對應 mymapper.xml 中設定的 id 值
parameter:執行 sql 要使用的引數,比如 id,name 等等
@Test
void test() throws IOException {
//1. 根據 xml 配置檔案(全域性配置檔案)建立一個 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = getSqlSessionFactoty();
//2. 獲取 sqlSession 例項, 能直接執行已經對映的 sql 語句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
Employee employee = sqlSession.selectOne(“emp”, 3);
System.out.println(employee);
} finally {
sqlSession.close();
}
}
可以看到,上面的 selectOne 方法的第一個引數已經設定,這是因為我已經配置好了 sql 對映檔案 mymapper.xml
select id, last_name lastName, email, gender from Employee where id = #{id}
介紹一下配置檔案的引數(當然,這只是最基本的幾個引數,更加詳細的介紹會在之後文章)
namespace:名稱空間,這種方式可以隨意設定名稱空間的值
id:標識對映檔案中的sql,SqlSession 的 selectOne 的第一個引數就是對應的這個 id
#{id}:從傳遞過來的引數中獲取 id 值,類似於 jdbc 中的 “?”
resultType:指定輸出結果的型別,即查詢結果所對映的java物件,這裡返回的物件是 Employee
以下是這段程式碼的執行流程:
根據全域性配置檔案(mybatis-config.xml), 建立一個 SqlSessionFactory 物件, 該配置檔案包含資料來源的配置資訊
sql 對映檔案(mymapper.xml), 用來寫 sql 語句, 配置了每一個 sql, 以及 sql 的封裝規則
將 sql 對映檔案註冊在全域性配置檔案中
1). 根據全域性配置檔案得到 SqlSessionFactory
2).使用 SqlSessionFactory, 獲取到 sqlSession 物件, 並使用該物件來執行增刪改查操作,一個 sqlSession 就是代表和資料庫的一次會話, 用完關閉
3).使用 sql 的唯一標誌(配置檔案的 id 屬性)來告訴 mybatis 執行哪個 sql. 語句都是儲存在 sql 對映檔案中的
但是,官方還給我們提供了另外一種方式,介面式程式設計。即在接口裡面定義對資料庫的各種操作方式,然後將介面類名對應到 sql 配置檔案的名稱空間中(namespace)
我們先寫一個介面類
public interface EmployeeMapper {
public Employee getEmployee(Integer id);
}
把介面類對映到 sql 配置檔案的 namespace 中,id 即為介面中的方法名,這裡是 getEmployee,resultType 即執行語句返回的物件,這裡是 Employee
select id, last_name lastName, email, gender from Employee where id = #{id}
接下來寫測試程式碼
@Test
void test2() throws IOException {
//1. 獲取 sqlSessionFactory 物件
SqlSessionFactory sqlSessionFactory = getSqlSessionFactoty();
//2. 獲取 sqlSession 物件
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//3. 獲取介面的實現類物件, 會為介面自動建立一個代理物件, 代理物件去執行增、刪、改、查
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = employeeMapper.getEmployee(1);
System.out.println(employee);
} finally {
sqlSession.close();
}
}
流程:
介面式程式設計
原生:Dao ====> DaoImpl
如今:Mapper ====> xxMapper.xml
SqlSession 代表和資料庫的一次會話, 用完必須關閉
SqlSession 和 Connection 一樣, 都是非執行緒安全的, 每次使用都應該去獲取新的物件,如 private SqlSession sqlSession 這種共享的物件, 不應該使用
mapper 介面沒有實現類, 但是 mybatis 會為這個介面生成一個代理物件(介面與 xml 進行繫結),即 sqlSession.getMapper(EmployeeMapper.class)
兩個重要的配置檔案
mybatis-config.xml: mysql:全域性配置檔案, 包含資料庫連線池資訊, 事務管理器資訊等
mymapper.xml: sql:對映檔案, 儲存了每一個 sql 語句的對映資訊. 將 sql 語句抽取出來
瀋陽性病醫院哪家好