初识mybatis
說道JavaWeb,很多人都知道SSH,這里的H代表了hibernate,這是一個(gè)數(shù)據(jù)庫(kù)訪問框架,hibernate在Java開發(fā)中的地位也是相當(dāng)高,眾所周知的JPA標(biāo)準(zhǔn)就是由hibernate主導(dǎo)完成的。然而,數(shù)據(jù)庫(kù)訪問框架除了hibernate之外,還有另外一個(gè)大名鼎鼎的數(shù)據(jù)庫(kù)框架,那就是mybatis,mybatis的前身ibatis早在2001年就發(fā)布了,那么這里我不想過多的去比較這兩個(gè)東西孰優(yōu)孰劣,因?yàn)楫?dāng)你真正了解了這兩個(gè)框架之后自然就知道在什么情況下該用什么框架。OK,廢話不多說,那么今天我們就來(lái)看看mybatis的基本使用吧。
mybatis在使用的過程中,我們可以通過XML的方式來(lái)構(gòu)建,也可以通過Java代碼來(lái)構(gòu)建,本文我先用Java代碼來(lái)創(chuàng)建,下一篇博客我們?cè)賮?lái)介紹如何用XML來(lái)構(gòu)建。
OK,那么在開始寫代碼之前,我們還是有必要先來(lái)了解下mybatis中幾個(gè)基本的組件:
1.SqlSessionFactoryBuilder:這是一個(gè)SqlSessionFactory的構(gòu)造器,它根據(jù)我們的xml配置文件或者Java代碼來(lái)生成SqlSessionFactory。
2.SqlSessionFactory:這個(gè)有點(diǎn)類似于我們?cè)贘DBC中使用的Connection,我們到時(shí)候要根據(jù)SqlSessionFactory來(lái)生成是一個(gè)會(huì)話,也就是SqlSession。
3.SqlSession:它可以發(fā)送一條SQL語(yǔ)句去執(zhí)行,并返回結(jié)果,從這個(gè)角度來(lái)說,它有點(diǎn)類似于PrepareStatement,當(dāng)然,我們也可以利用SqlSession獲取Mapper的接口,這個(gè)算是SqlSession的一個(gè)核心用法了。
4.Mapper:Mapper也可以發(fā)送一條SQL語(yǔ)句并返回執(zhí)行結(jié)果,Mapper由兩部分組成,一部分是Java接口,另一部分是XML配置文件或者注解。
OK,以上四點(diǎn)就是mybatis中非常基礎(chǔ)的四個(gè)組件,我們后面的代碼都將圍繞這四個(gè)類來(lái)展開。
創(chuàng)建Project并搭建環(huán)境
這里我們先不創(chuàng)建web工程,就以普通的Java工程為例,首先在IntelliJ中創(chuàng)建一個(gè)Java工程,然后在工程的根目錄下創(chuàng)建lib文件夾。由于現(xiàn)在mybatis托管在GitHub上,所以我們可以直接在GitHub上下載mybatis(點(diǎn)我下載),下載好之后,解壓,如圖:
mybatis-3.4.2.jar這個(gè)是mybatis的包,lib文件夾中是mybatis的依賴包,將這些jar包全部拷貝到我們的項(xiàng)目的lib文件夾中。另外,由于我這里使用的是mysql數(shù)據(jù)庫(kù),所以還要mysql 的驅(qū)動(dòng)jar包(點(diǎn)我下載),同時(shí)我使用了單元測(cè)試,所以還需要兩個(gè)單元測(cè)試相關(guān)的jar包(點(diǎn)我下載)。OK,搞完這些之后,我們的mybatis環(huán)境就算搭建好了,剛開始寫這樣搞吧,下篇博客我再來(lái)介紹通過Maven快速導(dǎo)入依賴。將所有的jar包都加進(jìn)來(lái)之后,我們的項(xiàng)目是這個(gè)樣子:
創(chuàng)建數(shù)據(jù)庫(kù)并預(yù)設(shè)數(shù)據(jù)
涉及到數(shù)據(jù)庫(kù)的操作,我先創(chuàng)建一個(gè)名為mybatis的數(shù)據(jù)庫(kù),然后在數(shù)據(jù)庫(kù)中創(chuàng)建名為user的數(shù)據(jù)表,再向表中添加四條數(shù)據(jù),結(jié)果如下:
創(chuàng)建數(shù)據(jù)庫(kù):
創(chuàng)建user表:
插入數(shù)據(jù)之后結(jié)果如下:
創(chuàng)建配置類并獲取SqlSessionFactory
這里我們使用Java代碼來(lái)創(chuàng)建配置類,一般情況下一個(gè)數(shù)據(jù)庫(kù)只需要有一個(gè)SqlSessionFactory實(shí)例,過多的SqlSessionFactory會(huì)導(dǎo)致數(shù)據(jù)庫(kù)有過多的連接,從而消耗過多的數(shù)據(jù)庫(kù)資源,因此SqlSessionFactory需要我們將之做成一個(gè)單例模式,如下:
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,關(guān)于這個(gè)工具類我說如下幾點(diǎn):
1.首先該類一共兩個(gè)工具方法,一個(gè)用來(lái)獲取SqlSessionFactory,另一個(gè)用來(lái)獲取SqlSession
2.獲取SqlSessionFactory的使用我們采用了單例模式,這是常見的單例寫法,不用多說
3.在獲取SqlSessionFactory的方法中,我們通過PooledDataSource對(duì)象的實(shí)例來(lái)設(shè)置數(shù)據(jù)庫(kù)驅(qū)動(dòng)、數(shù)據(jù)庫(kù)連接地址、數(shù)據(jù)庫(kù)用戶名和密碼等。
4.第15行的代碼我們創(chuàng)建了數(shù)據(jù)庫(kù)的運(yùn)行環(huán)境,并將這個(gè)環(huán)境命名為development
5.第17行代碼添加了一個(gè)映射器,這個(gè)映射器就是我們前文說的Mapper,用來(lái)執(zhí)行一個(gè)SQL 語(yǔ)句。
6.有了SqlSessionFactory之后接下來(lái)在27行我們就可以通過SqlSessionFactory來(lái)構(gòu)建一個(gè)SqlSession了。
構(gòu)建Mapper
Mapper可以通過Java接口+xml文件來(lái)構(gòu)成,也可以通過Java接口+注解來(lái)構(gòu)成,我這里先以Java接口+注解為例來(lái)說明,代碼如下:
public interface UserMapper {@Select(value = "select * from user where id=#{id}")public User getUser(Long id); }當(dāng)我調(diào)用getUser方法時(shí)實(shí)際上就執(zhí)行了@Select注解中的SQL語(yǔ)句,在執(zhí)行SQL語(yǔ)句的時(shí)候會(huì)將getUser方法的參數(shù)id傳入SQL 語(yǔ)句中。當(dāng)然這里還需要一個(gè)User對(duì)象,如下:
public class User {private Long id;private String username;private String password;private String address;//省略getter/setter }OK,做完這些之后我們就可以來(lái)測(cè)試了。
測(cè)試
創(chuàng)建兩個(gè)測(cè)試方法,如下:
@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方法中,我們先獲取一個(gè)SqlSession,然后通過SqlSession獲取我們剛剛創(chuàng)建的Mapper對(duì)象,調(diào)用Mapper中的方法就可以執(zhí)行查詢操作,test2執(zhí)行結(jié)果如下:
在mybatis中我們也可以不去獲取Mapper對(duì)象,直接去調(diào)用方法,這個(gè)就如test3的寫法。如果在Mapper中就只有這一個(gè)方法叫g(shù)etUser,我們也可以不用寫的這么冗長(zhǎng),可以像下面這樣簡(jiǎn)寫:
@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();}}}執(zhí)行結(jié)果如下:
OK,以上就是mybatis的一個(gè)簡(jiǎn)單應(yīng)用,這里我們主要說了使用Java代碼和注解來(lái)代替XML配置文件,下篇博客和小伙伴們聊聊一種更常用的方法就是XML配置。
本文案例下載:
本文GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis2。
以上。
參考資料:
1.http://www.mybatis.org/mybatis-3/zh/index.html
2.《深入淺出MyBatis 技術(shù)原理與實(shí)戰(zhàn)》第二章
轉(zhuǎn)載于:https://www.cnblogs.com/qitian1/p/6461631.html
總結(jié)
- 上一篇: linux usb驱动框架
- 下一篇: css之其它技巧和经验列表