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

编辑: admin 分类: java 发布时间: 2021-12-04 来源:互联网
目录
  • Mybatis mapper标签namespace属性说明
    • MyBatis的命名空间(我们以下图的文件结构来说明)
    • 下面我来说一下他们三个之间的关系,我们
  • Mybatis中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>
    

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

    【原URL http://www.yidunidc.com/kt.html 转载请说明出处】