初识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();} }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); }當我調用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 }OK,做完這些之后我們就可以來測試了。
測試
創建兩個測試方法,如下:
@org.junit.Testpublic 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.Testpublic 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();}}}在test2方法中,我們先獲取一個SqlSession,然后通過SqlSession獲取我們剛剛創建的Mapper對象,調用Mapper中的方法就可以執行查詢操作,test2執行結果如下:
在mybatis中我們也可以不去獲取Mapper對象,直接去調用方法,這個就如test3的寫法。如果在Mapper中就只有這一個方法叫getUser,我們也可以不用寫的這么冗長,可以像下面這樣簡寫:
@org.junit.Testpublic 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();}}}執行結果如下:
OK,以上就是mybatis的一個簡單應用,這里我們主要說了使用Java代碼和注解來代替XML配置文件,下篇博客和小伙伴們聊聊一種更常用的方法就是XML配置。
本文案例下載:
本文GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis2。
以上。
參考資料:
1.http://www.mybatis.org/mybatis-3/zh/index.html
2.《深入淺出MyBatis 技術原理與實戰》第二章
轉載于:https://www.cnblogs.com/qitian1/p/6461631.html
總結
- 上一篇: linux usb驱动框架
- 下一篇: css之其它技巧和经验列表