第一章 MyBatis初体验

时间:2021-6-4 作者:qvyue

target

了解什么是MyBatis
了解Hibernate 和 MyBatis 的区别
掌握如何创建一个MyBatis程序

1. 概述

第一章 MyBatis初体验
logo

MyBatis 的前身是 Apache 的开源项目 iBatis。MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架。

MyBatis 与 JDBC 相比,减少了 50% 以上的代码量。并且满足高并发和高响应的要求,所以它成为最流行的 Java 互联网持久框架。

在移动互联网时代,MyBatis 成为了目前互联网 Java持久框架的首选。

MyBatis 本是 Apache 的一个开源项目——iBatis,2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为 MyBatis。

MyBatis 是一个基于 Java 的持久层框架。MyBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。

MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

目前,Java 的持久层框架产品有许多,常见的有 Hibernate 和 MyBatis。

2. Hibernate 和 MyBatis 的区别

1) sql优化方面

  • Hibernate 不需要编写大量的 SQL,就可以完全映射,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)对 POJO 进行操作。但会多消耗性能。
  • MyBatis 手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对大些。

2)开发方面

  • MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO、SQL 和映射关系。
  • Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。

3)Hibernate 优势

  • Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis需要维护 SQL 和结果映射。
  • Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
  • Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。
  • Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。

4)Mybatis优势

  • MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
  • MyBatis 容易掌握,而 Hibernate 门槛较高。

总的来说,MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

所以对于性能要求不太苛刻的系统,比如管理系统、ERP 等推荐使用 Hibernate,而对于性能要求高、响应快、灵活的系统则推荐使用 MyBatis。

3. 下载

MyBatis 的版本可以通过”https://github.com/mybatis/mybatis-3/releases”网址下载。在下载时只需选择 mybatis-3.4.5.zip 即可。

第一章 MyBatis初体验
下载

解压后得到如图所示的目录。

第一章 MyBatis初体验

图中的 mybatis-3.4.5.jar 是 MyBatis 的核心包,mybatis-3.4.5.pdf 是 MyBatis 的使用手册,lib 文件夹下的 JAR 是 MyBatis 的依赖包。

在使用 MyBatis 框架时需要将它的核心包和依赖包引入到应用程序中。如果是 Web 应用,只需将核心包和依赖包复制到 /WEB-INF/lib 目录中。

4. 第一个Mybatis程序

在创建项目之前,首先在 MySQL数据库中创建 mybatis 数据库和 user 表,sql 语句如下所示:

CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `uid` tinyint(2) AUTO_INCREMENT NOT NULL,
  `uname` varchar(20) DEFAULT NULL,
  `usex` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT into user(uname,usex) VALUES ('张晓三','男');
INSERT into user(uname,usex) VALUES ('李晓四','女');
INSERT into user(uname,usex) VALUES ('王晓五','男');

下面通过一个实例讲解如何使用 Eclipse 开发 MyBatis 入门程序,创建Web项目mybatis-01

1)导入 JAR 包

将 MyBatis 的核心 JAR 包、依赖 JAR 包以及 MySQL 数据库的驱动 JAR 包一起复制到 /WEB-INF/lib 目录下。

log4j-1.2.17.jar
log4j-api-2.3.jar
log4j-core-2.3.jar
mybatis-3.4.5.jar
mysql-connector-java-8.0.15.jar

2)创建日志文件

MyBatis 默认使用 log4j 输出日志信息,如果开发者需要查看控制台输出的 SQL 语句,那么需要在 classpath 路径下配置其日志文件。在 myBatis应用的 src 目录下创建 log4j.properties文件,其内容如下:

# Global logging configuration
log4j.rootLogger=ERROR,stdout
# MyBatis logging configuration...
log4j.logger.com.mybatis=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

在日志文件中配置了全局的日志配置、MyBatis 的日志配置和控制台输出,其中 MyBatis 的日志配置用于将 com.mybatis 包下所有类的日志记录级别设置为 DEBUG。该配置文件内容不需要开发者全部手写,可以从 MyBatis 使用手册中的 Logging 小节复制,然后进行简单修改。

3)创建实体类

创建持久化类 MyUser,注意在类中声明的属性与数据表 user 的字段一致。

package com.mybatis.po;

public class User {
    private Integer uid; // 主键
    private String uname;
    private String usex;
    // 此处省略setter和getter方法
    @Override
    public String toString() { // 为了方便查看结果,重写了toString方法
        return "User[uid=" + uid + ",uname=" + uname + ",usex=" + usex + "]";
    }
}

4)创建User的映射文件

在 src 目录下创建一个名为 com.mybatis.mapper 的包,在该包中创建映射文件 UserMapper.xml。

UserMapper.xml 文件的内容如下:


        select * from user where uid = #{uid}
    
        select * from user
    
        insert into user (uname,usex)  values(#{uname},#{usex})
    
        update user 
        set uname =#{uname},usex = #{usex} where uid = #{uid}
    
        delete from user where uid  = #{uid}
    

在上述映射文件中, 元素是配置文件的根元素,它包含了一个 namespace 属性,该属性值通常设置为“包名+SQL映射文件名”,指定了唯一的命名空间。

子元素 以及 中的信息是用于执行查询、添加、修改以及删除操作的配置。在定义的 SQL 语句中,#{}表示一个占位符,相当于?,而#{uid}表示该占位符待接收参数的名称为 uid。

5)创建User的接口

接口中的内容和映射文件有千丝万缕的联系,后面会一一说到。

package com.mybatis.mapper;

public interface UserMapper {
    
    User selectUserById(Integer id);
    
    List selectAllUser();
    
    int addUserUser (User user);
    
    int updateUser(User user);
    
    int deleteUser(Integer id);
}

6)创建 MyBatis 的配置文件

在 src 目录下创建 MyBatis 的核心配置文件 mybatis-config.xml,在该文件中配置了数据库环境和映射文件的位置,具体内容如下:

上述映射文件和配置文件都不需要读者完全手动编写,都可以从 MyBatis 使用手册中复制,然后做简单修改。

7)创建测试类

在测试类中首先使用输入流读取配置文件,然后根据配置信息构建 SqlSessionFactory 对象。

接下来通过 SqlSessionFactory 对象创建 SqlSession 对象,并使用 SqlSession 对象的方法执行数据库操作。 MyBatisTest 测试类的代码如下:

package com.mybatis.test;

public class MyBatisTest {

    SqlSession sqlSession = null;

    @BeforeEach
    public void before() throws IOException {
        // 读取配置文件 mybatis-config.xml
        InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
        // 根据配置文件构建SqlSessionFactory
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
        // 通过 SqlSessionFactory 创建 SqlSession
        sqlSession = ssf.openSession();
    }

    @Test
    public void test01() {
        // 查询一个用户
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.selectUserById(1);
        System.out.println(user);
    }

    @Test
    public void test02() {
        // 添加一个用户
        User u2 = new User();
        u2.setUname("赵晓六");
        u2.setUsex("男");
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int count = userMapper.addUserUser(u2);
        System.out.println("成功添加" + count + "条记录!");
        
    }

    @Test
    public void test03() {
        // 修改一个用户
        User updateU1 = new User();
        updateU1.setUid(1);
        updateU1.setUname("张三");
        updateU1.setUsex("女");
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int count = userMapper.updateUser(updateU1);
        System.out.println("成功修改" + count + "条记录!");
    }

    @Test
    public void test04() {
        // 删除一个用户
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int count = userMapper.deleteUser(1);
        System.out.println("成功删除" + count + "条记录!");
    }

    @Test
    public void test05() {
        // 查询所有用户
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List allUsers = userMapper.selectAllUser();
        for (User myUser : allUsers) {
            System.out.println(myUser);
        }

    }

    @AfterEach
    public void after() {
        // 提交事务
        sqlSession.commit();
        // 关闭 SqlSession
        sqlSession.close();
    }
}

分别运行每个测试方法,会发现mybatis做增删改查如此简单美妙。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。