MyBatis快速入門之環境搭建和單表對映

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

一.MyBatis簡介

    一說起物件關係對映框架,大家第一時間想到的肯定是Hibernate。Hibernate作為一個著名的框架,功能十分強大。我們只需要配置好實體類和資料表之間的關係,Hibernate就會自動幫我們完成生成並執行SQL語句,對映結果集這樣的工作。但是也正是由於Hibernate如此強大的功能,導致了它的缺點:一是非常笨重,啟動Hibernate的SessionFactory非常耗時,開銷巨大;二是配置複雜,學習成本較高,系統調優也不容易;三是自定義查詢功能較弱,查詢結果如果不是對映的實體類,查詢起來就比較麻煩。因此另一個ORM框架MyBatis,越來越流行。

    前面說到的幾個Hibernate的缺點,反過來正好就是MyBatis的優點:一是非常輕量,系統開銷小;二是配置簡單,易於學習,官方文件我直覺上感覺比Log4j2的文件還少;三正好就是MyBatis的特點,對映查詢結果非常靈活。另外MyBatis還有一個優點就是自帶中文文件,可能有些地方感覺不太通順,但是完全足夠我們學習和使用了。

二.配置環境

1.依賴引入

    新增MyBatis最簡單的辦法就是使用Maven或Gradle這樣的構建工具。在這裡我使用Gradle。在專案中新增如下幾行即可。如果確定不使用新的Java 8 時間API,那麼第二行的依賴還可以去掉。這裡我用的資料庫是MySQL,因此還需要新增MySQL的JDBC驅動。


compile group: 'org.mybatis', name: 'mybatis', version: '3.4.2'
compile group: 'org.mybatis', name: 'mybatis-typehandlers-jsr310', version: '1.0.2'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.40'

2.配置檔案

    然後我們需要編寫MyBatis的配置和對映檔案。所有這些配置檔案最好放在類路徑上,對於Gradle專案來說就是src/main/resources資料夾下。我們先來編寫一個配置檔案。配置檔案每個部分的詳細作用請參見官方文件,這裡只簡單說明一下。

        屬性部分。在這裡定義MyBatis需要的屬性,可以用在下面的多個地方。另外屬性也可以從外部properties檔案中匯入。

        系統設定。在這裡指定MyBatis的全域性配置。詳細的配置參加文件。

        簡寫名。在對映檔案中需要指定Java實體類的全名,我們可以在這裡指定簡寫名簡化配置。

        環境。在這裡我們要指定資料庫連線、事務管理器等配置。還可以指定測試環境、生產環境等多個環境對應不同的資料庫配置。

        對映檔案。在這裡指定對映檔案,或者也可以新增使用註解配置的類。


<?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>
<!--指定屬性-->
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="12345678"/>
<property name="driver.useSSL" value="false"/>
</properties>
<!--系統設定-->
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<!--指定簡寫名-->
<typeAliases>
<package name="yitian.study.entity"/>
</typeAliases>
<!--配置環境,可以配置多個環境用於測試、除錯和生產-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--配置對映檔案-->
<mappers>
<mapper resource="BaseEntityMapper.xml"/>
</mappers>
</configuration>

3.建立SqlSessionFactory

    有了配置檔案,我們就可以開始使用MyBatis了。首先要做的事情是建立MyBatis的SqlSessionFactory,它和Hibernate的SessionFactory類似,是主要的工廠類,一個應用程式中只需要建立一個即可。
    下面是一個工具類,用雙檢鎖簡單的實現了一個執行緒安全的工具類。核心程式碼在最內層的if判斷中。由於配置檔案在類路徑上,所以我們只需要指定檔名即可。這裡用到了MyBatis提供的Resources工具類,建立一個輸入流,然後交給SqlSessionFactoryBuilder來建立一個SqlSessionFactory。


public abstract class MyBatisUtils {
private static volatile SqlSessionFactory sqlSessionFactory;
public static final String MyBatisConfigLocation = "configuration.xml";
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
if (sqlSessionFactory == null) {
synchronized (MyBatisUtils.class) {
if (sqlSessionFactory == null) {
InputStream input = Resources.getResourceAsStream(MyBatisConfigLocation);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
input.close();
}
}
}
return sqlSessionFactory;
}
}

    建立好SqlSessionFactory之後,我們就可以開始使用MyBatis了。這裡先回過頭看看如何建立MyBatis對映檔案。然後我們在繼續使用MyBatis。

三.單表對映

1.資料表和實體類

    在配置檔案最後的mapper部分定義的就是對映檔案。對映檔案也是我們需要重點學習的地方。在對映檔案中我們需要定義各種SQL語句,並建立它們和Java實體類之間的關係。這裡我們使用最簡單的單表對映:資料表和實體類之間屬性名相同,一一對應。

    首先先來新增一個實體類。


public class Person {
private int id;
private String username;
private LocalDate birthday;
}

    對應的資料庫表如下。


CREATE TABLE person (
id    INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
birthday DATE
);

2.對映檔案

    然後我們來編寫對映檔案。對映檔案包含5條SQL語句,分別是增刪查改以及按名稱查詢。每一條語句都需要一個識別符號,將會在後面再程式碼中用到。如果是查詢語句還需要resultType,指定返回型別。MyBatis會將資料表列明和這裡指定的型別屬性按名稱自動對映起來。如果需要在語句中傳入引數,可以使用 parameterType屬性,指定Java實體類的全名或簡寫,然後就可以在SQL語句中使用#{}來訪問引數的屬性了。如果是簡單的對映,那麼parameterType屬性還可以省略,MyBatis會自動從傳入的Java物件中獲取相應的屬性。對於某些資料庫(例如MySQL),還可以在插入的時候指定useGeneratedKeys=”true”,讓資料庫自動生成主鍵。


<?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="yitian.study.dao.mapper">
<select id="selectPerson"
resultType="Person" parameterType="Person">
SELECT *
FROM Person
WHERE id = #{id}
</select>
<select id="selectPersonByName"
resultType="Person">
SELECT *
FROM Person
WHERE username = #{username}
</select>
<insert id="insertPerson"
useGeneratedKeys="true">
INSERT INTO Person (username, birthday) VALUES (#{username}, #{birthday})
</insert>
<update id="updatePerson">
UPDATE Person
SET birthday = #{birthday}
WHERE id = #{id}
</update>
<delete id="deletePerson">
DELETE FROM Person
WHERE id = #{id}
</delete>
</mapper>

四.使用MyBatis

    以上這些都配置好之後,我們就可以來使用MyBatis了。這裡我們使用一個單元測試來檢視MyBatis的功能。在建立SQLSessionFactory之後,我們需要獲取MyBatis最核心的物件SqlSession,所有操作都需要SqlSession來進行。另外它是非執行緒安全的物件,不能放在類的靜態欄位上,最好也不要作為例項欄位。我們要在需要的時候建立它,不用的時候及時釋放。
    常用的方法有增刪查改這幾個方法。這些方法的第一個引數是前面我們在對映檔案中定義的語句ID,第二個引數是要傳入的引數。對於查詢來說有selectOne和selectList方法,它們的區別主要在於返回個數,如果確定只返回一個物件就使用selectOne方法。


import static org.assertj.core.api.Assertions.*;
public class MyBatisTest {
private static SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
@BeforeClass
public static void init() throws IOException {
sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
}
@Before
public void before() {
sqlSession = sqlSessionFactory.openSession(true);//自動提交
}
@After
public void after() {
sqlSession.close();
}
@Test
public void testMyBatisUtils() {
assertThat(sqlSessionFactory).isNotNull();
}
@Test
public void testInsert() {
Person p = new Person(0, "yitian", LocalDate.of(1993, 5, 6));
sqlSession.insert("insertPerson", p);
Person s = sqlSession.selectOne("selectPersonByName", p.getUsername());
assertThat(s).isNotNull();
System.out.println(s);
sqlSession.delete("deletePerson", s);
}
@Test
public void testUpdate() {
Person p = new Person(1, "leo", LocalDate.of(1993, 5, 6));
sqlSession.insert("insertPerson", p);
p = sqlSession.selectOne("selectPersonByName", p.getUsername());
LocalDate b = LocalDate.of(1987, 7, 8);
p.setBirthday(b);
sqlSession.update("updatePerson", p);
Person s = sqlSession.selectOne("selectPersonByName", p.getUsername());
assertThat(s.getBirthday()).isEqualTo(b);
System.out.println(s);
sqlSession.delete("deletePerson", s);
}
}

    另外預設情況下MyBatis的事務管理是開啟的,意味著我們必須顯式使用commit()方法才能提交事務。這裡在開啟SqlSession的時候指定了自動提交,這樣我們的所有更改都會立即反映到資料庫中。

五.使用對映類

    在前面的例子中,使用的都是字串來指定要使用的查詢。但是這樣做非常不方便,字串容易發生錯誤,而且無法獲得IDE的智慧補全。所以MyBatis提供了另一種方式來執行SQL語句,這就是使用對映類。
    對映類其實就是一個簡單的介面。該介面中的方法和對映檔案中定義的語句一一對應。介面方法的名稱必須和語句id完全相同,介面方法的返回值和引數和相應的語句相對應。


public interface PersonMapper {
Person selectPerson(int id);
Person selectPersonByName(String name);
void insertPerson(Person person);
void updatePerson(Person person);
void deletePerson(Person person);
}

       僅僅增加對映類還不夠,我們需要修改對映檔案,以便讓MyBatis能找到這個對映類。做法就是將對映檔案的名稱空間改為對應的對映檔案的類名。


<mapper namespace="yitian.study.mapper.PersonMapper">

    對映類定義和配置好之後,我們就可以使用了。使用方法很簡單,在SqlSession上呼叫getMapper方法,並傳入要獲取的Mapper類即可。


PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
Person p = new Person(0, "yitian", LocalDate.of(1993, 5, 6));
mapper.insertPerson(p);
Person s = mapper.selectPersonByName(p.getUsername());
assertThat(s).isNotNull();
System.out.println(s);
mapper.deletePerson(p);

    有了對映物件,我們就可以以型別安全的方式來存取物件了,同時還可以獲得IDE的補全功能。

以上所述是小編給大家介紹的MyBatis快速入門之環境搭建和單表對映,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對指令碼之家網站的支援!

您可能感興趣的文章:

MyBatis快速入門mybatis快速入門學習教程新手注意問題小結Mybatis 開發註解快速入門MyBatis快速入門(簡明淺析易懂)MyBatis入門學習教程(一)-MyBatis快速入門mybatis3.3 struts2.3.24 mysql5.1.22開發環境搭建圖文教程Java MyBatis MySQL開發環境搭建流程詳解Windows下Java MyBatis框架 MySQL的開發環境搭建教程

相關文章

程式語言 最新文章