Mybatis的mapper標(biāo)簽 namespace屬性用法說明
Mybatis mapper標(biāo)簽namespace屬性說明
在mybatis中,映射文件中的namespace是用于綁定Dao接口的,即面向接口編程。
當(dāng)你的namespace綁定接口后,你可以不用寫接口實現(xiàn)類,mybatis會通過該綁定自動幫你找到對應(yīng)要執(zhí)行的SQL語句,如下:
假設(shè)定義了IArticeDAO接口
public interface IArticleDAO
{
List<Article> selectAllArticle();
}
對于映射文件如下:
<mapper namespace="IArticleDAO">
<select id="selectAllArticle" resultType="article">
SELECT t.* FROM T_article t WHERE t.flag = '1' ORDER BY t.createtime DESC
</select>
請注意接口中的方法與映射文件中的SQL語句的ID一一對應(yīng) 。
則在代碼中可以直接使用IArticeDAO面向接口編程而不需要再編寫實現(xiàn)類。
MyBatis的命名空間(我們以下圖的文件結(jié)構(gòu)來說明)

MyBatis的命名空間說的是POJO的XXx.xml文件中的<mapper namespace=”” />,主要是跟三個地方有關(guān)系,
- 第一個是Configuration.xml的mappers屬性
- 第二個是POJO的mapper接口如EmployeeMapper的類路徑
- 第三個是DAO程序中的session.getConfiguration().addMapper(EmployeeMapper.class)
下面我來說一下他們?nèi)齻€之間的關(guān)系,我們
1)當(dāng)只使用XML(不使用Anotation)的來配置mapper接口時
就是我們把sql配置在EmployeeMap.xml中時,若我們把namespace指明namespace設(shè)置為mapper接口的路徑,即<mapper namespace="com.wildrain.mapper.EmployeeMapper">時,這樣我們在程序中使用MyBatis來進(jìn)行CRUD時, session.getConfiguration().addMapper(EmployeeMapper.class)這段代碼可以不用寫。我們來具體看一下這個三個地方的代碼形式。
Configuration.xml的mappers
<typeAliases>
<typeAlias alias="Employee" type="com.wildrain.domain.Employee" />
</typeAliases>
Namespace <mapper namespace="com.wildrain.mapper.EmployeeMapper">
程序代碼:
@Test
public void testGetAllEmployees(){
SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
List<Employee> ems = mapper.getAllEmployees();
for(Employee e:ems){
System.out.println(e);
}
} finally {
session.close();
}
}
若我們在employee.xml中的namespace是任意取的名字,而不是EmployeeMapper.java的類路徑名,那么當(dāng)我們在進(jìn)行測試時,必須要添加一行代碼session.getConfiguration().addMapper(EmployeeMapper.class)進(jìn)行注冊,下代碼如下:
@Test
public void testGetAllEmployees(){
SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
session.getConfiguration().addMapper(EmployeeMapper.class);
try {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
List<Employee> ems = mapper.getAllEmployees();
for(Employee e:ems){
System.out.println(e);
}
} finally {
session.close();
}
}
2)當(dāng)使用注解時
為了減少配制xml的工作量,可以把Employee.xml省略,而把相應(yīng)配制通過注解的形式寫到EmployeeMapper.java的文件中,如下所示
final String getAllEmployees = "SELECT E.id, name, type, salay, time "+
"FROM employee E "+
"left join register r on r.eid = E.id "+
"left join time t on t.eid = E.id";
@Select(getAllEmployees)
@TypeDiscriminator(column = "type",
cases={
@Case(value="1",type=RegisterEmployee.class,results={
@Result(property="salay")
}) ,
@Case(value="2",type=TimeEmployee.class,results={
@Result(property="time")
})
})
這樣Configuration.xml中就不需要設(shè)置<mappers/>了,此時在測試程序時就必須加一行
session.getConfiguration().addMapper(EmployeeMapper.class);
的代碼進(jìn)行注冊,這樣在每一次CRUD時都需要添加一行這樣的代碼。
還不如在建立一個空的Employee.xml文件,然后像上面一樣設(shè)置好namespace,從而不用輸入那一行代碼。
上面的說明針對的是,僅針對使用mybats動態(tài)代理時的情況。寫得比較亂,以后有時間再改。
Mybatis中namespace的作用
在mybatis中,映射文件中的namespace是用于綁定Dao接口的,即面向接口編程。
當(dāng)你的namespace綁定接口后,你可以不用寫接口實現(xiàn)類,mybatis會通過該綁定自動 幫你找到對應(yīng)要執(zhí)行的SQL語句
ItemsCustomMapperxml:
<?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" >
<mapper namespace="cn.itcast.ssm.mapper.ItemsMapperCustom" >
<!-- 定義商品查詢的sql片段,就是商品查詢條件 -->
<sql id="query_items_where">
<!-- 使用動態(tài)sql,通過if判斷,滿足條件進(jìn)行sql拼接 -->
<!-- 商品查詢條件通過ItemsQueryVo包裝對象 中itemsCustom屬性傳遞 -->
<if test="itemsCustom!=null">
<if test="itemsCustom.name!=null and itemsCustom.name!=''">
items.name LIKE '%${itemsCustom.name}%'
</if>
</if>
</sql>
<!-- 商品列表查詢 -->
<!-- parameterType傳入包裝對象(包裝了查詢條件)
resultType建議使用擴(kuò)展對象
-->
<select id="findItemsList" parameterType="cn.itcast.ssm.po.ItemsQueryVo"
resultType="cn.itcast.ssm.po.ItemsCustom">
SELECT items.* FROM items
<where>
<include refid="query_items_where"></include>
</where>
</select>
</mapper>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot使用JdbcTemplate完成對數(shù)據(jù)庫的增刪改查功能
這篇文章主要介紹了springboot使用JdbcTemplate完成對數(shù)據(jù)庫的增刪改查功能,需要的朋友可以參考下2017-12-12
線上dubbo線程池耗盡CyclicBarrier線程屏障異常解決記錄
系統(tǒng)相關(guān)使用人員反饋系統(tǒng)故障,這篇文章主要介紹了線上dubbo線程池耗盡CyclicBarrier線程屏障異常解決的記錄,有需要的朋友可以借鑒參考下2022-03-03
java網(wǎng)絡(luò)編程中向指定URL發(fā)送GET POST請求示例
這篇文章主要介紹了java向指定URL發(fā)送GET POST請求示例,學(xué)習(xí)JAVA網(wǎng)絡(luò)編程一定會用到的,大家參考使用吧2013-11-11
Fluent Mybatis實際開發(fā)中的優(yōu)勢對比
本文給大家介紹如何通過IQuery和IUpdate定義強(qiáng)大的動態(tài)SQL語句,給大家分享Fluent Mybatis實際開發(fā)中的優(yōu)勢講解,感興趣的朋友一起看看吧2021-08-08
SpringBoot @value注解動態(tài)刷新問題小結(jié)
@Value注解 所對應(yīng)的數(shù)據(jù)源來自項目的 Environment 中,我們可以將數(shù)據(jù)庫或其他文件中的數(shù)據(jù),加載到項目的 Environment 中,然后 @Value注解 就可以動態(tài)獲取到配置信息了,這篇文章主要介紹了SpringBoot @value注解動態(tài)刷新,需要的朋友可以參考下2023-09-09
利用SpringDataJPA開啟審計功能,自動保存操作人操作時間
這篇文章主要介紹了利用SpringDataJPA開啟審計功能,自動保存操作人操作時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

