初识MyBatis框架

学习目标/Target

  • 了解框架的概念和优点
  • 了解MyBatis框架的概念和优点
  • 掌握MyBatis环境搭建
  • 掌握MyBatis入门程序的编写
  • 熟悉MyBatis工作原理

章节概述/Summary

实际开发中,随着业务的发展,软件系统变得越来越复杂,如果所有软件都从底层功能开始开发,那将是一个漫长而繁琐的过程,此外,团队协作开发时由于没有统一一的调用规范,系统会出现大量的重复功能的代码,给系统的二次开发和维护带来不便。为了解决上述问题,框架应运而生。框架实现了很多基础性的功能,开发人员不需要关心底层功能操作,只需要专心地实现所需要的业务逻辑,大大提高了开发人员的工作效率。当前市场山的Java EE开发主流框架有Spring、SpringMVC和Mybatis等,本章主要对框架的概念以及Mybatis的基础知识进行介绍。

1.1 初始框架

1.1.1 框架概述

什么是框架

“框架(Framework)”一词最早出现在建筑领域,值的是在建造房屋前期构建的建筑骨架。在编程领域,框架就是应用程序的股价,开发人员可以在这个骨架上加入自己的东西,搭建出符合自己需求的应用系统。

软件框架

软件框架是一种通用的、可复用的软件环境,他提供特定的功能,促进软件应用、产品和解决翻盖的开发工作。软件框架会包含支持程序、编译器、代码、库、工具集以及API,它把所有这些部件汇集在一起,以支持项目或系统的开发。

软件框架可以形象地比喻成我们在盖楼房时,用梁+柱子+承重墙搭建起来的钢筋混凝土结构的建筑框架,他是整个建筑的骨架。而实现的软件功能,也就像在这个建筑框架中所要实现的不同类型、功能的房子,比如健身房、商场、酒店、饭店等。

1.1.2 框架的优势

早期Java EE开发弊端

在早期Java EE应用开发中,企业开发人员利用JSP+Servlet技术进行软件应用和系统开发的,使用该技术会有以下两个弊端

(1) 软件应用和系统可维护性差

如果全部采用JSP+Servlet技术进行软件的开发,因为分层不够清晰,业务逻辑的实现无法单独分离出来,从而造成系统后期维护困难。

(2)代码重用性低

企业希望以最快的速度,开发出最稳定、最实用的软件。如果系统不适用框架,每次开发系统都需要重新开发,需要投入大量的人力物力,并且重新开发的代码可能具有更多的漏洞,这就增加了系统出错的风险。

  1. 提高开发效率
  2. 提高代码规范性和可维护性
框架优势

相比于使用JSP+Servlet技术进行软件开发,使用框架有以下优势。

  1. 提高哦开发效率:如果采用成熟、稳健的框架,那么一些通用的基础工作,如是务处理、安全性、数据流控制等都可以交给框架处理,程序员只需要集中精力完成系统的业务逻辑设计,降低了开发难度。
  2. 提高代码规范性和可维护性:当多人协同进行开发时,代码的规范性和可维护性就变得非常重要。成熟的框架都有严格的代码规范,能保证团队整体的开发风格统一。
  3. 提高软件性能:使用框架进行软件开发,可以减少程序中冗余代码。例如,使用Spring框架开发时,通过Spring的IOC特性,可以将对象之间的依赖关系交给Spring控制,方便解耦,简化开发;使用MyBatis框架开发时,MyBatis提供了XML标签,支持动态的SQL,开发人员无需在类中编写大量的SQL语句,只需要在配置文件中进行配置即可。

1.1.3 当前主流框架

Spring框架

Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的,其主要优势之一就是分层框架。Spring提供了更完整的开发环境,可以为**POJO(Plain Ordinary Java Object,普通Java对象)**对象提供企业级的服务。

Spring MVC框架

Spring MVC是一个Web开发框架,可以将它理解为Servlet。在MVC模式中,Spring MVC作为**控制器(Controller)**用于实现模型与视图的数据交互,是结构最清晰的。

Spring MVC框架采用松耦合、可插拔的组件结构,具有高度可配置性,与其他的MVC框架相比,具有更强的扩展性和灵活性

MyBatis框架

MyBatisApache的一个开源项目iBatis,2010年这个项目由Apache Software Foundation迁移到了GoogleCode,并且改名为MyBatis,2013年11月MyBatis又被迁移到了Github。

MyBatis是一个优秀的持久层框架,它可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM(Object/Relation Mapping,及对象关系映射)实现。Mybatis封装性要低于Hibernate,但他能优越、简单易学,在互联网应用的开发中被广泛使用。

Spring Boot框架

Spring Boot框架是Pivotal团队基于Spring开发的全新框架,其设计初衷是为了简化Spring的配置,使用户能够构建独立运行的程序,提高开发效率。

Spring Boot框架本身并不提供Spring框架的核心特性及扩展功能,它只是用于快速、敏捷地开发新一代基于Spring框架的应用,同时它还集成了大量的第三方类库(如Jackson、JDBC、Redis等),使用户只需少量配置就能完成相应功能。

Spring Cloud 框架

Spring Cloud 是一系列框架的有序集合,为开发人员构建微服务架构提供了完整的解决方案,它利用Spring Boot的开发便利性巧妙地简化了分布式系统的开发。例如,配置管理、服务发现、控制总线等操作,都可以使用Spring Boot做到一键启动和部署。可以说,SpringCloud将Spring Boot框架进行了再封装,屏蔽掉了复杂的配置和实现原理,具有简单易懂、易部署和易维护等特点。

1.2 Mybatis介绍

1.2.1 传统JDBC的劣势

JDBC的劣势

JDBC是Java程序实现数据访问的基础,JDBC的劣势主要有以下几个方面。

(1)数据库连接创建、释放频繁会造成系统资源浪费,从而影响系统性能

(2)SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中SQL变化的可能性较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反开闭原则

(3)用PreparedStatement向占有位符号传参数存在硬编码,因为SQL语句的where条件不一定,可能多页可能少,修改SQL需要修改代码,造成系统不宜维护。

(4)JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化造成系统不易维护。

MyBatis概述

什么是MyBatis

MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,使用简单的XML或注解进行了配置和原始映射,将接口和Java的POJO映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

ORM框架工作原理

MyBatis是一个ORM(Object/Relation Mapping,及对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。

请添加图片描述

解决JDBC编程劣势

针对JDBC编程劣势,MyBatis提供了以下解决方案,具体如下

  • 问题一: 数据库连接创建、释放频繁会造成系统资源浪费,从而影响系统性能

解决方案:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。

  • 问题二:SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中SQL变化的可能性较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反开闭原则

解决方案:MyBatis将SQL语句配置在MyBatis的映射文件中,实现了与Java代码的分离。

  • 问题三:用PreparedStatement向占有位符号传参数存在硬编码,因为SQL语句的where条件不一定,可能多页可能少,修改SQL需要修改代码,造成系统不宜维护。

解决方案:MyBatis自动将Java对象映射至SQL语句,通过Statement中的parameterType定义输入参数的类型。

  • 问题四:JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化造成系统不易维护。

解决方案:MyBatis自动将SQL执行结果映射至Java对象,通过Statement中的resultType定义输出结果的类型。

1.3 MyBatis环境搭建

MyBatis环境搭建的步骤

使用MyBatis框架进行数据库开发之前,需要先搭建MyBatis环境,MyBatis环境搭建主要有如下基本步骤

  1. 创建工程;

    (1)启动IntelliJ IDEA开发工具,单击工具栏中的 文件(File) ->新建(new)->项目(Project)选项,弹出新建项目(New Project)对话框。

    (2)在新建项目(New Project)对话框中,输入项目名称,然后单击构建系统菜单中的”Maven“选项,JDK版本使用IDEA默认版本即可。

    (3)点开高级设置,可以填写组ID(GroupId)、工件ID(ArtifactId)。其中组ID通常设置为公司倒置的网络域名,”org.examelp“(默认);工件ID通常设置为项目名。填写完成之后单击创建(Create)按钮完成项目创建。

在这里插入图片描述

  1. 引入相关依赖:由于本项目要连接数据库以及对程序进行测试,所以需要在项目的pom.xml文件中导入MySQL驱动包Junit测试包、MyBatis的核心等相关依赖。

首次引入依赖需要联网

IDEA默认集成的Maven,所以在第一次引入依赖时,需要在联网状态下进行,且引入依赖需要较长时间,耐心等待依赖引入完成即可。

  1. 数据库准备:在MySQL中创建一个名称为mybatis的数据库,具体语句如下。
    create database mybatis;
    
  2. 编写数据库连接信息配置文件:在项目的src/main/resources目录下创建数据库连接的配置文件,这里将其命名为db.properties,在该文件中配置数据库连接的参数。
    mysql.driver=com.mysql.cj.jdbc.Driver
    mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=true&useSSL=false
    mysql.username=root
    mysql.password=root
    
  3. 编写核心配置文件和映射文件:在项目的src/main/resources目录下创建MyBatis的核心配置文件,该文件主要用于项目的环境配置,如数据库连接相关配置等。核心配置文件可以随意命名,但通常将其命名为mybaties-config.xml。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!--引入外部db.properties-->
        <properties resource="db.properties"/>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${mysql.driver}"/>
                    <property name="url" value="${mysql.url}"/>
                    <property name="username" value="${mysql.username}"/>
                    <property name="password" value="${mysql.password}"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="org/mybatis/example/BlogMapper.xml"/>
        </mappers>
    </configuration>
    

1.4 MyBatis入门程序

  1. 数据准备:在mybatis数据库中创建users表,并在user表中插入几条数据。

    use mybatis;
    create table users (
        id int primary key auto_increment,
        username varchar(20) not null,
        age int not null
    );
    insert into users value (null, '张三', 20),
        (null, '李四', 18);
    
  2. 创建POJO实体:在项目的src/main/java目标下创建org.example.pojo包,在org.example.pojo包下创建User类,该类用于封装User对象的属性。

    package org.example.pojo;
    
    public class User {
        private int id; // 用户id
        private String username; // 用户姓名
        private int age; // 用户年龄
        @Override
        public String toString() {
            return "User [id: " + id + ", username: " + username + ", age: " + age + "]";
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
  3. 创建映射文件UserMapper.xml:在创建的src/main/resources目录下创建一个文件夹,在mapper下创建映射文件UserMapper.xml,该文件主要用于实现SQL语句和Java对象之间的映射,使SQL语句查询出来的关系型数据能够被封装成Java对象。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.example.pojo.User">
        <!--id= "接口中的的方法名" parameterType= "传入的参数类型" resultType= "返回实体类对象,使用包.类名"-->
        <select id="findById" parameterType="int" resultType="org.example.pojo.User">
            select * from users where id = #{id}
        </select>
    </mapper>
    

一个项目多个配置文件

如果一个项目有多个映射文件,则mybatis-config.xml核心配置文件中需要在元素下配置多个元素指定映射文件的路径。

<mappers>
  <!--配置xxxMapper.xml文件的位置-->
  <mapper resource="mapper/UserMapper.xml"/>
</mappers>
  1. 编写测试类:在项目的src/test/java目录下创建Test包,在Test包下创建UserTest类,该类主要用于程序测试。
    package org.example.pojo;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class UserTest {
        @Test
        public void findById() throws IOException {
            // 1. 获取核心配置文件
            InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
            // 2. 创建sqlSessionFactory工厂对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    
            // 3. 创建sqlSession对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            User user = sqlSession.selectOne("org.example.pojo.User.findById", 1);
            System.out.println(user);
            // 5. 释放资源
            sqlSession.close();
        }
    }
    
    

1.5MyBatis工作原理

MyBaits工作原理图在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-雨后天晴-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值