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