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

概述

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是如何工作的。


学习更多JAVA知识与技巧,关注与私信博主(学习)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值