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

 更新时间:2021年09月30日 10:23:49   作者:hugh Lee  
这篇文章主要介绍了Mybatis的mapper标签 namespace属性用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mybatis mapper标签namespace属性说明

在mybatis中,映射文件中的namespace是用于绑定Dao接口的,即面向接口编程。

当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句,如下:

假设定义了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一一对应 。

则在代码中可以直接使用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)这段代码可以不用写。我们来具体看一下这个三个地方的代码形式。

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的类路径名,那么当我们在进行测试时,必须要添加一行代码session.getConfiguration().addMapper(EmployeeMapper.class)进行注册,下代码如下:

@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的文件中,如下所示

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/>了,此时在测试程序时就必须加一行

session.getConfiguration().addMapper(EmployeeMapper.class);

的代码进行注册,这样在每一次CRUD时都需要添加一行这样的代码。

还不如在建立一个空的Employee.xml文件,然后像上面一样设置好namespace,从而不用输入那一行代码。

上面的说明针对的是,仅针对使用mybats动态代理时的情况。写得比较乱,以后有时间再改。

Mybatis中namespace的作用

在mybatis中,映射文件中的namespace是用于绑定Dao接口的,即面向接口编程。

当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动 帮你找到对应要执行的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">
    <!-- 使用动态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>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java超详细讲解抽象类的原理与用法

    Java超详细讲解抽象类的原理与用法

    对于面向对象编程来说,抽象是它的一大特征之一,在Java中可以通过两种形式来体现OOP的抽象:接口和抽象类,下面这篇文章主要给大家介绍了关于Java抽象类相关资料,需要的朋友可以参考下
    2022-05-05
  • Java中的引用和动态代理的实现详解

    Java中的引用和动态代理的实现详解

    这篇文章主要介绍了Java中的引用和动态代理的实现详解,涉及Java中的引用类型,JVMGC的可达性分析,代理模式等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • spring-gateway网关聚合swagger实现多个服务接口切换的示例代码

    spring-gateway网关聚合swagger实现多个服务接口切换的示例代码

    这篇文章主要介绍了spring-gateway网关聚合swagger实现多个服务接口切换的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java中使用异或语句实现两个变量的互换

    Java中使用异或语句实现两个变量的互换

    这篇文章主要介绍了Java中使用异或语句实现两个变量的互换,本文直接给出代码实例以及运行结果,需要的朋友可以参考下
    2015-06-06
  • Java的Character类详解

    Java的Character类详解

    在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情况。为了解决这个问题,Java语言为内置数据类型char提供了包装类Character类。本文详细介绍了Java的Character类,感兴趣的同学可以参考阅读
    2023-04-04
  • RabbitMQ延迟队列及消息延迟推送实现详解

    RabbitMQ延迟队列及消息延迟推送实现详解

    这篇文章主要介绍了RabbitMQ延迟队列及消息延迟推送实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】

    Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】

    这篇文章主要介绍了Java实现的微信图片处理工具类,可实现针对图片的裁剪、合并、等比例缩放、旋转、识别等各种常见的图片处理功能,需要的朋友可以参考下
    2017-11-11
  • java音乐播放器实现代码

    java音乐播放器实现代码

    这篇文章主要介绍了java音乐播放器的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java使用Callable接口实现多线程的实例代码

    Java使用Callable接口实现多线程的实例代码

    这篇文章主要介绍了Java使用Callable接口实现多线程的实例代码,实现Callable和实现Runnable类似,但是功能更强大,具体表现在可以在任务结束后提供一个返回值,Runnable不行,call方法可以抛出异,Runnable的run方法不行,需要的朋友可以参考下
    2023-08-08
  • Mybatis中注入执行sql查询、更新、新增及建表语句案例代码

    Mybatis中注入执行sql查询、更新、新增及建表语句案例代码

    这篇文章主要介绍了Mybatis中注入执行sql查询、更新、新增以及建表语句,主要说明一个另类的操作,注入sql,并使用mybatis执行,结合案例代码详解讲解,需要的朋友可以参考下
    2023-02-02

最新评论