笔记·mybatis核心对象和全局配置文件
jar包官網(wǎng):
https://mvnrepository.com/artifact/org.mybatis
介紹:
持久化:
持久,即把數(shù)據(jù)(如內(nèi)存中的對(duì)象)保存到可以永久保存的存儲(chǔ)設(shè)備中,持久化的主要應(yīng)用是將內(nèi)存中的數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中,也可以保存在磁盤文件、XML數(shù)據(jù)文件中
什么是持久層
持久層(Persistence Layer),即專注于實(shí)現(xiàn)數(shù)據(jù)持久化應(yīng)用領(lǐng)域的某個(gè)特定系統(tǒng)的一個(gè)邏輯層面,將數(shù)據(jù)使用者和數(shù)據(jù)實(shí)體相關(guān)聯(lián)之前使用BC訪問數(shù)據(jù)庫的DAO層
后面采用 MyBatis訪問數(shù)據(jù)庫的 mapper層,就是持久層
MyBatis
MyBatis本是 Apache的一個(gè)開源項(xiàng)目 Batis,2010年這個(gè)項(xiàng)目由 Apache Software Foundation遷移到了 Google Code,且改名為 MyBatis.2013年11月遷移到 GitHub
iBATIS詞來源于internet和abatis的組合,是一個(gè)基于java的持久層框架
MyBatis是一款優(yōu)秀的持久層框架,它支持定制化SQL、存儲(chǔ)過程以及高級(jí)映射,半自動(dòng)的ORM框架,本質(zhì)是對(duì)JDBC的封裝
MyBatis避免了幾乎所有的JDBC代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集 ,MyBatis可以使用簡(jiǎn)單的XML或注解來配置和映射原生信息將接口和java的pojos(Plain Ordinary Java Object普通的Java對(duì)象)映射成數(shù)據(jù)庫中的記錄
mybatis相對(duì)于純jdbc來說,隱藏了重復(fù)性的工作,mybatis是一個(gè)半自動(dòng)化的orm框架,為什么說是半自動(dòng)化的呢,因?yàn)樗枰覀冏约喝憇ql,而他做的更好的地方就是動(dòng)態(tài)sql的支持上面,而上面說的各種技術(shù),面對(duì)與動(dòng)態(tài)sql只能自己寫很多判斷去組裝sql,而這些判斷和組裝在mybatis中實(shí)現(xiàn)起來
就非常簡(jiǎn)單了,完全由mybatis去幫我們實(shí)現(xiàn)了。mybatis將sql交由開發(fā)者去控制,所以在sql的優(yōu)化方面,開發(fā)者可以隨心所欲,也就是說mybatis將重復(fù)性的工作優(yōu)化到了極致:操作db的過程、動(dòng)態(tài)sql的拼裝、結(jié)果和對(duì)象的映射,這些mybatis都幫我們實(shí)現(xiàn)的很好,而讓我們將更多的經(jīng)歷花在sql的寫法和優(yōu)化上面
用sqlyog連接數(shù)據(jù)庫:
DROP TABLE IF EXISTS `t_user`; CREATE TABLE t_user ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵,用戶id,自動(dòng)增長(zhǎng)', `name` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '姓名', `age` SMALLINT NOT NULL DEFAULT 1 COMMENT '年齡', `salary` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '薪水' ) COMMENT '用戶表'; SELECT * FROM t_user;顯示:
Mybatis核心對(duì)象介紹:
SqlSessionFactoryBuilder
這個(gè)是一個(gè)構(gòu)建器,通過名字大家也可以感覺到SqlSessionFactoryBuilder 構(gòu)建器,是用來構(gòu)建
SqlSessionFactory 對(duì)象的,SqlSessionFactoryBuilder可以通過讀取mybatis的配置文件,然后構(gòu)建一個(gè)SqlSessionFactory 對(duì)象,一個(gè)項(xiàng)目中有很多mapper xml 文件,如果每次操作都去重新解析是非常慢的,那么怎么辦?
能不能第一次解析好然后放在內(nèi)存中,以后直接用,SqlSessionFactoryBuilder就是搞這個(gè)事情的,將mybatis配置文件、mapper xml 文件、mapper xml 文件和Mapper 接口的映射關(guān)系,這些都先給解析好,然后放在java對(duì)象中,java對(duì)象存在于內(nèi)存中,內(nèi)存中訪問會(huì)非常快的,那么我們每次去用的時(shí)候就不需要重新去解析xml了,SqlSessionFactoryBuilder解析配置之后,生成的對(duì)象就是
SqlSessionFactory ,這個(gè)是一個(gè)重量級(jí)的對(duì)象,創(chuàng)建他是比較耗時(shí)的,所以一般一個(gè)db我們會(huì)創(chuàng)建一個(gè)SqlSessionFactory 對(duì)象,然后在系統(tǒng)運(yùn)行過程中會(huì)一直存在,而SqlSessionFactoryBuilder用完了就可以釋放了。
SqlSessionFactory
通過名字可以知道,這個(gè)是一個(gè)工廠,是用來創(chuàng)建SqlSession 的工廠, SqlSessionFactory 是一個(gè)重量級(jí)的對(duì)象,一般一個(gè)db對(duì)應(yīng)一個(gè)SqlSessionFactory 對(duì)象,系統(tǒng)運(yùn)行過程中會(huì)一直存在。SqlSessionFactory是一個(gè)接口,這個(gè)接口有2個(gè)實(shí)現(xiàn)DefaultSqlSessionFactory 和
SqlSessionManager ,一般都是通過SqlSessionFactoryBuilder 來創(chuàng)建SqlSessionFactory 對(duì)
象。
通過SqlSessionFactoryBuilder 來創(chuàng)建SqlSessionFactory 對(duì)象主要有2種方式,一種通過讀取mybatis配置文件的方式,另外一種是硬編碼的方式。
SqlSession
**我們通過jdbc操作數(shù)據(jù)庫需要先獲取一個(gè)Connection 連接,然后拿著這個(gè)連接去對(duì)db進(jìn)行操作,**在mybatis中SqlSession 就類似于jdbc中Connection 連接對(duì)象,在mybatis中叫做Sql會(huì)話對(duì)象,一般我們一個(gè)db操作使用一個(gè)SqlSession 對(duì)象,所以這個(gè)對(duì)象一般是方法級(jí)別的,方法結(jié)束之后,這個(gè)對(duì)象就銷毀了,這個(gè)對(duì)象可以調(diào)用sqlSessionFactory.openSession 的方法來進(jìn)行獲取。
我們可以直接通過SqlSession對(duì)象來調(diào)用mapper xml 中各種db操作,需要指定具體的操作的id,id的格式為namespace.操作的id 。
Mapper接口
我們可以通過SqlSession直接調(diào)用mapper xml 中的db操作,不過更簡(jiǎn)單的以及推薦的方式是使用Mapper接口, **Mapper接口中的方法和mapper xml文件中的各種db操作建立了映射關(guān)系,是通過Mapper接口完整名稱+方法名稱和mapper xml 中的namespace+具體操作的id 來進(jìn)行關(guān)聯(lián)的,**然后我們直接調(diào)用Mapper接口中的方法就可以間接的操作db了,使用方便, Mapper接口需要通過SqlSession 獲取,傳入Mapper接口對(duì)應(yīng)的Class 對(duì)象,然后會(huì)返回這個(gè)接口的實(shí)例,如:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
配置mybatis全局配置文件
使用mybatis操作數(shù)據(jù)庫,那么當(dāng)然需要配置數(shù)據(jù)庫相關(guān)信息,這個(gè)需要在mybatis全局配置文件中進(jìn)
行配置。
mybatis需提供一個(gè)全局配置的xml文件,可以在這個(gè)配置文件中對(duì)mybatis進(jìn)行配置,如事務(wù)的支持,
數(shù)據(jù)源的配置等等,這個(gè)屬于配置文件,我們一般放在main/resource 中。
src/main/resource 中創(chuàng)建mybatis-config.xml 文件,內(nèi)容如下:
configuration元素
這個(gè)是mybatis全局配置文件的根元素,每個(gè)配置文件只有一個(gè)environments元素用來配置mybatis的環(huán)境信息,什么是環(huán)境?比如開發(fā)環(huán)境、測(cè)試環(huán)境、線上環(huán)境,這3個(gè)環(huán)境中的數(shù)據(jù)庫可能是不一樣的,可能還有更多的環(huán)境。
environments元素中用來配置多個(gè)環(huán)境的,具體的一個(gè)環(huán)境使用environment 元素進(jìn)行配置,environment元素有個(gè)id用來標(biāo)識(shí)某個(gè)具體的環(huán)境。
配置了這么多環(huán)境,那么mybatis具體會(huì)使用哪個(gè)呢?environments 元素有個(gè)default 屬性,用來指定默認(rèn)使用哪個(gè)環(huán)境.
environment元素用來配置具體的環(huán)境信息,這個(gè)元素下面有兩個(gè)子元素:transactionManager和dataSource
transactionManager和dataSource
transactionManager元素用來配置事務(wù)工廠的,有個(gè)type屬性,type的值必須是
org.apache.ibatis.transaction.TransactionFactory 接口的實(shí)現(xiàn)類,TransactionFactory 看名字就知道是一個(gè)工廠,用來創(chuàng)建事務(wù)管理器
org.apache.ibatis.transaction.Transaction 對(duì)象的, TransactionFactory 接口默認(rèn)有2個(gè)實(shí)現(xiàn):
org.apache.ibatis.transaction.managed.ManagedTransactionFactory
org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory
一般情況下我們使用org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory 這
個(gè),mybatis和其他框架集成,比如和spring集成,事務(wù)交由spring去控制,spring中有TransactionFactory 接口的一個(gè)實(shí)現(xiàn)
org.mybatis.spring.transaction.SpringManagedTransactionFactory
dataSource元素
這個(gè)用來配置數(shù)據(jù)源的,type屬性的值必須為接口
org.apache.ibatis.datasource.DataSourceFactory 的實(shí)現(xiàn)類, DataSourceFactory 也是一個(gè)工廠,用來創(chuàng)建數(shù)據(jù)源javax.sql.DataSource 對(duì)象的,mybatis中這個(gè)接口默認(rèn)有3個(gè)實(shí)現(xiàn)類:
org.apache.ibatis.datasource.jndi.JndiDataSourceFactory
org.apache.ibatis.datasource.pooled.PooledDataSourceFactory
org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory
配置數(shù)據(jù)源需要指定數(shù)據(jù)庫連接的屬性信息,比如:驅(qū)動(dòng)、連接db的url、用戶名、密碼,這個(gè)在dataSource元素下面的property 中配置, property 元素的格式:
<property name="屬性名稱" value="值"/>創(chuàng)建Mapper xml文件
我們需要對(duì)t_user表進(jìn)行操作,需要寫sql,sql寫在什么地方呢?
在mybatis中一般我們將一個(gè)表的所有sql操作寫在一個(gè)mapper xml中,一般命名為XXXMapper.xml 格式。
創(chuàng)建文件src/main/resource/mapper/UserMapper.xml ,內(nèi)容如下
mapper xml 根元素為mapper ,這個(gè)元素有個(gè)namespace 屬性,系統(tǒng)中會(huì)有很多表,每個(gè)表對(duì)應(yīng)一個(gè)Mapper xml ,為了防止mapper文件重復(fù),我們需要給每個(gè)mapper xml文件需要指定一個(gè)namespace,通過這個(gè)可以區(qū)分每個(gè)mapper xml文件,上面我們指定為chat02.UserMapper 。
構(gòu)建SqlSessionFactory對(duì)象
//指定mybatis全局配置文件 String resource = "mybatis-config.xml"; //讀取全局配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //構(gòu)建SqlSessionFactory對(duì)象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSessionFactory是一個(gè)接口,是一個(gè)重量級(jí)的對(duì)象,SqlSessionFactoryBuilder通過讀取全局配置文件來創(chuàng)建一個(gè)SqlSessionFactory ,創(chuàng)建這個(gè)對(duì)象是比較耗時(shí)的,主要耗時(shí)在對(duì)mybatis全局配置文件的解析上面,全局配置文件中包含很多內(nèi)容,SqlSessionFactoryBuilder通過解析這些內(nèi)容,創(chuàng)建了一個(gè)復(fù)雜的SqlSessionFactory 對(duì)象,這個(gè)對(duì)象的生命周期一般和應(yīng)用的生命周期是一樣的,隨著應(yīng)用的啟動(dòng)而創(chuàng)建,隨著應(yīng)用的停止而結(jié)束,所以一般是一個(gè)全局對(duì)象,一般情況下一個(gè)db對(duì)應(yīng)一個(gè)SqlSessionFactory對(duì)象。
構(gòu)建SqlSession對(duì)象
SqlSession相當(dāng)于jdbc中的Connection對(duì)象,相當(dāng)于數(shù)據(jù)庫的一個(gè)連接,可以用SqlSession來對(duì)db進(jìn)行操作:如執(zhí)行sql、提交事務(wù)、關(guān)閉連接等等,需要通過SqlSessionFactory 來創(chuàng)建SqlSession 對(duì)象, SqlSessionFactory 中常用的有2個(gè)方法來創(chuàng)建SqlSession對(duì)象,如下:
//創(chuàng)建一個(gè)SqlSession,默認(rèn)不會(huì)自動(dòng)提交事務(wù) SqlSession openSession(); //創(chuàng)建一個(gè)SqlSession,autoCommit:指定是否自動(dòng)提交事務(wù) SqlSession openSession(boolean autoCommit);SqlSession接口中很多方法,直接用來操作db,方法清單如下:
T selectOne(String statement);
T selectOne(String statement, Object parameter);
List selectList(String statement);
List selectList(String statement, Object parameter);
List selectList(String statement, Object parameter, RowBounds rowBounds);
<K, V> Map<K, V> selectMap(String statement, String mapKey);
<K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);
<K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey,
RowBounds rowBounds);
Cursor selectCursor(String statement);
Cursor selectCursor(String statement, Object parameter);
Cursor selectCursor(String statement, Object parameter, RowBounds
rowBounds);
void select(String statement, Object parameter, ResultHandler handler);
void select(String statement, ResultHandler handler);
void select(String statement, Object parameter, RowBounds rowBounds,
ResultHandler handler);
int insert(String statement);
int insert(String statement, Object parameter);
int update(String statement);
int update(String statement, Object parameter);
int delete(String statement);
int delete(String statement, Object parameter);
void commit();
void commit(boolean force);
void rollback();
void rollback(boolean force);
List flushStatements();
void close();
void clearCache();
Configuration getConfiguration();
T getMapper(Class type);
Connection getConnection();
以select 開頭的可以對(duì)db進(jìn)行查詢操作, insert 相關(guān)的可以對(duì)db進(jìn)行插入操作,update相關(guān)的可以對(duì)db進(jìn)行更新操作。
測(cè)試用例
UserTest 類中新增一個(gè)測(cè)試用例:
@Test public void insertUser() { try (SqlSession sqlSession = this.sqlSessionFactory.openSession(false);) { //創(chuàng)建UserModel對(duì)象 UserModel userModel = UserModel.builder().id(2L).name("javacode2018").age(30).salary(50000D).sex(1).bu ild(); //執(zhí)行插入操作 int result = sqlSession.insert("com.javacode2018.chat02.UserMapper.insertUser", userModel); log.info("插入影響行數(shù):{}", result); //提交事務(wù) sqlSession.commit(); } }運(yùn)行輸出如下:
01:46.683 [main] DEBUG c.j.chat02.UserMapper.insertUser - ==> Preparing: INSERT
INTO t_user (id,name,age,salary,sex) VALUES (?,?,?,?,?)
01:46.745 [main] DEBUG c.j.chat02.UserMapper.insertUser - > Parameters:
2(Long), javacode2018(String), 30(Integer), 50000.0(Double), 1(Integer)
01:46.751 [main] DEBUG c.j.chat02.UserMapper.insertUser - < Updates: 1
01:46.751 [main] INFO com.javacode2018.chat02.UserTest - 影響行數(shù):1
如果想自動(dòng)提交事務(wù),可以將上面的測(cè)試用例改成下面這樣:
@Test public void insertUser() { try (SqlSession sqlSession = this.sqlSessionFactory.openSession(true);) { //創(chuàng)建UserModel對(duì)象 UserModel userModel = UserModel.builder().id(1L).name("路人甲 Java").age(30).salary(50000D).sex(1).build(); //執(zhí)行插入操作 int result = sqlSession.insert("com.javacode2018.chat02.UserMapper.insertUser", userModel); log.info("影響行數(shù):{}", result); } }總結(jié)
以上是生活随笔為你收集整理的笔记·mybatis核心对象和全局配置文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VUE双向数据绑定
- 下一篇: python元组 字符串 字典 习题+总