MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。
MyBatis是一個優秀的持久層框架,它對JDBC的操作資料庫的過程進行封裝,使開發者只需要關注 SQL語句 本身,而不需要花費精力去處理例如註冊驅動、創建connection、創建statement、手動設置參數、結果集檢索以及釋放資源等jdbc繁雜的過程代碼。
Mybatis通過xml或註解的方式將要執行的各種statement(statement、preparedStatemnt)配置起來,並通過java對象和statement中的sql進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射成java對象並返回。
總之,Mybatis對JDBC訪問資料庫的過程進行了封裝,簡化了JDBC代碼,解決JDBC將結果集封裝為Java對象的麻煩。
下圖是MyBatis架構圖:
(1)mybatis-config.xml是Mybatis的核心配置文件,通過其中的配置可以生成SqlSessionFactory,也就是SqlSession工廠
(2)基於SqlSessionFactory可以生成SqlSession對象
(3)SqlSession是一個既可以發送SQL去執行,並返回結果,類似於JDBC中的Connection對象,也是Mybatis中至關重要的一個對象。
(4)Executor是SqlSession底層的對象,用於執行SQL語句
(5)MapperStatement對象也是SqlSession底層的對象,用於接收輸入映射(SQL語句中的參數),以及做輸出映射(即將SQL查詢的結果映射成相應的結果)
思考:在開始之前,思考下如何通過JDBC查詢Emp表中的所有記錄,並封裝到一個List<Emp>集合中返回。(演示:準備數據、導包、導入JDBC程序)
1、使用傳統方式JDBC訪問資料庫:
(1)使用JDBC訪問資料庫有大量重複代碼(比如註冊驅動、獲取連接、獲取傳輸器、釋放資源等);
(2)JDBC自身沒有連接池,會頻繁的創建連接和關閉連接,效率低;
(3)SQL是寫死在程序中,一旦修改SQL,需要對類重新編譯;
(4)對查詢SQL執行後返回的ResultSet對象,需要手動處理,有時會特別麻煩;
...
2、使用mybatis框架訪問資料庫:
(1)Mybatis對JDBC對了封裝,可以簡化JDBC代碼;
(2)Mybatis自身支持連接池(也可以配置其他的連接池),因此可以提高程序的效率;
(3)Mybatis是將SQL配置在mapper文件中,修改SQL只是修改配置文件,類不需要重新編譯。
(4)對查詢SQL執行後返回的ResultSet對象,Mybatis會幫我們處理,轉換成Java對象。
...
總之,JDBC中所有的問題(代碼繁瑣、有太多重複代碼、需要操作太多對象、釋放資源、對結果的處理太麻煩等),在Mybatis框架中幾乎都得到了解決!!
1、創建yonghedb庫、emp表,並插入若干條記錄
-- 1、創建資料庫 yonghedb 資料庫
create database if not exists yonghedb charset utf8;use yonghedb; -- 選擇yonghedb資料庫
-- 2、刪除emp表(如果存在)
drop table if exists emp;
-- 3、在 yonghedb 庫中創建 emp 表
create table emp( id int primary key auto_increment, name varchar(50), job varchar(50), salary double);
-- 4、往 emp 表中, 插入若干條記錄
insert into emp values(null, &39;, &39;, 3300);insert into emp values(null, &39;, &39;, 2800);insert into emp values(null, &39;, &39;, 2700);insert into emp values(null, &39;, &39;, 4200);insert into emp values(null, &39;, &39;, 3000);insert into emp values(null, &39;, &39;, 3500);insert into emp values(null, &39;, &39;, 3700);insert into emp values(null, &39;, &39;, 5000);
1、創建Maven的java工程
2、導入junit、mysql、mybaits等開發包
在pom.xml文件中引入相關依賴包即可
<dependencies> <!-- junit單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> <!-- mysql驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <!-- 整合log4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> </dependency></dependencies>
3、創建com.tedu.mybatis.TestMybatis01測試類,並提供findAll方法(查詢emp表中所有的員工信息)
/** 練習1(快速入門): 查詢emp表中的所有員工, 返回一個List<Emp>集合 * @throws IOException */@Testpublic void findAll() throws IOException { //1.讀取mybatis的核心配置文件(mybatis-config.xml) //2.通過配置信息獲取一個SqlSessionFactory工廠對象 //3.通過工廠獲取一個SqlSession對象 //4.通過namespace+id找到要執行的sql語句並執行sql語句 //5.輸出結果 }
1、在src/main/resources目錄下,創建mybatis-config.xml文件 (MyBatis的核心配置文件)
2、mybatis-config.xml文件配置如下:
mybatis-config文件頭信息如下:
<?xml version=&34; encoding=&34;?><!DOCTYPE configuration PUBLIC &34; &34;>
<!-- MyBatis的全局配置文件 -->
<configuration > </configuration> 詳細配置如下:<?xml version=&34; encoding=&34;?><!DOCTYPE configuration PUBLIC &34; &34;> <!-- MyBatis的全局配置文件 --><configuration > <!-- 1.配置開發環境(需設置一個默認的環境) --> <environments default=&34;> <!-- 這裡可以配置多個環境,比如develop,test等 --> <environment id=&34;> <!-- 1.1.配置事務管理方式:JDBC/MANAGED JDBC:將事務交給JDBC管理(推薦) MANAGED:自己管理事務 --> <transactionManager type=&34;></transactionManager> <!-- 1.2.配置數據源,即連接池方式:JNDI/POOLED/UNPOOLED JNDI:已過時 POOLED:使用連接池(推薦) UNPOOLED:不使用連接池 --> <dataSource type=&34;> <property name=&34; value=&34;/> <property name=&34; value=&34;/> <property name=&34; value=&34;/> <property name=&34; value=&34;/> </dataSource> </environment> </environments> <!-- 2.加載Mapper配置文件(因mapper文件中配置了要執行的SQL語句) --> <mappers> <!-- 注意路徑 --> <mapper resource=&34;/> </mappers></configuration>
1、在src/main/resources目錄下,創建EmpMapper.xml文件 (實體類的映射文件)
2、EmpMapper.xml文件配置如下:
EmpMapper文件頭信息如下:
<?xml version=&34; encoding=&34;?><!DOCTYPE mapper PUBLIC &34; &34;> <!-- 不同Mapper文件的namespace值應該保證唯一 在程序中通過[ namespace + id ]定位到執行哪一條SQL語句 --><mapper namespace=&34;> </mapper>
詳細配置如下:
<?xml version=&34; encoding=&34;?><!DOCTYPE mapper PUBLIC &34; &34;> <!-- namespace一般指定為當前文件的所在包路徑+文件名 將來在程序中通過[ namespace + id ]定位到執行哪一條SQL語句 --><mapper namespace=&34;> <!-- 通過select、insert、update、delete標籤聲明要執行的SQL --> <!-- 練習1: 查詢emp表中的所有員工信息 resultType指定查詢的結果將會封裝到什麼類型中 --> <select id=&34; resultType=&34;> select * from emp </select> <!-- resultType:返回值類型,簡單類型(例如:Integer,String,Emp等) 如果返回集合(List<Emp>),只需配置集合中的元素類型即可! --></mapper>
注意:在當前實例中,Emp類中的屬性和資料庫表的欄位名稱必須一致,否則將會無法將結果集封裝到Java對象中。
在src/main/java目錄下創建com.tedu.pojo.Emp類並實現Emp類:
提供私有屬性以及對應的getter方法、setter方法,並重寫toString方法
public class Emp { //1.聲明實體類中的屬性 private Integer id; private String name; private String job; private Double salary; //2.提供對應的getter和setter方法 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } //3.重寫toString方法 @Override public String toString() { return &34; + id + &34; + name + &34; + job + &34; + salary + &34;; }}
1、實現findAll方法,代碼如下:
/** 練習1(快速入門): 查詢emp表中的所有員工, 返回一個List<Emp>集合 * @throws IOException */@Testpublic void findAll() throws IOException { //1.讀取mybatis的核心配置文件(mybatis-config.xml) InputStream in = Resources .getResourceAsStream(&34;); //2.通過配置信息獲取一個SqlSessionFactory工廠對象 SqlSessionFactory fac = new SqlSessionFactoryBuilder().build( in ); //3.通過工廠獲取一個SqlSession對象 SqlSession session = fac.openSession(); //4.通過namespace+id找到要執行的sql語句並執行sql語句 List<Emp> list = session .selectList(&34;); //5.輸出結果 for(Emp e : list) { System.out.println( e ); }}
2、執行findAll方法,輸出結果為:
Emp{id=1, name=&39;, job=&39;, salary=3300.0}
Emp{id=2, name=&39;, job=&39;, salary=2800.0}
Emp{id=3, name=&39;, job=&39;, salary=2700.0}
Emp{id=4, name=&39;, job=&39;, salary=4200.0}
Emp{id=5, name=&39;, job=&39;, salary=3000.0}
Emp{id=6, name=&39;, job=&39;, salary=3500.0}
Emp{id=7, name=&39;, job=&39;, salary=3700.0}
Emp{id=8, name=&39;, job=&39;, salary=5000.0}