<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--配置信息並不完全,經常使用的基本羅列出來了,如需要翻閱文檔或其他博客--> <configuration> <!--可以直接在resource中直接引入外部的properties文件--> <properties resource="org/wm/test/config.properties"> <!--也可以在properties標簽內部配置property--> <property name="username" value="root"></property> <property name="password" value="root"></property> </properties> <!--這些是極其重要的調整, 它們會修改 MyBatis 在運行時的行為方式。--> <settings> <!--這個配置使全局的映射器啟用或禁用緩存。--> <setting name="cacheEnabled" value="true"/> <!--全局啟用或禁用延遲加載。當禁用時, 所有關聯對象都會即時加載。--> <setting name="lazyLoadingEnabled" value="true"/> <!--允許或不允許多種結果集從一個單獨 的語句中返回(需要適合的驅動) --> <setting name="multipleResultSetsEnabled" value="true"/> <!--使用列標簽代替列名。 不同的驅動在這 方便表現不同。 參考驅動文檔或充分測 試兩種方法來決定所使用的驅動。--> <setting name="useColumnLabel" value="true"/> <!--允許JDBC支持生成的鍵。需要適合的驅動。 如果設置為 true 則這個設置強制生成的鍵被使用,盡管一些驅動拒絕兼 容但仍然有效(比如 Derby) --> <setting name="useGeneratedKeys" value="false"/> <!--指定 MyBatis 如何自動映射列到字段/ 屬性。 PARTIAL 只會自動映射簡單, 沒有嵌套的結果。FULL 會自動映射任 意復雜的結果(嵌套的或其他情況) 。 NONE, PARTIAL, FULL --> <setting name="autoMappingBehavior" value="PARTIAL"/> <!--配置默認的執行器。 SIMPLE 執行器沒 有什么特別之處。 REUSE 執行器重用 預處理語句。 BATCH 執行器重用語句 和批量更新。 SIMPLE REUSE BATCH --> <setting name="defaultExecutorType" value="SIMPLE"/> <!--設置超時時間, 它決定驅動等待一個數 據庫響應的時間 Any positive integer 默認為null--> <setting name="defaultStatementTimeout" value="25"/> <!--允許在嵌套語句上使用RowBounds。--> <setting name="safeRowBoundsEnabled" value="false"/> <!--使用駝峰命名法對字段名進行命名--> <setting name="mapUnderscoreToCamelCase" value="false"/> <!--MyBatis使用本地緩存來防止循環引用並加速重復的嵌套查詢。 默認情況下(SESSION)會話期間執行的所有查詢都將被緩存。 如果localCacheScope = STATEMENT本地會話將僅用於語句執行,則不會在對同一SqlSession的兩個不同調用之間共享數據。--> <setting name="localCacheScope" value="SESSION"/> <!--如果未為參數提供特定的JDBC類型,則指定空值的JDBC類型。 某些驅動程序需要指定列JDBC類型,但其他驅動程序使用泛型值,如NULL,VARCHAR或OTHER。--> <setting name="jdbcTypeForNull" value="OTHER"/> <!--指定哪個Object的方法觸發延遲加載--> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!--控制打印日志可選slf4j默認為log4j--> <setting name="logImpl" value="LOG4J" /> </settings> <typeAliases> <!--type中直接寫包名,該語句會直接幫你將整個包內的所有類取了別名,別名為 類名第一個字母變為小寫--> <package name="org.wm.pojo"></typeAlias> <!--該語句會幫你把制定的類取別名,別名為alias中的值--> <typeAlias type="org.wm.pojo.Flower" alias="flower"></typeAlias> <!--另外,對於普通的 Java 類型,有許多內建的類型別名。 它們都是大小寫不敏感的,由於重載的名字,要注意原生類型的特殊處理。 如: string String byte Byte long Long short Short int Integer integer Integer double Double float Float boolean Boolean date Date decimal BigDecimal bigdecimal BigDecimal object Object map Map hashmap HashMap list List arraylist ArrayList collection Collection iterator Iterator --> </typeAliases> <!--<typeHandlers> <!–無論是 MyBatis 在預處理語句中設置一個參數, 還是從結果集中取出一個值時, 類型處理器被用來將獲取的值以合適的方式轉換成 Java 類型。 你可以重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標准的類型。 詳細可看文檔–> <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers>--> <!--和spring整合后environments將被廢除 MyBatis 可以配置多種環境。這會幫助你將 SQL 映射應用於多種數據庫之中。 例如, 你也許為開發要設置不同的配置, 測試和生產環境。 或者你可能有多種生產級數據庫卻共享相同的模式,所以你會想對不同數據庫使用相同的 SQL 映射。 這種用例是很多的。--> <environments default="development"> <!--一個很重要的問題要記得:你可以配置多種環境,但你只能為每個 SqlSessionFactory 實例選擇一個。 所以,如果你想連接兩個數據庫,你需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。 而如果是三個數據庫,你就需要三個實例,以此類推。 --> <environment id="development"> <!--在 MyBatis 中有兩種事務管理器類型(也就是 type=”[JDBC|MANAGED]”): JDBC – 這個配置直接簡單使用了 JDBC 的提交和回滾設置。它依賴於從數據源得到的連接來管理事務范圍。 MANAGED – 這個配置幾乎沒做什么。它從來不提交或回滾一個連接。 而它會讓容器來管理事務的整個生命周期(比如 Spring 或 JEE 應用服務器的上下文) 默認情況下它會關閉連接。 然而一些容器並不希望這樣, 因此如果你需要從連接中停止它,將 closeConnection 屬性設置為 false。--> <transactionManager type="JDBC"/> <!--使用基本的 JDBC 數據源接口來配置 JDBC 連接對象的資源。 許多 MyBatis 的應用程序將會按示例中的例子來配置數據源。 然而它並不是必須的。要知道為了方便使用延遲加載,數據源才是必須的。 有三種內建的數據源類型(也就是 type=”???”): UNPOOLED – 這個數據源的實現是每次被請求時簡單打開和關閉連接。 它有一點慢, 這是對簡單應用程序的一個很好的選擇, 因為它不需要及時的可用連接。 不同的數據庫對這個的表現也是不一樣的, 所以對某些數據庫來說配置數據源並不重要, 這個配置也是閑置的。 UNPOOLED 類型的數據源僅僅用來配置以下 5 種屬性: driver – 這是 JDBC 驅動的 Java 類的完全限定名(如果你的驅動包含,它也不是 數據源類)。 url – 這是數據庫的 JDBC URL 地址。 username – 登錄數據庫的用戶名。 password – 登錄數據庫的密碼。 defaultTransactionIsolationLevel – 默認的連接事務隔離級別。 作為可選項,你可以傳遞數據庫驅動的屬性。要這樣做,屬性的前綴是以“driver.”開頭的,例如: driver.encoding=UTF8 這 樣 就 會 傳 遞 以 值 “ UTF8 ” 來 傳 遞 屬 性 “ encoding ”, 它 是 通 過 DriverManager.getConnection(url,driverProperties)方法傳遞給數據庫驅動。 POOLED – 這是 JDBC 連接對象的數據源連接池的實現,用來避免創建新的連接實例時必要的初始連接和認證時間。 這是一種當前 Web 應用程序用來快速響應請求很流行的方法。 除了上述(UNPOOLED)的屬性之外,還有很多屬性可以用來配置 POOLED 數據源: poolMaximumActiveConnections – 在任意時間存在的活動(也就是正在使用)連接的數量。默認值:10 poolMaximumIdleConnections – 任意時間存在的空閑連接數。 poolMaximumCheckoutTime – 在被強制返回之前,池中連接被檢查的時間。默認值:20000 毫秒(也就是 20 秒) poolTimeToWait – 這是給連接池一個打印日志狀態機會的低層次設置,還有重新嘗試獲得連接, 這些情況下往往需要很長時間為了避免連接池沒有配置時靜默失敗)。默認值:20000 毫秒(也就是 20 秒) poolPingQuery – 發送到數據的偵測查詢,用來驗證連接是否正常工作,並且准備接受請求。 默認是“NO PING QUERY SET” ,這會引起許多數據庫驅動連接由一個錯誤信息而導致失敗。 poolPingEnabled – 這是開啟或禁用偵測查詢。 如果開啟,你必須用一個合法的 SQL 語句(最好是很快速的)設置 poolPingQuery 屬性。默認值:false。 poolPingConnectionsNotUsedFor – 這是用來配置 poolPingQuery 多次時間被用一次。 這可以被設置匹配標准的數據庫連接超時時間, 來避免不必要的偵測。 默認值: 0(也就是所有連接每一時刻都被偵測-但僅僅當 poolPingEnabled 為 true 時適用)。 JNDI – 這個數據源的實現是為了使用如 Spring 或應用服務器這類的容器, 容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。這個數據源配置只需要兩個屬性: initial_context – 這 個 屬 性 用 來 從 初 始 上 下 文 中 尋 找 環 境 ( 也 就 是 initialContext.lookup(initial——context) 。 這是個可選屬性,如果被忽略,那么 data_source 屬性將會直接以 initialContext 為背景再次尋找。 data_source – 這是引用數據源實例位置的上下文的路徑。 它會以由 initial_context 查詢返回的環境為背景來查找,如果 initial_context 沒有返回結果時,直接以初始上下文為環境來查找。 和其他數據源配置相似, 它也可以通過名為 “env.” 的前綴直接向初始上下文發送屬性。比如: env.encoding=UTF8 在初始化之后,這就會以值“UTF8”向初始上下文的構造方法傳遞名為“encoding” 的屬性。 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--既然 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 映射語句了。 但是, 首先我們需要告訴 MyBatis 到哪里去找到這些語句。 Java 在這方面沒有提供一個很好的方法, 所以最佳的方式是告訴 MyBatis 到哪里去找映射文件。 你可以使用相對於類路徑的資源引用,或者字符表示,或 url 引用的完全限定名(包括 file:///URLs) 。--> <mappers> <mapper resource="org/wm/pojo/FlowerMapper.xml"/> </mappers> </configuration>
mapper.xml文件配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--MyBatis 真正的力量是在映射語句中。這里是奇跡發生的地方。 對於所有的力量,SQL 映射的 XML 文件是相當的簡單。 當然如果你將它們和對等功能的 JDBC 代碼來比較,你會發現映射文件節省了大約 95%的代碼量。 MyBatis 的構建就是聚焦於 SQL 的,使其遠離於普通的方式。 --> <!--namespace為全限定名,使用該映射文件中配置的已映射的sql語句時,最好加上全限定名,不然可能會造成語句模糊。--> <mapper namespace="org.wm.mapper.TransferMapper"> <!-- sql – 可以重用的 SQL 塊,也可以被其他語句引用。 insert – 映射插入語句 update – 映射更新語句 delete – 映射刪除語句 select – 映射查詢語句 當傳入參數為在sql語句標記為#{x}時,系統底層默認走的是PreparedStatement 當傳入參數為在sql語句標記為${x}時,系統底層默認走的是Statement 參數也可以指定一個確定的數據類型: #{property,javaType=int,jdbcType=NUMERIC} insert、update、delete使用的套路基本一致,返回值都為Integer類型 select需要指定返回值類型 sql 這個元素可以被用來定義可重用的 SQL 代碼段,可以包含在其他語句中。 <sql id="userColumns"> id,username,password </sql> <select id="selectUsers" parameterType="int" resultType="hashmap"> select <include refid="userColumns"/> from some_table where id = #{id} </select> --> <select id="selByIdPwd" parameterType="account" resultType="account"> select * from account where aid=#{aid} and pwd=#{pwd} </select> <select id="selByIdName" parameterType="account" resultType="account"> select * from account where aid=#{aid} and aname=#{aname} </select> <update id="updAcc" parameterType="account"> update account set money=money+#{money} where aid=#{aid} </update> </mapper>