在開發中我們通常將Mybatis中配置文件分兩種,主配置文件與和dao對應的映射文件。
其實最后mybatis解析的還是一個主配置文件。
而映射文件會通過我們配置<mappers>屬性,或指定掃描路徑,將映射文件導入主配置文件,最后一起解析。
下面是主配置文件常見使用講解:
Mybatis中properties文件的引入
properties導入后可以將可能會改變的屬性放在單獨的文件,例如連接數據時的賬號密碼等,方便管理,
在mybatis中使用properties標簽,如下,resource是類路徑,url是網絡路徑或磁盤路徑資源
<properties resource="org/mybatis/example/config.properties"> </properties>
導入后就可以用${}進行屬性引用,如配置dataSource的幾個屬性
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
Mybatis中<setting>的使用
格式
<settings> <setting name="mapUnderscoreToCamelCase" value="false"/> </settings>
mapUnderscoreToCamelCase配置后查詢時會自動將數據表的_命名格式轉換成駝峰命名,然后對實體bean進行注入。如user_name會轉成userName;
Mybatis中<mappers>的使用
mappers用作指定要映射文件的位置
使用格式
<mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
Mapper可以添加resource 、URL 、class屬性
Resource:指定類路徑的xml文件
URL:從網絡獲取xml文件
如何將映射xml文件與dao接口建立對應關系
方式一、將xml和接口類放在同一目錄下,直接指定接口類的全限類名
方式二、基於注解的接口類
推薦: 重要Dao接口需要寫SQL映射文件
不重要,簡單的Dao接口使用注解
<package>批量注冊 name屬性指定包名 自動掃描包內的xml文件
如何在添加數據后讓方法返回這條數據的id
在<intsert >中添加useGeneratedKeys="true" keyProperty="" 兩個屬性
keyProperty指定將id注入Bean的哪個屬性
Oracle不支持自增,id是從序列中拿到,然后插入到數據表
可以在<insert>查詢語句前添加<selectKey keyProperty=”id” order=”before”>標簽
從序列中獲取一個id : select EMPLOYEES_SQL.nextval from dual ,然后注入到bean的id中
然后再查詢填充其他數據。
參數的傳遞
當只傳一個參數時,#{paramName},paramName可以隨便命名
當傳入多個參數時,會被封裝成一個map
Key :param1,param2,...paramN;或1,2....N
Value :真實值
所以需要使用#{param1}或#{1}
如果想簡單化
方法一、可以在Dao的方法參數添加@Param注解,自定義Key的值
方法二、如果參數時業務邏輯的數據模型,可以傳入POJO,這樣可以用#{attrName}獲取
方法三、如果參數不是業務邏輯模型數據,可以傳入MAP,這樣可以用#{keyName}獲取
方法四、如果多個參數不是業務模型數據,但要經常使用,可以編寫TO(Transfer Object)數據傳輸對象
Page{
Int index;
Int size;
}
如果傳入的的是collection(List,Set)類型或數組,會被特殊處理
Key=Collection(collection) 或者List(list)
關於取值符號#{}
#{}和${}都可以進行取值
區別:
#{}:以預編譯的形式(可以防止SQL注入),將參數設置到SQL語句中,PrepareStatement
${}:取出的值直接拼裝到SQL語句中
大多情況下取參數使用#{}
原生jdbc不支持占位符的地方可以使用${}進行取值
例如:使用分表,按年份拆表
Select * from ${tableName};
#{}:更豐富的用法
規定參數規則
JavaType、jdbcType、mode(存儲過程)、numericScale、
resultMap、typeHandler、jdbcTypeName、expression(未來准備支持的功能)
jdbcType通常需要在某種特定的條件下被設置;
在我們數據為null的時候,有些數據庫可能不能識別mybatis對null的默認處理。如Oracle
報錯JdbcType OtherType:無效類型。
因為mybatis對所有NULL映射的都是原生Jdbc的OtherType類型
解決方法:
1、#{email,jdbcType=OTHER};
2、jdbcTypeForNull=NULL