初識mybatis

說道JavaWeb,很多人都知道SSH,這裏的H代表了hibernate,這是一個數據庫訪問框架,hibernate在Java開發中的地位也是相當高,衆所周知的JPA標準就是由hibernate主導完成的。然而,數據庫訪問框架除了hibernate之外,還有另外一個大名鼎鼎的數據庫框架,那就是mybatis,mybatis的前身ibatis早在2001年就發佈了,那麼這裏我不想過多的去比較這兩個東西孰優孰劣,因爲當你真正瞭解了這兩個框架之後自然就知道在什麼情況下該用什麼框架。OK,廢話不多說,那麼今天我們就來看看mybatis的基本使用吧。 
mybatis在使用的過程中,我們可以通過XML的方式來構建,也可以通過Java代碼來構建,本文我先用Java代碼來創建,下一篇博客我們再來介紹如何用XML來構建。 
OK,那麼在開始寫代碼之前,我們還是有必要先來了解下mybatis中幾個基本的組件:

1.SqlSessionFactoryBuilder:這是一個SqlSessionFactory的構造器,它根據我們的xml配置文件或者Java代碼來生成SqlSessionFactory。 
2.SqlSessionFactory:這個有點類似於我們在JDBC中使用的Connection,我們到時候要根據SqlSessionFactory來生成是一個會話,也就是SqlSession。 
3.SqlSession:它可以發送一條SQL語句去執行,並返回結果,從這個角度來說,它有點類似於PrepareStatement,當然,我們也可以利用SqlSession獲取Mapper的接口,這個算是SqlSession的一個核心用法了。 
4.Mapper:Mapper也可以發送一條SQL語句並返回執行結果,Mapper由兩部分組成,一部分是Java接口,另一部分是XML配置文件或者註解。

OK,以上四點就是mybatis中非常基礎的四個組件,我們後面的代碼都將圍繞這四個類來展開。


創建Project並搭建環境

這裏我們先不創建web工程,就以普通的Java工程爲例,首先在IntelliJ中創建一個Java工程,然後在工程的根目錄下創建lib文件夾。由於現在mybatis託管在GitHub上,所以我們可以直接在GitHub上下載mybatis(點我下載),下載好之後,解壓,如圖: 
這裏寫圖片描述 
mybatis-3.4.2.jar這個是mybatis的包,lib文件夾中是mybatis的依賴包,將這些jar包全部拷貝到我們的項目的lib文件夾中。另外,由於我這裏使用的是mysql數據庫,所以還要mysql 的驅動jar包(點我下載),同時我使用了單元測試,所以還需要兩個單元測試相關的jar包(點我下載)。OK,搞完這些之後,我們的mybatis環境就算搭建好了,剛開始寫這樣搞吧,下篇博客我再來介紹通過Maven快速導入依賴。將所有的jar包都加進來之後,我們的項目是這個樣子: 
這裏寫圖片描述

創建數據庫並預設數據

涉及到數據庫的操作,我先創建一個名爲mybatis的數據庫,然後在數據庫中創建名爲user的數據表,再向表中添加四條數據,結果如下: 
創建數據庫: 
這裏寫圖片描述 
創建user表: 
這裏寫圖片描述 
插入數據之後結果如下: 
這裏寫圖片描述

創建配置類並獲取SqlSessionFactory

這裏我們使用Java代碼來創建配置類,一般情況下一個數據庫只需要有一個SqlSessionFactory實例,過多的SqlSessionFactory會導致數據庫有過多的連接,從而消耗過多的數據庫資源,因此SqlSessionFactory需要我們將之做成一個單例模式,如下:

public class DBUtils {

    private static SqlSessionFactory sqlSessionFactory = null;
    private static final Class CLASS_LOCK = DBUtils.class;

    public static SqlSessionFactory initSqlSessionFactory() {
        synchronized (CLASS_LOCK) {
            if (sqlSessionFactory == null) {
                PooledDataSource dataSource = new PooledDataSource();
                dataSource.setDriver("com.mysql.jdbc.Driver");
                dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
                dataSource.setUsername("root");
                dataSource.setPassword("sang");
                TransactionFactory transactionFactory = new JdbcTransactionFactory();
                Environment environment = new Environment("development", transactionFactory, dataSource);
                Configuration configuration = new Configuration(environment);
                configuration.addMapper(UserMapper.class);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
            }
        }
        return sqlSessionFactory;
    }

    public static SqlSession openSqlSession() {
        if(sqlSessionFactory==null)
            initSqlSessionFactory();
        return sqlSessionFactory.openSession();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

OK,關於這個工具類我說如下幾點:

1.首先該類一共兩個工具方法,一個用來獲取SqlSessionFactory,另一個用來獲取SqlSession 
2.獲取SqlSessionFactory的使用我們採用了單例模式,這是常見的單例寫法,不用多說 
3.在獲取SqlSessionFactory的方法中,我們通過PooledDataSource對象的實例來設置數據庫驅動、數據庫連接地址、數據庫用戶名和密碼等。 
4.第15行的代碼我們創建了數據庫的運行環境,並將這個環境命名爲development 
5.第17行代碼添加了一個映射器,這個映射器就是我們前文說的Mapper,用來執行一個SQL 語句。 
6.有了SqlSessionFactory之後接下來在27行我們就可以通過SqlSessionFactory來構建一個SqlSession了。

構建Mapper

Mapper可以通過Java接口+xml文件來構成,也可以通過Java接口+註解來構成,我這裏先以Java接口+註解爲例來說明,代碼如下:

public interface UserMapper {
    @Select(value = "select * from user where id=#{id}")
    public User getUser(Long id);
}
  • 1
  • 2
  • 3
  • 4

當我調用getUser方法時實際上就執行了@Select註解中的SQL語句,在執行SQL語句的時候會將getUser方法的參數id傳入SQL 語句中。當然這裏還需要一個User對象,如下:

public class User {
    private Long id;
    private String username;
    private String password;
    private String address;

    //省略getter/setter
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

OK,做完這些之後我們就可以來測試了。

測試

創建兩個測試方法,如下:

@org.junit.Test
    public void test2() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.getUser(3l);
            System.out.println(user.toString());
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

    @org.junit.Test
    public void test3() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            User user = (User) sqlSession.selectOne("org.sang.db.UserMapper.getUser", 1l);
            System.out.println(user.toString());
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

在test2方法中,我們先獲取一個SqlSession,然後通過SqlSession獲取我們剛剛創建的Mapper對象,調用Mapper中的方法就可以執行查詢操作,test2執行結果如下: 
這裏寫圖片描述

在mybatis中我們也可以不去獲取Mapper對象,直接去調用方法,這個就如test3的寫法。如果在Mapper中就只有這一個方法叫getUser,我們也可以不用寫的這麼冗長,可以像下面這樣簡寫:

    @org.junit.Test
    public void test4() {
        SqlSession sqlSession = null;
        try {
            sqlSession = DBUtils.openSqlSession();
            User user = (User) sqlSession.selectOne("getUser", 1l);
            System.out.println(user.toString());
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

執行結果如下: 
這裏寫圖片描述 
OK,以上就是mybatis的一個簡單應用,這裏我們主要說了使用Java代碼和註解來代替XML配置文件,下篇博客和小夥伴們聊聊一種更常用的方法就是XML配置。

本文案例下載: 
本文GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章