`

Mybatis的namespace问题说明

阅读更多

[官网说明]

探究已映射的 SQL 语句

这里你也许想知道通过 SqlSession 和 Mapper 对象到底执行了什么操作。已映射的 SQL 语句是一个很大的主题, 而且这个主题会贯穿本文档的大部分内容。 为了给出一个宏观的概 念,这里有一些示例。 上面提到的任何一个示例,语句是通过 XML 或注解定义的。我们先来看看 XML。使 用基于 XML 的映射语言,在过去的几年中使得 MyBatis 非常流行,他为 MyBatis 提供所有 的特性设置。如果你以前用过 MyBatis,这个概念应该很熟悉了,但是 XML 映射文件也有 很多的改进,后面我们会详细来说。这里给出一个基于 XML 映射语句的示例,这些语句应 该可以满足上述示例中 SqlSession 对象的调用。

<?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"><mappernamespace="org.mybatis.example.BlogMapper"><selectid="selectBlog"parameterType="int"resultType="Blog">
    select * from Blog where id = #{id}
  </select></mapper>

这个简单的例子中看起来有很多额外的东西, 但是也相当简洁了。 你可以在一个单独的 XML 映射文件中定义很多的映射语句,除 XML 头部和文档类型声明之外,你可以得到很 多 方 便 之 处 。 在 文 件 的 剩 余 部 分 是 很 好 的 自 我 解 释 。 在 命 名 空 间 “com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这 样它允许你使用完全限定名 “org.mybatis.example.BlogMapper.selectBlog” 来调用映射语句, 我们下面示例中所有的写法也是这样的。

Blog blog =(Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog",101);

要注意这个使用完全限定名调用 Java 对象的方法是相似的,这样做是有原因的。这个 命名可以直接给相同命名空间下的的映射类, 使用一个名称, 参数和返回值和已映射的查询 语句都一样的方法即可。 这就允许你非常容易地调用映射器接口中的方法, 这和你前面看到 的是一样的,下面这个示例中它又出现了。

BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);

第二种方式有很多有点,首先它不是基于文字的,那就更安全了。第二,如果你的 IDE 有代码补全功能,那么你可以利用它来操纵已映射的 SQL 语句。第三,不需要强制类型转 换,同时 BlogMapper 接口可以保持简洁,返回值类型很安全(参数类型也很安全) 。


重要 命名空间的一点注释

命名空间 在之前版本的 MyBatis 中是可选项,非常混乱也没有帮助。现在,命名空间 是必须的,而且有一个目的,它使用更长的完全限定名来隔离语句。

命名空间使得接口绑定成为可能,就像你看到的那样,如果之前不了解,那么现在你 就会使用它们了,你应该按照下面给出示例的来练习,以免改变自己的想法。使用命名空 间,并将它放在合适的 Java 包空间之下,将会使你的代码变得简洁,在很长的时间内提高 MyBatis 的作用。

命名解析: 为了减少输入量,MyBatis 对所有的命名配置元素使用如下的命名解析规 则,包括语句,结果映射,缓存等。

  • 直接查找完全限定名(比如“com.mypackage.MyMapper.selectAllThings”,如果 ) 发现就使用。
  • 短名称(比如“selectAllThings” )可以用来引用任意含糊的对象。而如果有两个 或两个以上的(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings” ), 那么就会得到错误报告,说短名称是含糊的,因此就必须使用完全限定名。

如 BlogMapper 这样的映射器类来说,还有一个妙招。它们中间映射的语句可以不需要 在 XML 中来写,而可以使用 Java 注解来替换。比如,上面的 XML 示例可以如下来替换:

package org.mybatis.example;publicinterfaceBlogMapper{@Select("SELECT * FROM blog WHERE id = #{id}")Blog selectBlog(int id);}

对于简单语句来说,使用注解代码会更加清晰,然而 Java 注解对于复杂语句来说就会 混乱, 应该限制使用。 因此, 如果你不得不做复杂的事情, 那么最好使用 XML 来映射语句。

当然这也取决于你和你的项目团队的决定, 看哪种更适合你来使用, 还有以长久方式来 使用映射语句的重要性。也就是说,不要将自己局限在一种方式中。你可以轻松地将注解换 成 XML 映射语句,反之亦然。

 

Mybatis的namespace问题说明

<!--[if !supportLists]-->1.       <!--[endif]-->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动态代理时的情况。写得比较乱,以后有时间再改。

 

1. 配置文件

 

复制代码
<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
      
    <environments default="development">  
        <environment id="development">  
            <transactionManager type="JDBC"/>  
            <dataSource type="POOLED">  
                <property name="driver" value="com.mysql.jdbc.Driver"/>  
                <property name="url" value="jdbc:mysql://localhost:3306/orcl"/>  
                <property name="username" value="root"/>  
                <property name="password" value="xxxxxx"/>  
            </dataSource>  
        </environment>  
    </environments>  
      
      
    <mappers>
        <mapper resource="com/xiamen/domain/person.xml" />        
    </mappers>  
      
</configuration>  
复制代码

 包括两个部分 1. 数据库连接 2. sql映射文件Mapper

 

 2. ORM对象

 

复制代码
package com.xiamen.domain;
import java.io.Serializable;

public class Person implements Serializable {

    private int personId;
    private String name;
    private String age;
    
    public int getPersonId() {
        return personId;
    }
    public void setPersonId(int personId) {
        this.personId = personId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }

    
}
复制代码

3. sql映射文件

复制代码
<?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="com.xiamen.mapper.PersonMapper">
 <select id="getPersonById" parameterType="int" resultType="com.xiamen.domain.Person">
       select * from person where personId=#{id}
 </select>
 <insert id="insertvalues" parameterType="com.xiamen.domain.Person">
     insert into person (personId,name,age) values (#{personId},#{name},#{age})
 </insert>
</mapper>
复制代码

注意mapper的namespace的名字是mapper对象的完整路径名com.xiamen.mapper.PersonMapper(这样session就可以getMapper了)

因为mybatis的作用就是:使得接口绑定成为可能 

 

4. mapper接口

映射器是创建绑定映射语句的接口,所以mapper接口就是映射器

复制代码
package com.xiamen.mapper;
import com.xiamen.domain.Person;

public interface PersonMapper 
{
    Person getPersonById(int id);
}
复制代码

5. 测试类

复制代码
        String resource = "config/mybatis.xml";

Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = null;
        try {
            session = factory.openSession();
            Person person = (Person) session.selectOne(
            "com.xiamen.mapper.PersonMapper.getPersonById", 1);
            if(person == null)
                System.out.println("null");
            else
                System.out.println(person.toString());
            } 
        finally {
            session.close();
            }
        try {
            session = factory.openSession();
            PersonMapper mapper = session.getMapper(PersonMapper.class);
            Person person = mapper.getPersonById(1);
            if(person == null)
                System.out.println("null");
            else
                System.out.println(person.toString()); 
            } finally {
            session.close();
            }

复制代码
分享到:
评论

相关推荐

    MyBatis3 API 中文文档

    MyBatis作为一款优秀的持久层框架,主要解决了Java应用与数据库交互的问题。它支持普通的SQL查询、存储过程和高级映射,可以用来处理复杂的SQL,例如联表查询等,并且支持动态SQL语句,这在处理有较多条件判断的场景...

    Mybatis XML配置信息说明

    1. **namespace**:每个映射器都有一个唯一的命名空间,它通常是全限定类名,用于区分不同的映射器。 2. **select、insert、update、delete**:这些元素定义了SQL语句,例如查询用户信息、插入数据、更新记录或删除...

    MyBatis3.2.4完全自学手册

    ### MyBatis3.2.4完全自学手册 #### 一、快速入门 **1、MyBatis简介** ...总结起来,MyBatis是一个功能强大、易于使用的持久层框架,通过其丰富的特性和灵活的配置选项,可以有效地解决各种数据库访问问题。

    MyBatis-搭建MyBatis开发环境一(MyEclipse版)

    在实际开发过程中,"数据库和纪要.txt"文件可能是记录数据库设计和开发过程中的重要笔记,包括表结构、字段说明、业务规则等。它可以帮助团队成员更好地理解数据库的设计意图,提高协作效率。 总结一下,MyBatis与...

    Mybatis工作流程.docx

    - **步骤说明**:通过`MyBatisUtil`工具类创建`SqlSessionFactory`工厂,并找到`mybatis-config.xml`总配置文件。这是MyBatis初始化的第一个环节。 - **关键代码**: ```java String resource = "org/mybatis/...

    mybatis和spring整合方式-带注解

    ### MyBatis与Spring整合方式详解:基于注解的实现 #### 一、概述 在实际的软件开发过程中,为了更好地实现项目的模块化管理和提高代码的可维护性,通常会将MyBatis与Spring框架进行整合。这种方式不仅能够简化...

    mybatis 实例说明

    MyBatis是一个强大的Java持久层框架,它提供了一种灵活的映射机制,将SQL语句与Java代码分离,使得数据库操作变得更加简单和易于管理。本实例将深入讲解MyBatis的基本概念、配置以及如何在实际项目中使用。 首先,...

    实现mybatis-只有一个参数传递的查询+代码+注释

    MyBatis的注释通常用于提供额外的说明,例如接口方法的用途、参数的意义等,以便其他开发者理解代码。在实际项目中,良好的注释可以提高代码的可读性和维护性。 总结来说,实现MyBatis中只有一个参数传递的查询,...

    mybatis一级缓存和二级缓存简单示例

    本文将深入讲解 MyBatis 的一级缓存和二级缓存,并通过一个简单的示例进行说明。 ### 一级缓存 一级缓存是 Session 级别的缓存,也称为本地缓存(Local Cache)。每当我们在一个 SqlSession 中执行了 CRUD 操作,...

    mybatis01_入门案例

    以下是对标题和描述中所述知识点的详细说明: 一、框架的理解 框架在软件开发中扮演着重要的角色,它是一套预定义的解决方案,针对特定问题领域提供了一种标准化的开发模式。例如,MyBatis是一个专门针对持久层操作...

    MyBatis初学

    以下是对标题和描述中提到的知识点的详细说明: 1. **环境搭建**: - **MyBatis 版本**:在描述中提到了使用的是 MyBatis 3.1.1 版本。尽管现在MyBatis已经更新到更高的版本,但了解旧版本的配置可以帮助理解框架...

    MyBatis 14道面试题和答案.docx

    以上就是关于MyBatis的核心知识点,包括其解决JDBC问题的方式、编程步骤、与Hibernate的区别,以及缓存机制的详细说明。这些内容涵盖了MyBatis的基础使用和高级特性,有助于理解和掌握MyBatis在实际项目中的应用。

    韩顺平 Java工程师课程-MyBatis.pdf

    MyBatis 正是为了解决这些问题而生的。MyBatis 通过将对数据表的操作(SQL、方法)等等直接剥离,写到 XML 配置文件,实现和 Java 代码的解耦,从而简化数据库操作,提高开发效率,提高代码的可读性和可维护性。 2....

    spring+springmvc+mybatis架构整合增删改查

    接着,我们来看`说明.txt`,这通常是一个指导文档,可能会包含集成步骤、配置详解或注意事项。在整合SSM的过程中,我们需要配置Spring的ApplicationContext、SpringMVC的DispatcherServlet配置以及MyBatis的...

    struts2.3+spring4.1+mybatis3.2.docx

    在Java Web开发领域,Struts2、Spring 和 MyBatis 是三个非常流行的开源框架,它们各自解决了不同的问题:Struts2 用于MVC模式的实现;Spring 作为轻量级的IoC容器和AOP框架;MyBatis 则提供了优秀的持久层解决方案...

    springboot mybatis freemark 框架集成 加实现demo

    以下是对集成过程的详细说明: 一、SpringBoot简介 SpringBoot是由Pivotal团队提供的全新框架,它旨在简化Spring应用的初始搭建以及开发过程。SpringBoot通过“约定优于配置”的方式,极大地减少了Spring应用的启动...

    Mybatis对数据库简单操作参考.pdf

    以下是对"Mybatis对数据库简单操作"的详细说明: 1. **创建Web程序**: 在这个例子中,我们创建了一个名为`test-mybatis`的Web应用程序。这通常涉及到在IDE(如Eclipse、IntelliJ IDEA等)中新建一个动态Web项目,...

    [应用开发及迁移][客户端编程开发框架]MyBatis指南.pdf

    #### 二、MyBatis配置说明 在使用MyBatis进行开发之前,需要完成必要的配置工作,主要包括以下几个方面: 1. **MyBatis Jar包与JDBC包的准备:** - MyBatis的jar包可以从官方网站下载。 - 适用于KingbaseES的...

    Mybatis一对多关联关系映射实现过程解析

    &lt;mapper namespace="cn.jason.bootmybatis.mapper.UserMapper"&gt; &lt;!--一对多关系映射 ofType表示属性集合中的元素的类型,List属性即Orders类 --&gt; &lt;!--关联查询sql--&gt; select u.*,o.id as ...

Global site tag (gtag.js) - Google Analytics