MyBatis ORM映射方式示例详解

 更新时间:2024年12月19日 14:18:11   作者:AllenBright  
MyBatis作为一种灵活且强大的ORM框架,提供了多种映射方式,包括基于XML的映射、基于注解的映射以及混合映射,这篇文章主要介绍了MyBatis ORM映射方式详解,需要的朋友可以参考下

在现代的Java应用开发中,ORM(Object-Relational Mapping,对象关系映射)框架是不可或缺的一部分。MyBatis作为一种灵活且强大的ORM框架,因其能够直接操作SQL语句而受到许多开发者的青睐。

1. MyBatis简介

MyBatis是一个持久层框架,它通过XML描述符或注解将Java对象与数据库记录进行映射。与Hibernate等全自动ORM框架不同,MyBatis允许开发者直接编写SQL语句,从而提供了更高的灵活性和控制力。

2. MyBatis的ORM映射方式

MyBatis的ORM映射方式主要分为以下几种:

2.1 基于XML的映射

MyBatis最初是通过XML文件来配置SQL映射的。开发者可以在XML文件中定义SQL语句、参数映射、结果映射等。

2.1.1 SQL映射文件

<mapper namespace="com.allen.mapper.UserMapper">
    <select id="selectUser" resultType="com.allen.model.User">
        SELECT id, username, password
        FROM users
        WHERE id = #{id}
    </select>
</mapper>

在这个例子中,<select>标签定义了一个查询语句,id属性用于标识这个SQL语句,resultType属性指定了查询结果映射到的Java对象类型。

2.1.2 参数映射

MyBatis支持多种参数映射方式,包括简单类型、JavaBean、Map等。

<select id="selectUserByUsername" resultType="com.allen.model.User">
    SELECT id, username, password
    FROM users
    WHERE username = #{username}
</select>

在这个例子中,#{username}表示一个参数占位符,MyBatis会自动将传入的参数值替换到SQL语句中。

2.1.3 结果映射

结果映射是指将查询结果集映射到Java对象的过程。MyBatis提供了多种结果映射方式,包括自动映射、手动映射等。

<resultMap id="userResultMap" type="com.allen.model.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
</resultMap>
<select id="selectUser" resultMap="userResultMap">
    SELECT id, username, password
    FROM users
    WHERE id = #{id}
</select>

在这个例子中,<resultMap>标签定义了一个结果映射,<id><result>标签分别用于映射主键和普通字段。

2.2 基于注解的映射

随着Java注解的流行,MyBatis也提供了基于注解的映射方式,使得开发者可以在Java代码中直接定义SQL映射,而无需编写XML文件。

2.2.1 基本注解

public interface UserMapper {
    @Select("SELECT id, username, password FROM users WHERE id = #{id}")
    User selectUser(int id);
}

在这个例子中,@Select注解用于定义一个查询语句,#{id}表示一个参数占位符。

2.2.2 参数注解

MyBatis注解方式也支持多种参数注解,如@Param@Results等。

public interface UserMapper {
    @Select("SELECT id, username, password FROM users WHERE username = #{username}")
    User selectUserByUsername(@Param("username") String username);
}

在这个例子中,@Param注解用于指定参数名称。

2.2.3 结果映射注解

MyBatis注解方式也支持结果映射,通过@Results@Result注解可以定义结果映射。

public interface UserMapper {
    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "username", column = "username"),
        @Result(property = "password", column = "password")
    })
    @Select("SELECT id, username, password FROM users WHERE id = #{id}")
    User selectUser(int id);
}

在这个例子中,@Results注解用于定义结果映射,@Result注解用于映射字段。

2.3 混合映射

MyBatis允许开发者同时使用XML和注解进行映射,这种方式称为混合映射。开发者可以根据需要选择合适的映射方式。

public interface UserMapper {
    @Select("SELECT id, username, password FROM users WHERE id = #{id}")
    User selectUser(int id);
    @Select("SELECT id, username, password FROM users WHERE username = #{username}")
    User selectUserByUsername(@Param("username") String username);
    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "username", column = "username"),
        @Result(property = "password", column = "password")
    })
    @Select("SELECT id, username, password FROM users WHERE id = #{id}")
    User selectUserWithResultMap(int id);
}

在这个例子中,selectUserselectUserByUsername方法使用了注解映射,而selectUserWithResultMap方法使用了注解和结果映射。

3. MyBatis映射的高级特性

3.1 动态SQL

MyBatis提供了强大的动态SQL功能,允许开发者根据不同的条件生成不同的SQL语句。

<select id="selectUsers" resultType="com.allen.model.User">
    SELECT id, username, password
    FROM users
    <where>
        <if test="username != null">
            AND username = #{username}
        </if>
        <if test="password != null">
            AND password = #{password}
        </if>
    </where>
</select>

在这个例子中,<where>标签和<if>标签用于生成动态SQL语句。

3.2 关联映射

MyBatis支持一对一、一对多、多对多等关联映射。

<resultMap id="userResultMap" type="com.allen.model.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
    <association property="role" javaType="com.allen.model.Role">
        <id property="id" column="role_id"/>
        <result property="name" column="role_name"/>
    </association>
</resultMap>
<select id="selectUserWithRole" resultMap="userResultMap">
    SELECT u.id, u.username, u.password, r.id as role_id, r.name as role_name
    FROM users u
    JOIN roles r ON u.role_id = r.id
    WHERE u.id = #{id}
</select>

在这个例子中,<association>标签用于映射一对一关联。

3.3 延迟加载

MyBatis支持延迟加载,可以在需要时才加载关联对象,从而提高性能。

<resultMap id="userResultMap" type="com.allen.model.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
    <association property="role" javaType="com.allen.model.Role" select="selectRole" column="role_id" fetchType="lazy"/>
</resultMap>
<select id="selectUserWithRole" resultMap="userResultMap">
    SELECT id, username, password, role_id
    FROM users
    WHERE id = #{id}
</select>
<select id="selectRole" resultType="com.allen.model.Role">
    SELECT id, name
    FROM roles
    WHERE id = #{role_id}
</select>

在这个例子中,fetchType="lazy"表示延迟加载。

4. 总结

MyBatis作为一种灵活且强大的ORM框架,提供了多种映射方式,包括基于XML的映射、基于注解的映射以及混合映射。开发者可以根据项目需求选择合适的映射方式,并通过动态SQL、关联映射、延迟加载等高级特性进一步提升应用的性能和可维护性。

到此这篇关于MyBatis ORM映射方式详解的文章就介绍到这了,更多相关MyBatis ORM映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ设计之异步刷盘

    RocketMQ设计之异步刷盘

    本文介绍RocketMQ设计之异步刷盘,RocketMQ消息存储到磁盘上,这样既保证断电后恢复,也让存储消息量超出内存限制,RocketMQ为了提高性能,会尽可能保证磁盘顺序写,消息通过Producer写入RocketMQ的时候,有两种方式,上篇介绍了同步刷盘,本文介绍异步刷盘,需要的朋友可以参考下
    2022-03-03
  • Java实现Token工具类进行登录和拦截

    Java实现Token工具类进行登录和拦截

    在应用的登录时需要生成token进行验证,并放入信息,之后的话可以直接使用浏览器的session进行登录,本文就来利用java编写一个token工具类,可以很方便的生成和解析token,感兴趣的可以了解下
    2023-12-12
  • SpringCloud OpenFeign 自定义响应解码器的问题记录

    SpringCloud OpenFeign 自定义响应解码器的问题记录

    我们在使用 Spring Cloud 微服务的时候,通常将返回结果使用一个JsonResult 类进行封装,本文重点介绍SpringCloud OpenFeign 自定义响应解码器的问题记录,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • SpringBoot生成License的实现示例

    SpringBoot生成License的实现示例

    License指的是版权许可证,那么对于SpringBoot项目,如何增加License呢?本文就来介绍一下,感兴趣的可以了解一下
    2021-06-06
  • eclipse下ini设置详情

    eclipse下ini设置详情

    这篇文章主要介绍了eclipse下ini设置详情,需要的朋友可以参考下
    2017-10-10
  • Java并发多线程编程之CountDownLatch的用法

    Java并发多线程编程之CountDownLatch的用法

    这篇文章主要介绍了Java并发多线程编程之CountDownLatch的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • java 字节流和字符流的区别详解

    java 字节流和字符流的区别详解

    这篇文章主要介绍了java 字节流和字符流的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java中的interrupted()和isInterrupted()

    Java中的interrupted()和isInterrupted()

    这篇文章主要介绍了Java中的interrupted()和isInterrupted()摸下面文章围绕interrupted()和isInterrupted()的相关资料展开详细内容,需要的小伙伴乐意参考下面下面文章具体价绍,希望对大家有所帮助
    2021-11-11
  • Springboot利用Redis实现接口幂等性拦截

    Springboot利用Redis实现接口幂等性拦截

    这篇文章主要为大家介绍了Springboot如何利用Redis实现接口幂等性拦截。本文将通过自定义注解+redis+拦截器+MD5 实现,感兴趣的可以了解一下
    2022-06-06
  • SpringMVC使用@Valid注解进行数据验证的方法

    SpringMVC使用@Valid注解进行数据验证的方法

    本篇文章主要介绍了SpringMVC使用@Valid注解进行数据验证的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论