mybatis 使用jdbc_MyBatis笔记一
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。
iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAOs)
MyBatis 的基本要素
三個基本要素:
1.核心接口和類
2.MyBatis 核心配置文件 (mybatis-config.xml)
3.SQL 映射文件 (Mapper.xml)
使用mybatis如果使用Maven來構(gòu)建項目,只需要將下面的依賴代碼放置于pom.xml中即可:
<dependency> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <version>3.2.6version>dependency>如果不使用Maven來構(gòu)建則需要手動下載并導(dǎo)入mybatis的jar包。
ORM 即對象/關(guān)系映射 ,是一種數(shù)據(jù)持久化技術(shù)。它在對象模型和關(guān)系型數(shù)據(jù)庫之間建立起對應(yīng)關(guān)系,并且提供了一種機制,通過JavaBean對象去操作數(shù)據(jù)庫表中的數(shù)據(jù)。
基于ORM,MyBatis在對象模型和關(guān)系數(shù)據(jù)庫的表之間建立了一座橋梁,通過MyBatis建立SQL關(guān)系映射,以便捷地實現(xiàn)數(shù)據(jù)存儲,查詢,更改和刪除等操作。
MyBatis核心配置文件
創(chuàng)建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><configuration> <settings> <setting name="logImpl" value="LOG4J"/> settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3307/smbms?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> dataSource> environment> environments> <mappers> <mapper resource="sql映射文件路徑"/> mappers>configuration>mybatis-config.xml文件需配置一些基本元素,需要注意的是,該配置文件的元素節(jié)點是有先后順序的,層次結(jié)構(gòu)如下:
configuration 配置
properties 可以配置在Java屬性配置文件中
settings 修改MyBatis在運行時的行為方式
typeAliases 為Java類型命名一個別名
typeHandlers 類型處理器
objectFactory 對象工廠
plugins 插件
environments 環(huán)境
environment 環(huán)境變量
transactionManager 事務(wù)管理器
dataSource 數(shù)據(jù)源
mappers 映射器
configuration
根節(jié)點,MyBatis的所有配置信息都在這里面。
properties
使用 resource 屬性引用外部的 Java屬性配置文件或在子節(jié)點中設(shè)置值。
<properties resource="db.properties"> <property name="user" value="root"/> <property name="password" value="root"/>properties>需要注意的是,resource的值優(yōu)先級高于其子節(jié)點的值。
settings
| cacheEnabled | 對在此配置文件下的所有cache進行全局性開/關(guān)設(shè)置 | true|false | true |
| lazyLoadingEnabled | 全局性設(shè)置懶加載。如果設(shè)為false,則所有相關(guān)聯(lián)的都會被初始化加載 | true|false | true |
| autoMappingBehavior | MyBatis對于resultMap自動映射的匹配級別 | NONE|PARTIAL|FULL | PARTIAL |
NONE 表示關(guān)閉自動映射;PARTIAL 只會自動映射沒有定義嵌套結(jié)果映射的字段。FULL 會自動映射任何復(fù)雜的結(jié)果集(無論是否嵌套)。
一個配置完整的 setting 元素示例:
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> settings>typeAliases
作用是配置類型別名,通過MyBatis的SQL映射文件相關(guān)聯(lián),減少輸入多余的完整類名
<typeAliases> <typeAlias type="com.shudong.pojo.User" alias="User" />typeAliases>這種寫法可以在寫SQL映射文件的時候簡寫類名,但有一個弊端,就是當有多個pojo的時候,需要一個一個的取別名。這個時候我們就可以使用下面這種方式:
<typeAliases> <package name="com.shudong.pojo" />typeAliases>當通過package的name屬性直接指定包名時,MyBatis會自動掃描指定包下的 JavaBean 并設(shè)置一個別名,默認別名為 類名。
即 com.shudong.pojo下有User類,那它的別名就是User,別名忽略大小寫。
若有注解,則別名為其注解值 (別名為author)
@Alias("author") public class Author { ... }typeHandlers
MyBatis 在設(shè)置預(yù)處理語句(PreparedStatement)中的參數(shù)或從結(jié)果集中取出一個值時, 都會用類型處理器將獲取到的值以合適的方式轉(zhuǎn)換成 Java 類型。下表描述了一些默認的類型處理器。
提示從 3.4.5 開始,MyBatis 默認支持 JSR-310(日期和時間 API) 。
由于這個還沒用到,所以暫時不做筆記。
objectFactory
每次 MyBatis 創(chuàng)建結(jié)果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成實例化工作。
默認的對象工廠需要做的僅僅是實例化目標類,要么通過默認無參構(gòu)造方法,要么通過存在的參數(shù)映射來調(diào)用帶有參數(shù)的構(gòu)造方法。如果想覆蓋對象工廠的默認行為,可以通過創(chuàng)建自己的對象工廠來實現(xiàn)。比如:
// ExampleObjectFactory.java public class ExampleObjectFactory extends DefaultObjectFactory { public Object create(Class type) { return super.create(type); } public Object create(Class type, List constructorArgTypes, List<Object> constructorArgs) { return super.create(type, constructorArgTypes, constructorArgs); } public void setProperties(Properties properties) { super.setProperties(properties); } public boolean isCollection(Classtype) { return Collection.class.isAssignableFrom(type); } }<objectFactory type="org.mybatis.example.ExampleObjectFactory"> <property name="someProperty" value="100"/>objectFactory>ObjectFactory 接口很簡單,它包含兩個創(chuàng)建實例用的方法,一個是處理默認無參構(gòu)造方法的,另外一個是處理帶參數(shù)的構(gòu)造方法的。另外,setProperties 方法可以被用來配置 ObjectFactory,在初始化你的 ObjectFactory 實例后, objectFactory 元素體中定義的屬性會被傳遞給 setProperties 方法。
plugins
插件.
MyBatis 允許你在映射語句執(zhí)行過程中的某一點進行攔截調(diào)用。默認情況下,MyBatis 允許使用插件來攔截的方法調(diào)用包括:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
這些類中方法的細節(jié)可以通過查看每個方法的簽名來發(fā)現(xiàn),或者直接查看 MyBatis 發(fā)行包中的源代碼。如果你想做的不僅僅是監(jiān)控方法的調(diào)用,那么你最好相當了解要重寫的方法的行為。因為在試圖修改或重寫已有方法的行為時,很可能會破壞 MyBatis 的核心模塊。這些都是更底層的類和方法,所以使用插件的時候要特別當心。
environments
MyBatis 可以配置多套運行環(huán)境,如開發(fā)環(huán)境,測試環(huán)境,生成環(huán)境等,我們可以靈活選擇不同的配置,從而將sql映射應(yīng)用到不同的數(shù)據(jù)庫環(huán)境上。
不過要記住:盡管可以配置多個環(huán)境,但每個 SqlSessionFactory 實例只能選擇一種環(huán)境。
所以,如果你想連接兩個數(shù)據(jù)庫,就需要創(chuàng)建兩個 SqlSessionFactory 實例,每個數(shù)據(jù)庫對應(yīng)一個。而如果是三個數(shù)據(jù)庫,就需要三個實例,依此類推,記起來很簡單。
如果忽略了環(huán)境參數(shù),則會加載默認的環(huán)境,如果需要指定創(chuàng)建某一種環(huán)境,則需要將環(huán)境ID參數(shù)傳遞給SqlSessionFactoryBuilder:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(讀取配置信息, 環(huán)境ID);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(讀取配置信息, 環(huán)境ID, 屬性);mybatis-config.xml中的具體配置:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> dataSource> environment> <environment id="test"> environment> environments>默認的環(huán)境通過 default 屬性設(shè)置
transactionManager
事務(wù)管理器,設(shè)置其類型為 JDBC 或 MANAGED.
JDBC – 這個配置直接使用了 JDBC 的提交和回滾設(shè)施,它依賴從數(shù)據(jù)源獲得的連接來管理事務(wù)作用域。
MANAGED – 這個配置幾乎沒做什么。它從不提交或回滾一個連接,而是讓容器來管理事務(wù)的整個生命周期(比如 JEE 應(yīng)用服務(wù)器的上下文)。默認情況下它會關(guān)閉連接。
dataSource
dataSource 元素使用標準的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對象的資源。
MyBatis提供了三種數(shù)據(jù)源類型。
UNPOOLED – 這個數(shù)據(jù)源的實現(xiàn)會每次請求時打開和關(guān)閉連接。雖然有點慢,但對那些數(shù)據(jù)庫連接可用性要求不高的簡單應(yīng)用程序來說,是一個很好的選擇。性能表現(xiàn)則依賴于使用的數(shù)據(jù)庫,對某些數(shù)據(jù)庫來說,使用連接池并不重要,這個配置就很適合這種情形。
POOLED – 這種數(shù)據(jù)源的實現(xiàn)利用“池”的概念將 JDBC 連接對象組織起來,避免了創(chuàng)建新的連接實例時所必需的初始化和認證時間。這種處理方式很流行,能使并發(fā) Web 應(yīng)用快速響應(yīng)請求。
JNDI – 這個數(shù)據(jù)源實現(xiàn)是為了能在如 EJB 或應(yīng)用服務(wù)器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的數(shù)據(jù)源引用。
mappers
映射器,我們需要告訴 MyBatis 到哪里去找到SQL語句。
我們可以使用相對于類路徑的資源引用,或完全限定資源定位符(包括file:///形式的 URL),或類名和包名等
<mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/>mappers><mappers> <mapper url="file:///D:/mappers/AuthorMapper.xml"/> <mapper url="file:///D:/mappers/BlogMapper.xml"/> <mapper url="file:///D:/mappers/PostMapper.xml"/>mappers><mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/>mappers><mappers> <package name="org.mybatis.builder"/>mappers>MyBatis 的核心對象
1.每個MyBatis的應(yīng)用程序都以一個 SqlSessionFactory 對象的實例為核心。
2.獲取 SqlSessionFactoryBuilder 對象,可以根據(jù)xml配置文件或Configuration類的實例構(gòu)建對象。
3.然后獲取 SqlSessionFactory 對象,該對象實例可以通過 SqlSessionFactoryBuilder 對象獲得。
4.進而獲得 SqlSession 實例,SqlSession 提供了在數(shù)據(jù)庫執(zhí)行 SQL 命令所需的所有方法。通過 SqlSession 實例來直接執(zhí)行已映射的 SQL 語句。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 負責構(gòu)建 SqlSessionFactory,它提供了多個build()方法的重載。
build() 方法讀取配置文件的方式主要分為 InputStream(字節(jié)流)、Reader(字符流)、Configuration(類)。
以下通過字節(jié)流讀取xml配置文件的方式來構(gòu)造SqlSessionFactory:
private static SqlSessionFactory factory; static { try { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); factory = new SqlSessionFactoryBuilder().build(is); is.close(); } catch (IOException e) { e.printStackTrace(); } }SqlSessionFactoryBuilder 的生命周期是一旦創(chuàng)建了 SqlSessionFactory 對象后,就不需要存在了。因此SqlSessionFactoryBuilder 的最佳作用域范圍就是存在于方法體當中。
SqlSessionFactory
SqlSessionFactory 是用來創(chuàng)建 SqlSession 實例的工廠(譯為中文差不多的意思)。
所有的 MyBatis 應(yīng)用都是以 SqlSessionFactory 實例為中心。
我們可以通過 SqlSessionFactory 提供的 openSession() 方法來獲取 SqlSession.
SqlSessionFactory 對象一旦創(chuàng)建,因為沒有理由去銷毀或是再創(chuàng)建,所以 SqlSessionFactory 的生命周期是同應(yīng)用程序共存亡,并且同時只能存在一個對象實例,所以采用單例模式或者靜態(tài)單例模式創(chuàng)建。SqlSessionFactory 的最佳作用域即是Application(應(yīng)用的作用域)。
SqlSession
SqlSession 是用于執(zhí)行持久化操作的對象,類似于 JDBC 中的Connection .提供了面向數(shù)據(jù)庫執(zhí)行 SQL 命令所需的所有方法,可以通過 SqlSession 實例直接運行已映射的 SQL 語句。
SqlSession對應(yīng)著一次數(shù)據(jù)庫會話。每個線程都應(yīng)該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。
換句話說,每次收到 HTTP 請求,就可以打開一個 SqlSession,返回一個響應(yīng)后,就關(guān)閉它。這個關(guān)閉操作很重要,為了確保每次都能執(zhí)行關(guān)閉操作,你應(yīng)該把這個關(guān)閉操作放到 finally 塊中。
在所有代碼中都遵循以下這種使用模式,可以保證所有數(shù)據(jù)庫資源都能被正確地關(guān)閉。
try (SqlSession session = sqlSessionFactory.openSession()) { // 你的應(yīng)用邏輯代碼}映射文件
以下是一個簡單的 SQL 映射文件,更多的映射文件筆記將會在下次揭曉。
<?xml version="1.0" encoding="UTF-8" ?> <mapper namespace="mapper.UserMapper"> <select id="getAllUser" resultType="user"> select * from smbms_user; select> mapper>分享、點贊、在看三連總結(jié)
以上是生活随笔為你收集整理的mybatis 使用jdbc_MyBatis笔记一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python简单操作题_Python简单
- 下一篇: mybatisgenerator使用_M