好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mybatis的mapper标签 namespace属性用法说明

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

查看更多关于Mybatis的mapper标签 namespace属性用法说明的详细内容...

  阅读:25次