第一個Mybatis程序示例 Mybatis簡介(一)

在JDBC小結中(能夠參閱本人JDBC系列文章),介紹到了ORM,其中Mybatis就是一個不錯的ORM框架
MyBatis由iBatis演化而來
iBATIS一詞來源於「internet」和「abatis」的組合,是一個由Clinton Begin在2001年發起的開放源代碼項目。於2010年6月16號被谷歌託管,更名爲MyBatis。
是一個基於SQL映射支持Java和·NET的持久層框架。
 
MyBatis是一個優秀的持久層框架,對JDBC操做數據庫進行了封裝,封裝後的Mybatis使應用程序開發者只須要關注SQL自己
徹底不須要再次花精力去處理例如註冊驅動、建立connection、建立statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼(最初的Mybatis環境搭建只須要立項之初配置便可)
  • 要求經過xml或註解的方式將要執行的各類statement(statement、preparedStatemnt、CallableStatement)配置起來
  • 並經過java對象和statement中的sql進行映射生成最終執行的sql語句
  • mybatis框架執行sql並將結果映射成java對象並返回。
項目環境搭建好以後咱們須要作的就是經過XML或者註解將要執行的SQL配置起來,也就是僅僅關注SQL
 
中文版文檔
github地址
截止本文,最新版本爲:mybatis-3.4.6
 
本文不涉及架構解析,首先演示了一個最簡單的示例,而後以這個簡單示例爲基礎,簡單介紹了從外部看過去的Mybatis的呈現樣子
幫助簡單瞭解Mybatis

第一個Mybatis程序

1.新建項目

新建一個Java 項目
我取名爲mybatis,而且新建了一個包 first
image_5c4fb3c7_7089

2.包獲取與導入

基礎的兩個包
mybatis 和 mysql-connector(由於要用MYSQL) ,能夠從官方下載  
https://dev.mysql.com/downloads/connector/j/
https://github.com/mybatis/mybatis-3/releases
image_5c4fb3c7_4d8d

3.數據庫準備

本人已經有本地數據庫,MYSQL,以student表爲測試
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '默認姓名' COMMENT '姓名',
  `age` int(11) DEFAULT '1',
  `sex` varchar(255) DEFAULT NULL,
  `random` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

 

image_5c4fb3c7_2ce3
數據庫信息爲:
    String user = "root";
    String password = "123456";
    String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";

4.配置文件設置

src下新建config,而後新建xml文件名爲mybatis-config.xml
內容從官方文檔中複製:  http://www.mybatis.org/mybatis-3/zh/getting-started.html 
image_5c4fb3c7_45ef
以下圖所示官方示例的配置XML
image_5c4fb3c8_4712

5.SQL映射文件設置

src下新建mapper文件夾,建立xml文件名爲myBatis.xml
內容從官方文檔複製
image_5c4fb3c8_4a84
 
image_5c4fb3c8_288d

6.調整配置文件

image_5c4fb3c9_1e82
主要任務就是將數據庫連接信息設置準確,而且將SQL映射文件的位置設置準確
image_5c4fb3c9_70e9
 
對於url的設置須要注意「&」符號,在xml的配置文件中 要用  &   代替&
這是XML的語法自己的問題與mybatis不要緊
 
image_5c4fb3c9_6f94
五個在XML文檔中預約義好的實體:
&lt; < 小於號
&gt; > 大於號
&amp; & 和
&apos; ' 單引號
&quot; " 雙引號
實體必須以符號"&"開頭,以符號";"結尾

7.建立實體類Student

image_5c4fb3c9_504d

8.修改myMapper.xml文件

須要調整namespace 設置resultType類型,須要設置使用的sql
image_5c4fb3c9_548e

9.測試

image_5c4fb3c9_31ed
每一次的業務開發時,其實須要的僅僅是編寫myMapper.xml文件,而後對其調用
環境配置等工做環境搭建之初就已經完成了

初識Mybatis

在第一個Mybatis程序示例中的代碼幾乎都是官方文檔中的,根據官方的提示一步一步操做便可創建
 
不論是Mybatis仍是JDBC仍是其餘,終歸是須要鏈接數據庫的,無論以何種形式,鏈接之後就是須要執行SQL,因此你還得準備好你想要執行的SQL
在Mybatis中,SQL以XML文件的形式設置 ,也就是上例中的myMapper.xml文件
因此在上例中的主配置文件mybatis-config.xml中咱們配置了數據庫的鏈接信息以及SQL XML文件的位置
每一個基於Mybatis的應用都是以一個SqlSessionFactory的實例爲中心的,這一部分核心的配置文件就是提供給SqlSessionFactory實例的。
 
既然是操做數據庫,很重要的一部分天然是SQL語句
mapper文件的格式是什麼?對於一個SQL究竟是查詢仍是delete?返回類型是什麼?以下圖所示,咱們的類型是first.Student,SQL的內容又是什麼?
image_5c4fb3c9_619
此處不深刻,可是很顯然,對於Mybatis mapper映射文件的編寫是很重要的一部分學習內容
 
有了核心配置文件就能夠構建SqlSessionFactory實例,經過SqlSessionFactory實例就能夠獲取到SqlSession對象
SqlSession是Mybatis最重要的構建之一,能夠簡單的認爲Mybatis一系列的配置目的是生成相似 JDBC生成的Connection對象的SqlSession對象
有了這個「Connection」對象以後才能進一步與數據庫進行交流
這個「Connection」對象就能夠根據咱們mapper xml配置文件中設置的標識符,好比上例中的selectStudent的全名,以及參數執行SQL
image_5c4fb3ca_777b
如上圖所示,咱們從頭簡單的理一下Mybatis的基本流程
須要兩個重要信息:數據庫配置以及mapper文件位置
經過這兩個核心信息能夠生成SqlSessionFactory,經過SqlSessionFactory就能夠建立SqlSession
SqlSession就能夠根據名稱標識符識別須要執行哪一個文件裏面的哪一個SQL,好比上面就是執行mapper/myMapper.xml文件中,標識符爲selectStudent的那一條
而執行該SQL以及周邊的信息,都在文件中指定了,好比SQL內容是什麼?返回類型又是什麼?
 
經過配置文件到SqlSessionFactory實例的建立,完成了宏觀上Mybatis的配置,兩個主要任務:
  • 要從哪一個數據庫進行操做?
  • 要操做的SQL在哪裏?
經過SqlSession完成了具體一次執行的任務
  • 執行哪一個SQL?經過層級的命名標識符定位
  • 執行SQL的細節信息有哪些?SQL內容,參數內容,返回類型等
image_5c4fb3ca_4a57
 
好比如今的中國好聲音,形式變化了
全部的參賽選手在等待大廳內坐等,全部的人的姓名和演唱曲目造成了歌單,導師點歌的形式選擇選手錶演。
這個過程很相似Mybatis的處理
 
全部的選手造成了一個等待集合,這就至關因而一系列的mapper.xml文件,每一個選手都有一個名字,這就至關因而一個文件(一個文件名,或者說一個命名空間)
可是重名的有不少,當導師叫名字 xxx 的時候,實際上是在說「本次參加中國好聲音,等待大廳的xxx」,可是不說你們也都知道,說王偉的時候,確定不會是你身邊坐着那個同事
可是程序不知道,這個「本次參加中國好聲音,等待大廳的xxx」就至關於上例中namespace="mapper.myMapper"
 
整個節目組,導師,時間,場地等這些環境信息因素構成了整個的節目核心,這些零散的數據就是配置項目
構成的總體就至關於一個運行的機器,這就至關於SqlSessionFactory 
他做爲核心知道整個節目組全部的信息,導師的信息等等,學員以及學員表演曲目也呈如今了導師面前
 
當一個導師進行點歌時,就相似SqlSession執行一次數據庫操做
導師經過姓名,也就是咱們上面說的「一個隱含的命名空間」,進行點歌,選擇選手進行表演
這就至關於從等候大廳定位了一個Mapper文件,而他表演的那個曲目就好像是mapper文件中的ID,由於你唱了《止戰之殤》,別人也能夠再唱一次。
而針對於歌曲自身的更多信息,天然要看你接下來的表演了,是否是改變了?變化了哪些內容等等,這都屬於某一個id對應的mapper文件中的具體內容信息。
 
Mybatis核心爲配置以及映射
  • 配置信息搭建了Mybatis應用框架
  • 映射設置了一次執行的所需信息
image_5c4fb3ca_4aa9
Mybatis細化實現爲核心的協調 組裝
核心信息包含了將要執行的目標數據庫信息以及須要執行的SQL映射,有了這兩部分信息若是是在Navicat等客戶端的話就足夠了,使用數據庫信息鏈接,而後執行SQL
對於Mybatis也是足夠了,不過代碼中畢竟不是能夠手動鏈接數據庫,手動輸入SQL,肉眼查看結果這麼簡單
因此還有不少的周邊業務須要處理,好比配置文件如何表示?都有哪些屬性須要配置?另外MyBatis是一個功能強大的工具,因此還提供了更多的細節調優參數以供設置
對於mapper文件的位置如何描述?
image_5c4fb3ca_552c
前面示例中使用了上面的形式,另外你也能夠指定一個包,好比 下面的形式,那麼這個包下面全部的xml都會被掃描,至關於你所有都羅列了出來
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>
對於映射如何表述?可使用XML也還可使用註解的形式
他們又有哪些語法?每種形式的利弊是什麼?字段屬性都有哪些?
參數如何設置? 返回結果又是如何設置呢?等等
儘管這一系列的實現都很複雜,可是,仍舊是圍繞着核心信息來的
 
因此對於Mybatis的學習,最開始應該瞭解總體的處理過程,瞭解各塊
而後就是深刻學習配置文件以及映射的設置配置
最後就是了解源碼的架構
若是還有精力,最好的文檔就是源碼了
 

附錄:完整代碼

數據庫
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '默認姓名' COMMENT '姓名',
`age` int(11) DEFAULT '1',
`sex` varchar(255) DEFAULT NULL,
`random` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

項目結構

image_5c4fb3ca_70aa

mybatis-config.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/sampledb?useUnicode=true&amp;characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/myMapper.xml"/>
</mappers>
</configuration>

myMapper.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="mapper.myMapper">
<select id="selectStudent" resultType="first.Student">
select * from student where id = #{id}
</select>
</mapper>

Student

package first;
 
public class Student {
 
private Long id;
 
private String name;
 
private Integer age;
 
private String sex;
 
public Long getId() {
return id;
}
 
public void setId(Long id) {
this.id = id;
}
 
public String getName() {
return name;
}
 
public void setName(String name) {
this.name = name;
}
 
public Integer getAge() {
return age;
}
 
public void setAge(Integer age) {
this.age = age;
}
 
public String getSex() {
return sex;
}
 
public void setSex(String sex) {
this.sex = sex;
}
 
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Student{");
sb.append("id=").append(id);
sb.append(", name='").append(name).append('\'');
sb.append(", age=").append(age);
sb.append(", sex='").append(sex).append('\'');
sb.append('}');
return sb.toString();
}
}

測試代碼

package first;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Test {

public static void main(String[] args) throws Exception {

/*
* 每一個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例爲中心的。
* SqlSessionFactory 的實例能夠經過 SqlSessionFactoryBuilder 得到。
* 而 SqlSessionFactoryBuilder 則能夠從 XML 配置文件或一個預先定製的 Configuration 的實例構建出 SqlSessionFactory 的實例。
* */
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/*
* 從 SqlSessionFactory 中獲取 SqlSession
* */
SqlSession session = sqlSessionFactory.openSession();
try {
Student student = (Student) session.selectOne("mapper.myMapper.selectStudent", 2);
System.out.println(student);
} finally {
session.close();
}
}
}

接口應用

而對於SQL的執行更好的一種方式是使用接口,而不是直接經過字符串去定位須要執行的目標資源
藉助於接口不是基於字符串常量的,就會更安全,並且使用接口邏輯概念更加清晰
 
在原有結構上增長一個接口和一個映射文件
image_5c4fb3ca_14ce
 
MyMapper.java
package first;
public interface MyMapper {
Student selectStudent(Integer id);
}
myMapper2.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="first.MyMapper">
<select id="selectStudent" resultType="first.Student">
select * from student where id = #{id}
</select>
</mapper>
從下圖能夠看得出來接口與XML映射的數據對照關係,XML映射文件的namespace須要與接口的全限定名對應
接口的方法名對應XML映射的id
接口方法返回類型爲XML映射的ResultMap(resultType)
接口方法的參數對應XML映射的入參
image_5c4fb3ca_d79
新增長了一個XML映射文件,須要將路徑添加到配置中
image_5c4fb3ca_5963
增長一個測試類
package first;
 
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 
public class Test2 {
 
    public static void main(String[] args) throws Exception {
    /*
    * 每一個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例爲中心的。
    * SqlSessionFactory 的實例能夠經過 SqlSessionFactoryBuilder 得到。
    * 而 SqlSessionFactoryBuilder 則能夠從 XML 配置文件或一個預先定製的 Configuration 的實例構建出 SqlSessionFactory 的實例。
    * */
    String resource = "config/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"development");
     
    /*
    * 從 SqlSessionFactory 中獲取 SqlSession
    * */
    SqlSession session = sqlSessionFactory.openSession();
    try {
        MyMapper mapper = session.getMapper(MyMapper.class);
        Student student = mapper.selectStudent(2);
        System.out.println(student);
    } finally {
        session.close();
    }
}
 
}
關鍵代碼爲
      MyMapper mapper = session.getMapper(MyMapper.class);
      Student student = mapper.selectStudent(2);
結果與前面一致
相關文章
相關標籤/搜索