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