Mybatis mapper標簽namespace屬性說明
在mybatis中,映射文件中的namespace是用于綁定Dao接口的,即面向接口編程。
當你的namespace綁定接口后,你可以不用寫接口實現類,mybatis會通過該綁定自動幫你找到對應要執行的SQL語句,如下:
假設定義了IArticeDAO接口
1
2
3
4
|
public interface IArticleDAO { List<Article> selectAllArticle(); } |
對于映射文件如下:
1
2
3
4
|
< 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一一對應 。
則在代碼中可以直接使用IArticeDAO面向接口編程而不需要再編寫實現類。
MyBatis的命名空間(我們以下圖的文件結構來說明)
MyBatis的命名空間說的是POJO的XXx.xml文件中的<mapper namespace=”” />,主要是跟三個地方有關系,
- 第一個是Configuration.xml的mappers屬性
- 第二個是POJO的mapper接口如EmployeeMapper的類路徑
- 第三個是DAO程序中的session.getConfiguration().addMapper(EmployeeMapper.class)
下面我來說一下他們三個之間的關系,我們
1)當只使用XML(不使用Anotation)的來配置mapper接口時
就是我們把sql配置在EmployeeMap.xml中時,若我們把namespace指明namespace設置為mapper接口的路徑,即<mapper namespace="com.wildrain.mapper.EmployeeMapper">時,這樣我們在程序中使用MyBatis來進行CRUD時, session.getConfiguration().addMapper(EmployeeMapper.class)這段代碼可以不用寫。我們來具體看一下這個三個地方的代碼形式。
1
2
3
4
|
Configuration.xml的mappers < typeAliases > < typeAlias alias = "Employee" type = "com.wildrain.domain.Employee" /> </ typeAliases > |
1
2
|
Namespace < mapper namespace = "com.wildrain.mapper.EmployeeMapper" > |
程序代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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的類路徑名,那么當我們在進行測試時,必須要添加一行代碼session.getConfiguration().addMapper(EmployeeMapper.class)進行注冊,下代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@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)當使用注解時
為了減少配制xml的工作量,可以把Employee.xml省略,而把相應配制通過注解的形式寫到EmployeeMapper.java的文件中,如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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中就不需要設置<mappers/>了,此時在測試程序時就必須加一行
1
|
session.getConfiguration().addMapper(EmployeeMapper.class); |
的代碼進行注冊,這樣在每一次CRUD時都需要添加一行這樣的代碼。
還不如在建立一個空的Employee.xml文件,然后像上面一樣設置好namespace,從而不用輸入那一行代碼。
上面的說明針對的是,僅針對使用mybats動態代理時的情況。寫得比較亂,以后有時間再改。
Mybatis中namespace的作用
在mybatis中,映射文件中的namespace是用于綁定Dao接口的,即面向接口編程。
當你的namespace綁定接口后,你可以不用寫接口實現類,mybatis會通過該綁定自動 幫你找到對應要執行的SQL語句
ItemsCustomMapperxml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<? 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" > <!-- 使用動態sql,通過if判斷,滿足條件進行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建議使用擴展對象 --> < 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 > |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_33530388/article/details/71194518