MyBatis 是什么?与 Hibernate 的区别是什么?

news2024/11/25 9:42:09

MyBatis 是一种基于 Java 的持久化框架,它可以将 SQL 语句和 Java 代码进行映射,使得开发人员可以使用面向对象的方式来操作数据库。MyBatis 通过提供 XML 配置文件或注解方式来配置映射关系,使得数据库操作变得更加简单和灵活。

与 Hibernate 相比,MyBatis 更加轻量级,更加灵活,更加方便开发人员手动优化 SQL 语句。Hibernate 则更加适合企业级应用程序,因为它提供了更多的高级特性,如二级缓存、延迟加载等。

在这里插入图片描述

下面将介绍 MyBatis 的基本概念和使用方法,并与 Hibernate 进行对比。

1. MyBatis 的基本概念

1.1 映射文件

MyBatis 的映射文件是一个 XML 文件,用于定义 SQL 语句和 Java 对象之间的映射关系。映射文件中包含了 SQL 语句、参数映射和结果映射等信息,使得开发人员可以将数据库操作转化为 Java 对象操作,从而实现更加方便和灵活的数据库操作。下面是一个简单的映射文件示例:

<mapper namespace="com.example.UserMapper">
    <select id="findById" parameterType="int" resultType="com.example.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="insertUser" parameterType="com.example.User">
        INSERT INTO user (username, password) VALUES (#{username}, #{password})
    </insert>
    <update id="updateUser" parameterType="com.example.User">
        UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

在上面的映射文件中,namespace 属性指定了当前映射文件所属的命名空间,id 属性指定了 SQL 语句的唯一标识符,parameterType 属性指定了 SQL 语句中的参数类型,resultType 属性指定了 SQL 语句返回的结果类型。通过这些配置,MyBatis 可以将Java 对象和 SQL 语句进行映射,从而实现数据库操作。

1.2 SqlSessionFactory

SqlSessionFactory 是 MyBatis 的核心接口之一,用于创建 SqlSession 对象。SqlSession 是 MyBatis 中用于执行 SQL 语句的接口,它提供了多种方法,如 selectOne、selectList、insert、update、delete 等,用于执行不同类型的 SQL 语句。

SqlSessionFactory 可以通过 XML 配置文件或者 Java 代码进行配置,下面是一个简单的配置示例:

<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/test"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/UserMapper.xml"/>
    </mappers>
</configuration>

在上面的配置文件中,environments 元素用于配置数据库连接和事务管理,mappers 元素用于配置映射文件。通过这些配置,可以创建一个 SqlSessionFactory 对象,用于创建 SqlSession 实例。

1.3 SqlSession

SqlSession 是 MyBatis 中用于执行 SQL 语句的接口,它提供了多种方法,如 selectOne、selectList、insert、update、delete 等,用于执行不同类型的 SQL 语句。下面是一个简单的示例:

SqlSession sqlSession = sqlSessionFactory.openSession();

try {
    User user = sqlSession.selectOne("com.example.UserMapper.findById", 1);
    System.out.println(user);
} finally {
    sqlSession.close();
}

在上面的示例中,我们创建了一个 SqlSession 实例,然后使用 selectOne 方法执行查询操作。selectOne 方法的第一个参数是 SQL 语句的唯一标识符,第二个参数是 SQL 语句中的参数。通过这种方式,可以方便地执行不同类型的 SQL 语句。

2. MyBatis 的使用示例

下面将介绍 MyBatis 的使用示例,并与 Hibernate 进行对比。

2.1 配置文件

首先,需要创建一个 MyBatis 的配置文件,用于配置数据库连接和映射关系。下面是一个简单的配置文件示例:

<?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/test"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/example/UserMapper.xml"/>
  </mappers>
</configuration>

在上面的配置文件中,我们使用 POOLED 数据源类型,指定了数据库连接信息和映射文件。可以根据实际情况进行修改。

2.2 实体类

接下来,需要创建一个实体类,用于映射数据库中的表结构。下面是一个简单的实体类示例:

public class User {
    private int id;
    private String username;
    private Stringpassword;

    // getter 和 setter 方法
    // ...
}

在上面的示例中,我们定义了一个 User 类,包含了 id、username 和 password 三个属性。通过 getter 和 setter 方法,可以方便地访问这些属性。

2.3 映射文件

接下来,需要创建一个映射文件,用于定义 SQL 语句和 Java 对象之间的映射关系。下面是一个简单的映射文件示例:

<?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.example.UserMapper">
  <select id="findById" parameterType="int" resultType="com.example.User">
    SELECT * FROM user WHERE id = #{id}
  </select>
  <insert id="insertUser" parameterType="com.example.User">
    INSERT INTO user (username, password) VALUES (#{username}, #{password})
  </insert>
  <update id="updateUser" parameterType="com.example.User">
    UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id}
  </update>
  <delete id="deleteUser" parameterType="int">
    DELETE FROM user WHERE id = #{id}
  </delete>
</mapper>

在上面的示例中,我们定义了 findById、insertUser、updateUser 和 deleteUser 四个 SQL 语句,分别用于查询、插入、更新和删除操作。其中,parameterType 属性指定了 SQL 语句中的参数类型,resultType 属性指定了 SQL 语句返回的结果类型。

2.4 DAO 接口

接下来,需要创建一个 DAO 接口,用于定义数据库操作方法。下面是一个简单的 DAO 接口示例:

public interface UserDAO {
    User findById(int id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

在上面的示例中,我们定义了四个方法,分别用于查询、插入、更新和删除操作。可以根据实际情况进行修改。

2.5 DAO 实现类

最后,需要创建一个 DAO 实现类,用于实现 DAO 接口中定义的方法。下面是一个简单的 DAO 实现类示例:

public class UserDAOImpl implements UserDAO {
    private SqlSessionFactory sqlSessionFactory;

    public UserDAOImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User findById(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            return session.selectOne("com.example.UserMapper.findById", id);
        }
    }

    @Override
    public void insertUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            session.insert("com.example.UserMapper.insertUser", user);
            session.commit();
        }
    }

    @Override
    public void updateUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            session.update("com.example.UserMapper.updateUser", user);
            session.commit();
        }
    }

    @Override
    public void deleteUser(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            session.delete("com.example.UserMapper.deleteUser", id);
            session.commit();
        }
    }
}

在上面的示例中,我们实现了 UserDAO 接口中定义的四个方法,使用 SqlSession 实例执行 SQL 语句。其中,使用 try-with-resources 语句可以自动关闭 SqlSession 实例,避免资源泄漏。另外,在插入、更新和删除操作后需要调用 commit 方法提交事务。

2.6 使用示例

使用 MyBatis 进行数据库操作的流程如下:

  1. 配置 SqlSessionFactory:通过配置文件或者 Java 代码创建 SqlSessionFactory 实例。
  2. 创建 DAO 实例:通过构造函数将 SqlSessionFactory 传递给 DAO 实例。
  3. 执行数据库操作:调用 DAO 实例中的方法执行数据库操作。

下面是一个简单的使用示例:

public static void main(String[] args) {
    // 配置 SqlSessionFactory
    String resource = "mybatis-config.xml";
    try (InputStream inputStream = Resources.getResourceAsStream(resource)) {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 创建 DAO 实例
        UserDAO userDAO = new UserDAOImpl(sqlSessionFactory);

        // 执行数据库操作
        User user = userDAO.findById(1);
        System.out.println(user);

        User newUser = new User();
        newUser.setUsername("test");
        newUser.setPassword("123456");
        userDAO.insertUser(newUser);

        user.setUsername("new name");
        user.setPassword("new password");
        userDAO.updateUser(user);

        userDAO.deleteUser(1);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在上面的示例中,我们首先通过配置文件创建了 SqlSessionFactory 实例,然后创建了 UserDAOImpl 实例,并使用其定义的方法执行了数据库操作。可以根据实际情况进行修改和扩展。

3. MyBatis 与 Hibernate 的对比

MyBatis 和 Hibernate 都是 Java 的持久化框架,用于将 Java 对象和数据库表进行映射。它们的区别主要体现在以下几个方面:

3.1 映射方式

MyBatis 使用 XML 配置文件或者注解方式来定义映射关系,而 Hibernate 则使用注解或者 XML 配置文件。MyBatis 的 XML 配置文件更加灵活和易于维护,而 Hibernate 的注解方式则更加简单和易于理解。

3.2 性能和扩展性

MyBatis 的性能比 Hibernate 更好,因为它允许开发人员手动优化 SQL 语句,从而提高查询效率。另外,MyBatis 的扩展性也比 Hibernate 更好,因为它不需要继承特定的父类或实现特定的接口,可以更加灵活地进行扩展。

3.3 缓存机制

MyBatis 和 Hibernate 都提供了缓存机制,用于提高查询效率。MyBatis 的缓存机制比 Hibernate 更加灵活,可以根据实际情况进行配置和优化。另外,MyBatis 还提供了二级缓存机制,可以将查询结果缓存到内存中,从而提高查询效率。

3.4 学习曲线

MyBatis 的学习曲线相对较低,因为它更加直观和易于理解,开发人员可以通过简单的配置文件和 SQL 语句来完成数据库操作。而 Hibernate 的学习曲线较高,因为它涉及到更多的概念和技术,需要开发人员具备更加深入的理解和掌握。

总结

MyBatis 是一种基于 Java 的持久化框架,它可以将 SQL 语句和 Java 代码进行映射,从而实现数据库操作。MyBatis 的优点包括灵活性高、性能好、学习曲线低等,可以适用于各种规模的项目开发。使用 MyBatis 进行数据库操作的流程包括配置 SqlSessionFactory、创建 DAO 实例、执行数据库操作等。与 Hibernate 相比,MyBatis 的映射方式更加灵活、性能更好、扩展性更好,学习曲线更低。开发人员可以根据实际情况选择适合自己的持久化框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS Code 配置 C/C++ 开发环境

一、软件下载 需要下载的软件如下&#xff1a; VS Code编译工具&#xff1a;MinGW 或 MSYS2 或 VS2022 VS Code 下载地址&#xff1a;链接 MinGW 下载地址&#xff1a;链接 或者 链接 MSYS2 下载地址&#xff1a;链接 VS2022 下载地址&#xff1a;链接 上述软件下载完成以后…

入门JavaScript编程:上手实践四个常见操作和一个轮播图案例

部分数据来源&#xff1a;ChatGPT 简介 JavaScript是一门广泛应用于Web开发的脚本语言&#xff0c;它主要用于实现动态效果和客户端交互。下面我们将介绍几个例子&#xff0c;涵盖了JavaScript中一些常见的操作&#xff0c;包括&#xff1a;字符串、数组、对象、事件等。 例子…

Java【TCP 协议2】好多人都错了! 保证可靠传输的不是三次握手和四次挥手! 而是...

文章目录 前言一、确认应答1, 什么是确认应答2, 序列号和确认应答号 二、超时重传1, 什么是超时重传 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系…

蓝牙RFCOMM 协议

蓝牙RFCOMM 1.RFCOMM1.1 服务定义模型1.2 字节排序 2 RFCOMM数据帧2.1 选项和模式2.2 帧类型2.3 帧格式2.3.1 Address2.3.2 Control&#xff08;帧类型&#xff09;2.3.3 Length2.3.4 InfoData2.3.5 FCS 2.4 多路复用控制命令&#xff08;DLCI 0&#xff09;2.4.1 DLC paramete…

OpenCV基础操作(4)颜色空间转换、几何变换、图像二值化操作

OpenCV基础操作(4)颜色空间转换、几何变换、图像二值化操作 import cv2 as cv import numpy as np一、颜色空间转换 1、转换颜色空间 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会发现我们经常用到的也就两种&#xff1a;BGR↔Gray 和 BGR↔HSV。 我们…

《面试1v1》volatile

基本功 我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你能解释一下 volatile 关键字的作用吗&#xff1f; 候选人&#xff1a; 当我们在编写多线程程序时&#xff0c;经常会遇到线程安全的问…

iptables防火墙(一)

iptables防火墙 一、iptables概述1、netfilter 与 iptables 的关系1.netfilter2.iptables 2、四表五链1.四表2.五链3.表的匹配优先级4.规则链之间的匹配顺序5.规则链内的匹配顺序 二、iptables防火墙的安装及配置方法1、iptables防火墙安装2、iptables防火墙的配置方法1.iptabl…

nginx(七十八)日志的深入探究

一 日志 ① nginx与日志相关的指令 access_log log_format error_log rewrite_log log_subrequest debug_connection rewrite_log limit_conn_log_level limit_req_log_level log_not_found open_log_file_cache uninitialized_variable_warn log_not_found …

【重新定义matlab强大系列八】利用matlab求局部值(函数islocalmax求局部最大值+函数islocalmin求局部最小值)

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

三控开关接线方式记录

参考原视频 三控开关与双控开关的多种接法&#xff0c;多控开关的工作原理_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Qh4y1J7gC/?spm_id_from333.337.search-card.all.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e原视频讲的不错&#xff0c;大家可以关…

国内好用的免费AI处理工具:Chat8(实现类似ChatGPT功能、TCP/IP通讯问题)

目前国外的ChatGPT比较火&#xff0c;朋友推荐了一个chat8&#xff0c;经过使用&#xff0c;觉得还不错&#xff0c;链接如下&#xff1a; https://ai.chat86.co/go/kl/775283&#xff0c;进去后可以直接用手机注册使用&#xff0c;以下是我问其关于TCP/IP的对话过程&#xff0…

(转载)从0开始学matlab(第11天)—关系运算符和逻辑运算符

选择结构的运算由一个表达式控制的&#xff0c;这个表达式的结果只有 true(1) 和 false(0)。有两种形式的运算符可以在 MATLAB 中关系得到 true/false&#xff1a;关系运算符和逻辑运算符。跟 C 语言一样&#xff0c; MATLAB 没有布尔型和逻辑数据类型。 MATLAB 把 0 …

模块一:k8s集群部署与安全配置

模块一&#xff1a;k8s集群部署与安全配置 目录 1、K8s安全运维概述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PST6trat-1684674016197)(https://bucket-hg.oss-cn-shanghai.aliyuncs.com/img/1665822875941-73d822c8-7bdd-481c-acc1-df97b70c…

python爬虫实战——小说爬取

python爬虫实战——小说爬取 基于requests库和lxml库编写的爬虫&#xff0c;目标小说网站域名http://www.365kk.cc/&#xff0c;类似的小说网站殊途同归&#xff0c;均可采用本文方法爬取。 目标网站&#xff1a;传送门 本文的目标书籍&#xff1a;《我的师兄实在太稳健了》…

软件设计师第4题

首先&#xff0c;我是备考2023年上半年的考试。 一、历年考试题 历年的考题如下&#xff0c;从表中分析可以看出&#xff0c;动态规划法、排序算法、回溯法、分治法是很大概率考察的算法&#xff0c;尤其是动态规划法&#xff0c;本身其理解难度较高&#xff0c;且可以出的题型…

docker:容器的数据卷

1 数据卷概念及作用 1.1 什么是容器数据卷 先来看看Docker的理念&#xff1a; 将应用与运行的环境打包形成容器运行 &#xff0c;运行可以伴随着容器&#xff0c;但是我们对数据的要求希望是持久化的容器之间希望有可能共享数据 Docker容器产生的数据&#xff0c;如果不通过…

什么是人工智能的知识图谱?知识图谱的组成、构建、应用有哪些?

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是一种通过计算机模拟人类智能的技术&#xff0c;其应用范围越来越广泛。知识图谱&#xff08;Knowledge Graph&#xff0c;KG&#xff09;则是人工智能技术中的重要组成部分&#xff0c;它是一种结构化…

Redis集群安装之主从集群

1.主从集群 Redis有三种集群模式&#xff0c;分别是&#xff1a;主从模式、哨兵模式、Cluster模式。Rdis最开始使用主从模式做集群&#xff0c;若master宕机需要手动配置slave转为master&#xff1b;后来为了高可用提出来哨兵模式&#xff0c;该模式下有一个哨兵监视master和s…

TCP实现HTTP服务

在之前的篇章中我们已经讲过七层参考模型了&#xff0c;今天我们从传输层实现应用层http服务 使用nodejs原生net模块就可以打通TCP传输层并且提供一个端口号进行监听 创建一个TCP服务 import net from netconst server net.createServer((socket) > {socket.on(data, (da…

【路径规划】基于人工蜂群算法的栅格法路径规划 机器人路径规划【Matlab代码#23】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 原始ABC算法2. 机器人路径规划环境创建3. 路径规划模型建立4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. 原…