`
禹爸爸
  • 浏览: 85747 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Mybatis系列(六)接口式编程

阅读更多

Mybatis系列之接口式编程

引言

在前面的文章《Mybatis系列之简单示例》曾有一段代码涉及到了接口式编程,当时并没有展开阐述,今天我们单独把这一段拿出来表一表。

在讲Mybatis接口式编程之前,我们先回忆一下前面是如何调用映射文件中的SQL代码的。通常情况下,都是使用SqlSession实例的selectXXX(selectOne, selectList, selectMap)方法来执行映射文件中相应的SQL语句的,这些方法都有一个共同的特征,那就是第一个参数都是String类型的,我们需要使用这个参数明确告之Mybatis我们是需要执行映射文件的哪一个元素下的SQL语句,所以这个参数内容应该是映射文件的名称空间加上相应元素的id值,如:

Object obj = session.selectOne("com.emerson.learning.mapping.user.getByID", 240);
User user = (User)obj;
... ...

这条语句告诉我们,要在名称空间com.emerson.learning.mapping.user下查找一个id为getById的元素,并执行其SQL语句。在获取返回值之后,我们还需要对其进行强类型转换。

 

这里存在一些潜在的问题:

  • 为了确保名称空间的唯一性,通常会使用相对较长的、且有一定含义的字符串来作为其值,这样就很难保证我们在代码不出现拼写错误的情况,即使是直接从映射文件拷贝过来的,也存在不经意间被修改的可能性;
  • 从selectXXX方法的签名可以看到,她的第二个参数是Object类型,那么如果我们传入的参数类型与映射文件中由parameterType属性指定的类型不一致时,将会出现不可预知的错误
  • 同样,selectXXX方法返回值使用了泛型,我们须确保用于接收其返回值的变量类型与映射文件中属性resultType指定的类型相一致

Mybatis规避上述风险的手段,我们称之为接口式编程,也就是我们今天的主题。

 

定义代理接口

接口式编程,我们可以简单的理解为Mybatis为映射文件定义了一个代理接口,以后全部通过这个接口来和映射文件交互,而不再是使用以前方法。

映射文件如何知道自己被哪个接口代理呢?这里就是通过名称空间来实现的,映射文件的名称空间再也不是随心所欲的定义的了,而是要使用代理接口的全限定名作为其名称空间。所谓全限定名,就是接口所在的包名加上接口名称。

<mapper namespace="com.emerson.learning.dao.ICommunicatorDao">
    <select id="getById" parameterType="int" resultType="Communicator">
        select * from communicator where communicator_id=#{id}
    </select>
    <select id="getAll" resultType="Communicator">
        select * from communicator order by communicator_name
    </select>
</mapper>

 接口定义好了,那么如何将映射文件中的select / insert / update / delete 等元素与代理接口中的方法绑定呢?其实很简单,只需要在代理接口中定义一些方法,并以相应元素的id属性值做为方法名,parameterType属性值做为方法参数类型,属性resultType值做为方法的返回值即可。下面定义的两个方法就分别对应上面映射文件中的两个select元素。

public interface ICommunicatorDao {
    public Communicator getById(int id);
    public List<Communicator> getAll();
}

有些朋友会问了,接口定义好了,是不是还要再定义一个实现类呢?答案是否定的。Mybatis会使用动态代理机制来帮助我们完成额外的工作,我们需要做的就是把这个接口注册到Mybatis中。在Mybatis的总配置文件中,加入如下语句。

<mappers>
    <mapper class="com.emerson.learning.dao.ICommunicatorDao" />
</mappers>

这样,我们就可以在Java代码中直接调用我们定义的代理接口中的方法了。

@Test
public void testGetById() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        ICommunicatorDao cp = session.getMapper(ICommunicatorDao.class);
        Communicator c = cp.getById(1);
        if (null == c) {
            System.out.println("the result is null.");
        } else {
            System.out.println(c);
        }
    } finally {
        session.close();
    }
}

@Test
public void testGetAll() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        ICommunicatorDao cp = session.getMapper(ICommunicatorDao.class);
        List<Communicator> list = cp.getAll();
        for (Communicator c : list) {
            System.out.println(c);
        }
    } finally {
        session.close();
    }
}

是不是很简单,而且代码看上去比之前的要简洁了许多。

接口式编程与之前的调用方式相比较,有以下优点:

  • 调用方法明确,因为我们调用的是接口中的某个具体方法,而不再是通过一个字符串来指定执行映射文件中的某个SQL语句了
  • 传入参数和返回值都不再是Object了,这样就可以在代码编写阶段确保传入的参数类型是正确的,也不再需要对返回值进行强类型转换了
  • 最主要的一点,就是将来Mybatis遇到了Spring,更能发挥出接口式编程的强大潜力。

使用注解

在Mybatis3.0之后,加入了更强的注解功能。如果不需要使用到较复杂的SQL语句,可以直接把映射文件省去,直接在Java代码中使用注解的方式指定SQL语句。这种写法很简洁,但却失去了映射文件的灵活性。

public interface ICommunicatorDao {
    @Select("SELECT * FROM communicator WHERE communicator_id=#{id}")
    public Communicator getById(@Param(value = "id") int id);
	
    @Select("SELECT * FROM communicator ORDER BY communicator_id")
    public List<Communicator> getAll();
}

 

分享到:
评论

相关推荐

    myBatis系列之六:与SpringMVC集成

    这里,我们使用了SpringMVC的注解式编程,如`@RequestMapping`和`@GetMapping`,简化了路由配置。同时,`@PathVariable`帮助我们从URL路径中获取参数。 myBatis的Mapper接口可以定义SQL语句,通过XML文件或注解方式...

    Mybatis 3.4.1

    3. **Mapper接口**:Mybatis支持基于接口的编程,每个接口代表一个DAO(数据访问对象),每个方法对应一个SQL操作。这种方式使得业务代码更加整洁,降低了耦合度。 4. **参数映射**:Mybatis通过`@Param`注解或`...

    scala + mybatis 数据库查询

    Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...

    mybatis-3.4.6.zip

    在事务管理方面,MyBatis支持编程式和声明式的事务控制。编程式事务管理允许你直接在代码中控制事务的开始、提交和回滚,而声明式事务管理则可以通过Spring等框架进行配置,使得事务处理更加简洁。 除此之外,...

    尚硅谷Mybatis视频教程1-10

    4.《尚硅谷_MyBatis_接口式编程.avi》深入探讨了Mybatis的接口编程模式,讲解如何通过接口定义数据库操作,并与XML配置文件结合,实现动态SQL。 6.《尚硅谷_MyBatis_全局配置文件_引入dtd约束.avi》讲解了Mybatis的...

    Spring+cxf配置接口+mybatis配置

    Spring作为一款全面的企业级应用框架,提供了依赖注入、AOP(面向切面编程)以及一系列用于简化Java开发的工具。CXF则是一款强大的Web服务框架,用于构建和消费SOAP和RESTful服务。MyBatis则是一个轻量级的持久层...

    mybatis3.4.6jar包

    8. **事务管理**:MyBatis可以集成Spring进行事务管理,通过@Transactional注解或编程式方式进行控制,保证数据的一致性。 在MyBatis 3.4.6版本中,开发者可以利用这些特性进行高效的数据库操作,同时享受到其对SQL...

    mybatis-3.2.7.zip

    这个版本的MyBatis提供了一系列的增强功能,使得开发者在处理数据库操作时更加便捷高效。以下是关于MyBatis 3.2.7的一些关键知识点: 1. **配置文件**: - MyBatis的核心配置文件是`mybatis-config.xml`,其中定义...

    mybatis demo

    - 事务控制:MyBatis支持编程式和声明式的事务管理。在示例中,可能会展示如何配置和使用事务边界,确保数据的一致性。 - 缓存:MyBatis提供了本地缓存机制,可以缓存单个Mapper的查询结果,提高性能。学习者会...

    iBatis和MyBatis对比

    - **接口式编程**:MyBatis鼓励使用接口定义业务逻辑,使得代码更符合面向对象的设计原则。 - **更好的类型处理**:MyBatis在处理复杂的数据类型时表现得更为出色,如日期、集合等。 - **更丰富的事务管理**:...

    mybatis-3.2.2 jar包 约束文件 API

    MyBatis的事务管理支持编程式和声明式两种方式。编程式事务管理通过SqlSession的beginTransaction、commit和rollback方法手动控制;声明式事务管理则依赖于容器(如Spring)来管理,更加简洁和易于维护。此外,...

    mybatis与spring整合依赖包集

    本"mybatis与spring整合依赖包集"包含了一系列必要的库,使得开发者能够轻松地搭建集成环境,进行高效的数据访问。 首先,MyBatis是一个优秀的持久层框架,它简化了SQL操作,将SQL语句直接映射到Java方法,避免了...

    mybatis-3.4.6+jdbc驱动包5.1.47

    4. **事务管理**:MyBatis支持编程式和声明式的事务管理,可以根据项目需求选择合适的方式。 5. **缓存机制**:MyBatis内置了本地缓存和二级缓存,可以提高数据读取速度并减少对数据库的访问压力。 而`mysql-...

    JAVA SpringMVC+mybatis

    综上所述,该案例不仅涵盖了SpringMVC、MyBatis等核心框架的应用,还涉及了数据库连接池、事务管理以及一系列实用工具和技术点的使用,对于希望快速搭建高性能Web应用的开发者来说具有很高的参考价值。

    Spring集成Mybatis所需jar包

    在进行Spring与MyBatis的集成时,我们需要引入一系列的jar包来确保系统能够正常运行。这些jar包主要分为以下几个部分: 1. **Spring框架核心库**:包括`spring-context`、`spring-beans`、`spring-core`和`spring-...

    spring整合mybatis所需jar包合集

    整合Spring和MyBatis的过程中,我们需要一系列的jar包来支持。这些jar包主要包括Spring的核心模块和MyBatis的相关组件,以及它们的依赖库。以下是一些关键的jar包及其作用: 1. **spring-core.jar**: Spring框架的...

    mybatis分页(struts2+spring+mybatis)

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 2. **分页原理**:在MyBatis中,分页主要通过在SQL查询语句中添加LIMIT...

    mybatis开发用到的jar包(mybatis-3.2.5.jar、mybatis-spring-1.2.2.jar)

    而"mybatis-spring-1.2.2.jar"则是MyBatis与Spring框架的整合包,它使得MyBatis可以无缝地融入Spring的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)环境中,提供以下...

    mybatis-3-mybatis-3.5.1

    MyBatis支持编程式和声明式事务管理。在3.5.1版本中,你可以利用`SqlSession`对象来控制事务的开始、提交和回滚,或者通过Spring等框架进行集成,实现事务的自动管理。 6. 缓存机制: MyBatis提供了一级缓存...

Global site tag (gtag.js) - Google Analytics