Mybatis实现SQL映射的两种方法(xml文件形式和注解形式)

 更新时间:2023年07月13日 14:35:37   作者:寒山月初°C  
这篇文章主要介绍了Mybatis实现SQL映射的两种方法(xml文件形式和注解形式),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mybatis实现SQL映射的两种方式

SQL映射是Mybatis中最重要,复杂的组件,它由一个接口和对应的XML文件(或注解)组成。

它可以配置以下内容:

  • 描述映射规则。
  • 提供 SQL 语句,并可以配置 SQL 参数类型、返回类型、缓存刷新等信息。
  • 配置缓存。
  • 提供动态 SQL。

在介绍实现映射的方式之前,先用SQL在数据库中创建一个role表。

CREATE TABLE `role` (
    `id` BIGINT(20) NOT NULL,
    `role_name` VARCHAR(20) DEFAULT NULL,
    `note` VARCHAR(20) DEFAULT NULL,
    PRIMARY KEY (`id`)
)

定义一个POJO,如下所示:

package com.ljt.mybatis;
public class Role {
    private Long id;
    private String roleName;
    private String note;
}

映射器的主要作用就是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库中,并定义一些关于缓存等的重要内容。

注意,开发只是一个接口,而不是一个实现类。

初学者可能会有很大的疑问,接口不是不能运行吗?

是的,接口确实不能直接运行。Mybatis使用了动态代理技术使得接口能够运行起来,目前我们只需要知道Mybatis会为这个接口生成一个代理对象,代理对象会去处理相关的逻辑即可。

一,用XML实现映射器

用 XML 定义映射器分为两个部分:接口和 XML。

先定义一个映射器接口

package com.ljt.mybatis.mapper;
import com.ljt.mybatis.bean.Role;
public interface RoleMapper {
    public Role getRole(Long id);
}

在XML基础配置文件中写入这样一段代码:

<mapper resource="com/ljt/mybatis/mapper/RoleMapper.xml" />

它的作用就是引入一个 XML 映射文件文件。

用 XML 方式创建映射器,如下所示:

<?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.mybatis.mapper.RoleMapper">
    <select id="getRole" parameterType="long" resultType="role">
        SELECT id,role_name as roleName,note FROM role WHERE id =#{id}
    </select>
</mapper>

这就完成了一个映射器的定义。

mapper元素中的属性 namespace 所对应的是一个接口的全限定名,于是 MyBatis 上下文就可以通过它找到对应的接口。

select 元素表明这是一条查询语句,而属性 id 标识了这条 SQL所映射的方法名,属性 parameterType=“long” 说明传递给 SQL 的是一个 long 型的参数,而 resultType=“role” 表示返回的是一个 role 类型的返回值。而 role 是之前配置文件 mybatis-config.xml 配置的类的别名,指代的是 com.ljt.mybatis.bean.Role。

这条 SQL 中的 #{id} 表示传递进去的参数。

这里采用的是一种被称为自动映射的功能,MyBatis 在默认情况下提供自动映射,只要 SQL 返回的列名能和 POJO 对应起来即可。

这里 SQL 返回的列名 id 和 note 是可以和之前定义的 POJO 的属性对应起来的,而表里的列 role_name 通过 SQL 别名的改写,使其成为 roleName,也是和 POJO 对应起来的,所以此时 MyBatis 就可以把 SQL 查询的结果通过自动映射的功能映射成为一个 POJO。

二,注解实现映射

除 XML 方式定义映射器外,还可以采用注解方式定义映射器,它只需要一个接口就可以通过 MyBatis 的注解来注入 SQL,如下所示。

package com.ljt.mybatis.mapper;
import com.ljt.mybatis.bean.Role;
import org.apache.ibatis.annotations.Select;
public interface RoleMapper {
    @Select("select id,role_name as roleName,note from t_role where id=#{id}")
    public Role getRole(Long id);
}

这完全等同于上面使用XML文件方式创建映射器。

目前好像是使用注解映射会比XML映射好用的多(毕竟代码量少很多)。。。

真的是这样吗?

我们来看看以下这条SQL

SELECT ..........
From dbo.PDA_TB_Produce a With(Nolock)
  Join dbo.DctOperationList b With(Nolock)
   On a.Operation_Code=b.Operation_Code
  Join dbo.DctOneStatusList c With(Nolock)
   On a.One_Status_Code=c.One_Status_Code
  Left join dbo.DctTwoStatusList d With(Nolock)
   On c.One_Status_Code=d.One_Status_Code and a.Two_Status_Code=d.Two_Status_Code
  left Join dbo.DctMachineList e With(Nolock)
   On a.Operation_Code=e.Operation_Code and a.Machine_Code=e.Machine_Code
  left Join dbo.DctOperationList f With(Nolock)
   On a.Next_Operation_Code=f.Operation_Code
  Join dbo.DctUserList g With(Nolock)
   On a.User_ID_Operating=g.User_ID
  Join dbo.DctUserList h With(Nolock)
   On a.User_ID=h.User_ID

emmm…

显然这条 SQL 比较复杂,如果放入 @Select 中会明显增加注解的内容。如果把大量的 SQL 放入 代码中,显然代码的可读性也会下降。

如果同时还要考虑使用动态 SQL, 还需要加入其他的逻辑,这样就使得这个注解更加复杂了,不利于日后的维护和修改。

这时候就会有老实人发问了,那么到底是使用注解还是XML呢?

实际上,注解方式和 XML 方式同时定义时,XML 方式将覆盖掉注解方式,所以 MyBatis 官方推荐使用的是 XML 方式。

此外,XML 可以相互引入,而注解是不可以的,所以在一些比较复杂的场景下,使用 XML 方式会更加灵活和方便。

所以大部分的企业都是以 XML 为主,当然,在一些简单的表和应用中使用注解方式也会比较简单。

总结

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

相关文章

  • Java实现推箱子游戏

    Java实现推箱子游戏

    这篇文章主要为大家详细介绍了Java实现推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • java堆栈类使用实例(java中stack的使用方法)

    java堆栈类使用实例(java中stack的使用方法)

    java中stack的使用方法,堆栈是一种"后进先出"(LIFO) 的数据结构, 只能在一端进行插入(称为"压栈") 或删除 (称为"出栈")数据的操作,下面看示例吧
    2013-12-12
  • Java优先队列(PriorityQueue)重写compare操作

    Java优先队列(PriorityQueue)重写compare操作

    这篇文章主要介绍了Java优先队列(PriorityQueue)重写compare操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 四种Springboot常见全局时间格式化方式

    四种Springboot常见全局时间格式化方式

    这篇文章主要为大家详细介绍了Springboot实现全局时间格式化的四种常见方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Java向上转型和向下转型实例解析

    Java向上转型和向下转型实例解析

    这篇文章主要介绍了Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java实现AOP面向切面编程的实例教程

    Java实现AOP面向切面编程的实例教程

    这篇文章主要介绍了Java实现AOP面向切面编程的实例教程,通常Java中的AOP都是利用Spring框架中造好的轮子来开发,而本文则关注于Java本身AOP的设计模式实现,需要的朋友可以参考下
    2016-04-04
  • Spring MVC 学习 之 - URL参数传递详解

    Spring MVC 学习 之 - URL参数传递详解

    本篇文章主要介绍了SpringMVC-URL参数传递,在学习 Spring Mvc 过程中,有必要来先了解几个关键参数,有兴趣的可以了解一下。
    2017-01-01
  • Spring boot2.0 实现日志集成的方法(3)

    Spring boot2.0 实现日志集成的方法(3)

    这篇文章主要介绍了Spring boot2.0 实现日志集成的方法,基于上一篇将日志信息根据类别输出到不同的文件中,这篇文章将通过日志来监控用户的操作行为、请求的耗时情况,针对耗时久的请求进行性能分析,提升系统性能,需要的小伙伴可以参考一下
    2022-04-04
  • maven模块化开发部署实现方案

    maven模块化开发部署实现方案

    有些用户有定制化需求,需要添加新的模块功能,因此需要平台主体功能迭代的同时,非主体功能和定制化功能插件化,本文给大家介绍maven模块化开发部署实现方案,感兴趣的朋友一起看看吧
    2024-01-01
  • Spring Boot项目集成UidGenerato的方法步骤

    Spring Boot项目集成UidGenerato的方法步骤

    这篇文章主要介绍了Spring Boot项目集成UidGenerato的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论