SqlSession能夠直接調用方法的id進行數據庫操做,可是通常仍是推薦使用SqlSession獲取到DAO接口的代理,執行代理對象的方法,能夠更安全的進行類型檢查操做。java
dbconfig.properties文件內容mysql
driver=com.mysql.jdbc.cj.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 username=root password=root
在全局配置文件中進行以下配置sql
<properties resource="dbconfig.properties"></properties>
<settings> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings>
設置參數 | 描述 | 有效值 | 默認值 |
---|---|---|---|
cacheEnabled | 改配置影響的全部映射器中配置的緩存的全局開關 | true | false | true |
lazyLoadingEnabled | 延遲加載的全局開關,開啓後,全部關聯的對象都會延時加載。特定關聯關係中可經過設置fetchType屬性來覆蓋本配置 | true | false | false |
useColumnLabel | 使用列標籤代替列名。不一樣的驅動在這方面會有不一樣的表現,具體可參考相關驅動文檔或經過測試這兩種不一樣的模式來觀察所用驅動的結果 | true | false | true |
defaultStatementTimeout | 設置超時時間,決定驅動等待數據庫響應的秒數 | 任意合理的int值 | null(不進行限制) |
mapUnderscoreToCamelCase | 是否開啓自動駝峯命名規則映射 | true | false | false |
<typeAliases> <typeAlias type="com.desperado.entity.Employee" alias="employee"/> <typeAlias type="com.desperado.entity.Departemnt" alias="department"/> </typeAliases>
<typeAliases> <package name="com.desperado.entity" /> </typeAliases>
@Alias("emp") public class Employee{}
-MyBatis已經爲許多常見的Java類型內建了相應的別名,他們都是大小寫不敏感的,起別名時要避免這些。
別名|映射的類型名|別名|映射的類型名|別名|映射的類型名
-|-|-|-|-|-
_byte|byte|string|String|data|Data
_long|long|byte|Byte|decimal|Decimal
_short|short|long|Long|bigdecimal|BigDecimal
_int|int|short|Short|object|Object
_integer|int|int|Integer|map|Map
_double|double|integer|Integer|hashmap|HashMap
_float|float|double|Double|list|List
_boolean|boolean|float|Float|arraylist|ArrayList
-| |boolean|Boolean|collection|Collection數據庫
不管MyBatis在預處理語句(PreparedStatement)中設置一個參數時,仍是從結果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉換成Java類型。
類型處理器|Java類型|JDBC類型
-|-|-
BooleanTypeHandler|java.lang.Boolean,boolean|數據庫兼容的BOOLEAN
ByteTypeHandler|java.lang.Byte,byte|數據庫兼容的NUMERIC或BYTE
ShortTypeHandler|java.lang.Short,short|數據庫兼容的NUMERIC或SHORT INTEGER
IntegerTypeHandler|java.lang.Integer,int|數據庫兼容的NUMERIC或INTEGER
LongTypeHandler|java.lang.Long,long|數據庫兼容的NUMERIC或LONG INTEGER
FloatTypeHandler|java.lang.Float,float|數據庫兼容的NUMERIC或FLOAT
DoubleTypeHandler|java.lang.Double,double|數據庫兼容的NUMERIC或DOUBLE
BigDecimalTypeHandler|java.math.BigDecimal|數據庫兼容的NUMERIC或DECIMAL
StringTypeHandler|java.lang.String |CHAR、VARCHARapache
<typeHandlers> <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.YearTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.MonthTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler"/> </typeHandlers>
ParameterHandler(getParameterObject,setParameters)緩存
ResultSetHandler(handlerResultSets,handlerOuutputParameters)安全
StatementHandler(prepare,parameterize,batch,update,query)服務器
能夠經過environments標籤中的default屬性指定一個環境的標識符來快速的切換環境。session
transactionManager和dataSource必須都要有mybatis
<environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${dept.driver}" / > <property name="url" value="${dept.url} "/ > <property name="username" value="${dept.username}" / > <property name="password" value="${dept.password}" / > <dataSource> </environmet> <environment id="test"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${test.driver}" / > <property name="url" value="${test.url} "/ > <property name="username" value="${test.username}" / > <property name="password" value="${test.password}" / > <dataSource> </environmet> </environments>
type值取值有三種類型 JDBC|MANAGED|自定義
type有四種取值 UNPOOLED|POOLED|JNDI|自定義
<databaseIdProvider type="DB_VENDOR"> <property name="MySQL" value="mysql"/> <property name="Oracle" vale="oracle"/> <property name="SQL Server" value="sqlserver" /> </databaseIdProvider> <select Id="getUserById" result="User" parameterType="Integer" databaseId="mysql"> select * from user where id =#{id} </select>
<mappers> <mapper resource="mybatis/mapper/PersonDao.xml" /> <mapper url="file:///D:/userDao.xml" /> <mapper class="com.desperado.dao.UserDao" /> </mappers>
<mappers> <package name="com.desperado.dao" /> </mappers>
映射文件指導着MyBatis如何進行數據庫的增刪改查,有着很是重要的意義:
屬性 | 說明 |
---|---|
id | 命名空間中的惟一標誌符 |
parameterType | 將要傳入語句的參數的徹底限定類名或別名。這個屬性是可選的,由於MyBatis能夠經過TypeHandler推斷出具體傳入語句的參數類型,默認爲unset。 |
flushCache | 將其設置爲true,任什麼時候候只要語句被調用,都會致使本地緩存和二級緩存都被清空,默認值true(對應插入、刪除和更新語句)。 |
timeout | 這個設置是在拋出異常以前,驅動程序等待數據庫返回請求結果的秒數。默認爲unset(依賴驅動) |
statementType | STATEMENT,PREPARED或CALLABLE的一個。這會讓MyBatis分別飾演Statement、PreparedStatement或CallableStatement,默認值:PREPARED |
useGeneratorKeys | (僅對insert和update有效)這會讓MyBatis使用JDBC的getGeneratorKeys方法取出由數據庫內部生成的主鍵,默認值false |
keyProperty | (僅對insert和update有效)惟一標記一個屬性,MyBatis會經過getGeneratedKeys的返回值或者經過insert語句的selectKey子元素設置它的鍵值,默認unset |
keyColumn | (僅對insert和update有效)經過生成的鍵值設置表中的列名,這個設置緊張模型數據庫是必須的,當主鍵列不是表中的第一列的時候須要設置,若是但願獲得多個生成的列,也能夠是逗號分隔的屬性名稱列表。 |
databaseId | 若是配置了databaseIdProvider,MyBatis會加載全部的不帶databaseId或匹配當前databaseId的語句;若是帶或者不帶的語句都有,則不帶的會被忽略。 |
<insert id="insertCustomer" databaseId="mysql" useGeneratedKeys="true" keyProperty="id"> insert into customer(name,age,email) values (#{name},#{age},#{email}) </insert>
<insert id="insertCustomer" databaseId="oracle" parameterType=「customer」> <selectKey order="BEFORE" keyProperty="id" resultType="_int" > select crm_seq.nextval from dual </selectKey> insert into customer(id,name,age,email) values (#{id},#{name},#{age},#{email}) </insert>
屬性 | 說明 |
---|---|
keyProperty | selectKey語句結果應該被設置的目標屬性 |
keyColumn | 匹配屬性的返回結果集中的列名稱 |
resultType | 結果的類型,MyBatis一般能夠推斷出來,可是爲了更加肯定寫上也不會有什麼問題。MyBatis容許任何簡單類型用做主鍵的類型,包括字符串。 |
order | 能夠被設置爲BEFORE或AFTER,若是設置爲BEFORE,那麼它會首先選擇主鍵,設置keyProperty而後執行插入語句。若是設置爲After,那麼先執行插入語句,而後是selectKey執行。 |
statementType | 與前面相同,MyBatis支持STATEMENT,PREPARED和CALLABLE語句的映射類型,分佈表明PreparedStatement和CallableStatement |
#{property,javaType=int,jdbcType=NUMERIC} #{height,javaType=double,jdbcType=NUMERIC,numericScale=2}
-javaType一般能夠從參數對象中去肯定。
-若是null被當作值來傳遞,對應全部可能爲空的列,jdbcType須要被設置。
-對於數值類型,還能夠設置小數點後保留的位數
-mode屬性容許指定IN、OUT和INOUT屬性。若是參數爲OUT或INOUT,參數對象屬性的真實值會被改變,就像在獲取輸出參數時所指望的那些。
參數位置支持的屬性
javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName
${key}:獲取參數的值,拼接到SQL中,有SQL注入問題。
屬性 | 說明 |
---|---|
id | 命名空間中的惟一標誌符 |
parameterType | 將要傳入語句的參數的徹底限定類名或別名。這個屬性是可選的,由於MyBatis能夠經過TypeHandler推斷出具體傳入語句的參數類型,默認爲unset。 |
resultType | 返回的指望類型的徹底限定名或別名。注意若是是集合,那應該是集合能夠包含的類型,而不是集合自己,本屬性和resultMap不能同時使用。 |
flushCache | 將其設置爲true,任什麼時候候只要語句被調用,都會致使本地緩存和二級緩存都被清空,默認值false。 |
useCache | 將其設置爲true,將會致使本條語句的結果被二級緩存進行緩存,默認值:true |
timeout | 這個設置是在拋出異常以前,驅動程序等待數據庫返回請求結果的秒數。默認爲unset(依賴驅動) |
fetchSize | 影響驅動程序每次批量返回的結果行數。默認值unset(依賴驅動) |
statementType | STATEMENT,PREPARED或CALLABLE的一個。這會讓MyBatis分別飾演Statement、PreparedStatement或CallableStatement,默認值:PREPARED |
resultSetType | FORWARD_ONLY、SCROLL_SENSITIVE或者SCROLL_INSENSITIVE中的一個,默認值爲unset(依賴驅動) |
databaseId | 若是配置了databaseIdProvider,MyBatis會加載全部的不帶databaseId或匹配當前databaseId的語句;若是帶或者不帶的語句都有,則不帶的會被忽略。 |
resultOrdered | 這個設置僅針對嵌套結果select語句適用;若是爲true,就假設包含了嵌套結果集或是分組,這樣當返回一個主結果行,就不會發生有對前面結果集引用的狀況,這就使得在獲取嵌套的結果集的時候不至於致使內存不足,默認值false |
resultSets | 這個設置僅對多結果集的狀況適用,它將雷人語句執行後返回的結果集並給每一個結果集一個名稱,名稱是逗號分隔的。 |
全局setting設置
-autoMappingBehavior默認是PARTIAL,開啓自動映射的功能。惟一的要求是列名和javaBean屬性名一致。
-若是autoMappingBehavior設置爲null會取消自動映射。
-數據庫命名規範,POJO屬性符號駝峯命名法,如customer_name -> customerName,能夠改期自動駝峯命名規則映射功能。
自定義resultMap,實現高級結果集映射。
constructor 類在實例化時,用來注入結果到構造方法中。
-idArg id參數,標記結果做爲id能夠提升總體性能。
-arg 注入到構造方法的一個普通結果
discriminator 使用結果值來決定使用哪一個結果映射。
-case基於某些值的結果映射。
屬性 | 說明 |
---|---|
property | 映射到列結果的字段或屬性。 |
column | 數據表的列名 |
javaType | 一個Java類的徹底限定名或一個類型別名 |
jdbcType | JDBC類型是僅僅須要對插入、更新和刪除操做可能爲空的列進行處理 |
typeHandler | 類型處理器 |
<resultMap type="com.desperado.bean.Lock" id="myLock"> <id column="id" property="id" /> <id column="lockName" property="lockName" /> <id column="key_id" property="key.id" /> <id column="keyName" property="key.keyName" /> </resultMap>
<resultMap type="com.desperado.bean.Lock" id="myLock2"> <id column="id" property="id" /> <result column="lockName" property="lockName" /> <association property="key" javaType="com.desperado.bean.Key"> <id column="key_id" property="id" /> <result column="keyName" property="keyName" /> </association> </resultMap>
<resultMap type="com.desperado.bean.Lock" id="myLock3"> <id column="id" property="id" /> <result column="lockName" property="lockName" /> <association property="key" select="com.desperado.dao.KeyMapper.getKeyById" column="key_id"> </association> </resultMap>
<settings> <select name="lazyLoadingEnabled" value="true" /> <setting name="aggressiveLazyLoading" value="false" /> </settings>
<select id="getDeptById" resultMap="MyDept"> select d.id d_id, d.dept_name d_deptName, e.id e_id, e.last_name e_lastName, e.email e_email, e.gender e_gender, e.dept_id e_deptId from depertment d left join employee e on e.dept_id = d.id where d.id = #{id} </select>
-使用collection以後
<resultMap type="com.desperado.bean.Department" id="MyDept"> <id column="d_id" property="id" /> <result column="d_deptName" property="deptName" /> <collection property="emps" ofType="com.desperado.bean.Employee" columnPrefix="e_"> <id column="id" property="id" /> <id column="lastName" property="lastName" /> <id column="email" property="email" /> <id column="gender" property="gender"/> </collection> </resultMap>
<resultMap type="com.desperado.bean.Department" id="MyDeptStep"> <id column="id" property="id" /> <result column="dept_name" property="deptName" /> <collection property="emps" select="com.desperado.dao.EmployeeMapper.getEmpsByDeptId" column="id"> </collection> </resultMap>
<resultMap type="com.desperado.bean.Department" id="MyDeptStep"> <id column="id" property="id" /> <result column="dept_name" property="deptName" /> <collection property="emps" select="com.desperado.dao.EmployeeMapper.getEmpsByDeptId" column="{deptId=id}"> </collection> </resultMap>
<databaseIdProvider type="DB_VENDOR"> <property name="MySQL" value="mysql" /> <property name="Oracle" value="oracle" /> </databaseIdProvider>
<select id="getEmpPage" resultType="com.desperado.bean.Employee"> <if test="_databaseId =='mysql' "> select * from employee where limit 0,5 </if> <if test="_databaseId == 'oracle' "> select * from (select e.*,rownum as r1 from employee e where rownum <=5) where r1 >= 1; </if> </select>