美文网首页
MyBatis源码阅读(一)----开始熟悉MyBatis

MyBatis源码阅读(一)----开始熟悉MyBatis

作者: singleZhang2010 | 来源:发表于2020-12-29 15:01 被阅读0次

    概述

    MyBatis,相信大家在项目中应该都接触过,轻量级ORM框架。名词解释参考百度、bing等。

    传统数据库操作

    我们在没使用ORM框架的时候,是如何做数据库连接和操作的呢?下面以一个基于SpringBoot的Demo项目演示一下:
    ※sql文件使用之前SpringBoot系列文章中的Demo数据库。

    1. 在pom.xml里加入mysql依赖
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
    1. 创建model类SysAdminUser
    public class SysAdminUser {
        private Integer adminUserId;
        private String userName;
        private String email;
        private String nickName;
        private Integer deptId;
        //...省略getter setter
    }
    
    1. 测试数据库连接和操作,创建启Chapter1DemoApplication.java
    package com.zhlab.mybatisdemo.chapter1;
    
    import com.zhlab.mybatisdemo.web.entity.SysAdminUser;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @ClassName Chapter1DemoApplication
     * @Description //Chapter1DemoApplication
     * @Author singleZhang
     * @Email 405780096@qq.com
     * @Date 2020/12/29 0029 上午 10:15
     **/
    @SpringBootApplication
    public class Chapter1DemoApplication {
        public static void main(String[] args) throws Exception {
            /*
            * 存储持久化数据常常会用到数据库
            * 传统数据库操作:
            * 加载驱动程序包
            * 与数据库建立连接
            * 拼装和执行 SQL语句
            * 获取数据库结果,数据转化操作
            * 关闭连接
            * */
            String url = "jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=UTC";
            String userName = "root";
            String password = "root";
    
            SysAdminUser userParam = new SysAdminUser();
            userParam.setDeptId(5);
    
            // 第一步:加载驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");
    
            // 第二步:获得数据库的连接
            Connection conn = DriverManager.getConnection(url, userName, password);
    
            // 第三步:创建语句并执行
            Statement stmt = conn.createStatement();
            ResultSet resultSet = stmt.executeQuery("SELECT * FROM `sys_admin_user` WHERE dept_id = " + userParam.getDeptId() + ";");
    
            // 第四步:处理数据库操作结果
            List<SysAdminUser> userList = new ArrayList<>();
            while(resultSet.next()){
                SysAdminUser user = new SysAdminUser();
                user.setAdminUserId(resultSet.getInt("admin_user_id"));
                user.setUserName(resultSet.getString("user_name"));
                user.setEmail(resultSet.getString("email"));
                user.setNickName(resultSet.getString("nick_name"));
                user.setDeptId(resultSet.getInt("dept_id"));
                userList.add(user);
            }
    
            // 第五步:关闭连接
            stmt.close();
    
            for (SysAdminUser user : userList) {
                System.out.println("userName : " + user.getUserName() + " ;  email : " + user.getEmail());
            }
        }
    }
    
    

    如上,传统的数据库操作步骤繁琐,而且容易让业务代码变得复杂不易维护,如果遇到业务复杂的场景,对SQL的维护更有难度,ORM框架就是为解决上述问题而产生的,MyBatis是一款轻量优秀的ORM框架。

    MyBatis

    MyBatis的使用非常灵活,支持多种配置方式

    • 完全代码配置
    • 基于 XML的配置
    • 基于外部框架配置,如Spring、SpringBoot(在之前的使用过程中,我们就使用过MybatisConfig.java代码配置)

    接下来就在SpringBoot的项目中使用MyBatis

    1. 在pom.xml中加入依赖
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.0</version>
            </dependency>
    

    ※mybatis-spring-boot-starter,可以观察到里边包含了:mybatis、mybatis-spring、mybatis-spring-boot-autoconfigure等包,有兴趣的同学可以在项目里查看。

    mybatis3.5目录

    image.png
    我们可以看到加载进来的mybatis版本是3.5的,我们在pom文件中并没有指定mybatis版本。这是因为,在mybatis-spring-boot-starter的pom文件里,它的parent依赖是:mybatis-spring-boot-starter,在进入看,可以看到它已经指定了mybatis的版本:
      <properties>
        <mybatis.version>3.5.2</mybatis.version>
        <mybatis-spring.version>2.0.2</mybatis-spring.version>
        <mybatis-freemarker.version>1.2.0</mybatis-freemarker.version>
        <mybatis-velocity.version>2.1.0</mybatis-velocity.version>
        <mybatis-thymeleaf.version>1.0.1</mybatis-thymeleaf.version>
        <spring-boot.version>2.1.6.RELEASE</spring-boot.version>
      </properties>
    
    1. 修改application.properties文件
    server.port=8081
    
    #database
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=root
    
    1. 创建com.zhlab.mybatisdemo.chapter2包,并创建Chapter2DemoApplication、MainController、SysAdminUserMapper三个类,如下:
      Chapter2DemoApplication.java
    package com.zhlab.mybatisdemo.chapter2;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @ClassName Chapter2DemoApplication
     * @Description //Chapter2DemoApplication
     * @Author singleZhang
     * @Email 405780096@qq.com
     * @Date 2020/12/29 0029 上午 10:15
     **/
    @SpringBootApplication
    public class Chapter2DemoApplication {
        public static void main(String[] args){
            SpringApplication.run(Chapter2DemoApplication.class,args);
            System.out.println("http://localhost:8081 this demo is running");
        }
    }
    

    MainController.java

    package com.zhlab.mybatisdemo.chapter2;
    
    import com.zhlab.mybatisdemo.web.entity.SysAdminUser;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("/")
    public class MainController {
    
        @Autowired
        private SysAdminUserMapper sysAdminUserMapper;
    
        @RequestMapping("/list")
        public Object list() {
            SysAdminUser userParam = new SysAdminUser();
            userParam.setDeptId(5);
            List<SysAdminUser> userList = sysAdminUserMapper.getUserList(userParam);
            for (SysAdminUser user : userList) {
                System.out.println("name : " + user.getNickName() + " ;  email : " + user.getEmail());
            }
            return userList;
        }
    }
    
    

    SysAdminUserMapper.java

    package com.zhlab.mybatisdemo.chapter2;
    
    import com.zhlab.mybatisdemo.web.entity.SysAdminUser;
    import org.apache.ibatis.annotations.Mapper;
    
    import java.util.List;
    
    @Mapper
    public interface SysAdminUserMapper {
    
        List<SysAdminUser> getUserList(SysAdminUser user);
    }
    
    
    1. 在resource下创建文件夹:com/zhlab/mybatisdemo/chapter2,并创建对应mapper的SysAdminUserMapper.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.zhlab.mybatisdemo.chapter2.SysAdminUserMapper">
    
        <resultMap id="BaseResultMap" type="com.zhlab.mybatisdemo.web.entity.SysAdminUser">
            <id column="admin_user_id" jdbcType="INTEGER" property="adminUserId" />
            <result column="user_name" jdbcType="VARCHAR" property="userName" />
            <result column="nick_name" jdbcType="VARCHAR" property="nickName" />
            <result column="email" jdbcType="VARCHAR" property="email" />
            <result column="dept_id" jdbcType="INTEGER" property="deptId" />
        </resultMap>
    
        <select id="getUserList" resultMap="BaseResultMap">
            SELECT * FROM `sys_admin_user`
            <if test="deptId != null">
                WHERE dept_id = #{deptId}
            </if>
         </select>
    </mapper>
    

    5.启动chapter2项目,并访问


    启动chapter2

    访问结果


    userList

    ※以上是最简单的demo,跟之前的项目里有所不同的是没有任何配置,都是默认的。

    分析

    通过chapter1和chapter2对比,可以看到在获取用户列表对象的时候
    mybatis只用一个Mapper接口里的方法就可以了

    List<SysAdminUser> getUserList(SysAdminUser user);
    

    而用JDBC操作数据库的话则需要多个步骤查询数据库,遍历返回结果并组装成列表对象

    //...前面省略
            // 第三步:创建语句并执行
            Statement stmt = conn.createStatement();
            ResultSet resultSet = stmt.executeQuery("SELECT * FROM `sys_admin_user` WHERE dept_id = " + userParam.getDeptId() + ";");
    
            // 第四步:处理数据库操作结果
            List<SysAdminUser> userList = new ArrayList<>();
            while(resultSet.next()){
                SysAdminUser user = new SysAdminUser();
                user.setAdminUserId(resultSet.getInt("admin_user_id"));
                user.setUserName(resultSet.getString("user_name"));
                user.setEmail(resultSet.getString("email"));
                user.setNickName(resultSet.getString("nick_name"));
                user.setDeptId(resultSet.getInt("dept_id"));
                userList.add(user);
            }
    
            // 第五步:关闭连接
            stmt.close();
    //....后面省略
    

    其中的映射关系如下图所示:

    映射关系
    • 映射文件中的 SQL语句与映射接口中的抽象方法建立了映射
    • SQL 语句的输入参数与方法输入参数建立了映射
    • SQL语句的输出结果与方法结果建立了映射

    总结

    可以看出MyBatis的核心功能就是映射各类关系,在接下来的源码阅读中,就要围绕它的核心功能,阅读相关代码,理解MyBatis是如何工作的。

    相关文章

      网友评论

          本文标题:MyBatis源码阅读(一)----开始熟悉MyBatis

          本文链接:https://www.haomeiwen.com/subject/yzxtoktx.html