Mybatis-原生Mybatis原理分析

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MyBatis框架概述 mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。 mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

MyBatis框架概述

mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。 为了我们能够更好掌握框架运行的内部过程,并且有更好的体验,下面我们将从自定义Mybatis框架开始来学习框架。此时我们将会体验框架从无到有的过程体验,也能够很好的综合前面阶段所学的基础。

本文是Mybatis 使用代理dao的方式实现增删改查的原理

首先编写一个SqlMapConfig.xml

<?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>
 
    <!--配置Mybatis的环境-->
        <environments default="mysql">
        <!--配置mysql环境-->
        <environment id="mysql">
            <!--配置事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源,也就是连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssm? 
                   characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置mybatis映射的位置-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>

在resources目录下 新建一个mappers目录,在然后新建一个UserMapper.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.jd.dao.UserMapper">
 
    <select id="findUser" resultType="com.jd.domain.User">
        select id ,userName as userName,birthday as birthday,sex as sex,
        address as address FROM user where yn=1
    </select>
 
</mapper>

新建一个实体类

@Data
public class User {
    private Integer id;
    private Date birthday;
    private String userName;
    private String sex;
    private String address;
    private Integer yn;
}

创建一个接口类

public interface UserMapper {
    /**
     * 查询所用用户
     */
    public List<User> findUser();
 
}

编写测试类

public class MybatisTest {
 
    @Test
    public void test() throws IOException {
        //1、读取配置文件
        InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
        //2、创建SqlSessionFactory的构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3、使用构建者创建工厂对象SqlSessionFactory
        SqlSessionFactory factory= builder.build(in);
        //4、使用SqlSessionFactory创建SqlSession
        SqlSession session=factory.openSession();
        //5、使用SqlSession创建dao接口的代理对象
        UserMapper userDao =session.getMapper(UserMapper.class);
        //6、使用代理对象执行查询方法
        List<User> list=userDao.findUser();
 
        for (User user:list){
            System.out.println(user);
        }
        //7、释放资源
        session.close();
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
      
}

接下来分析这个查询的过程,这其中使用的构建者设计模式、工厂模式、代理模式

1、 InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml"); 此处使用的是dom4j 解析xml文件,获取驱动 连接 账号 密码 和映射配置文件

2、//2、创建SqlSessionFactory的构建者对象

    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //3、使用构建者创建工厂对象SqlSessionFactory
    SqlSessionFactory factory= builder.build(in);   

此处使用的是构建者设计模式,优势:把对象的创建细节隐藏,使用者直接调用方法即可拿到对象

3、//4、使用SqlSessionFactory创建SqlSession

    SqlSession session=factory.openSession();

此处使用的是工厂设计模式,生产SqlSession使用了工厂设计模式,优势:解耦(降低了类之间的依赖关系)

4、//5、使用SqlSession创建dao接口的代理对象

    UserMapper userDao =session.getMapper(UserMapper.class);

创建dao层的接口实现类使用的是代理设计模式,优势,不修改源码的基础上对已有方法的增强

5、根据之前的配置文件,执行sql语句

<select id="findUser" resultType="com.jd.domain.User">
    select id ,userName as userName,birthday as birthday,sex as sex,
    address as address FROM user where yn=1
</select>

namespace ,是接口类相同

id 是接口类里的方法,

resultType,对返回的结果进行封装

本文章写的是使用代理对象方式,调用接口类的方法,执行sql语句
image.png

接下来总结一下:Mybatis 使用代理dao的方式实现增删改查的原理,无非就是做了两件事

1、解析xml,把数据进行封装

2、创建代理对象,调用selectList方法

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
SQL XML Java
一文搞懂Mybatis执行原理
一文搞懂Mybatis执行原理
24 1
|
2月前
|
Java 数据库连接 mybatis
mybatis 框架分析——mybatis框架使用篇
mybatis 框架分析——mybatis框架使用篇
23 0
|
2月前
|
SQL Java 数据库连接
mybatis常见分页技术和自定义分页原理实战
mybatis常见分页技术和自定义分页原理实战
|
2月前
|
druid Java 数据库连接
SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis
SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis
40 0
|
7天前
|
Java 数据库连接 mybatis
结构性模式之---外观模式、MyBatis中Configuration的外观模式的使用分析
结构性模式之---外观模式、MyBatis中Configuration的外观模式的使用分析
25 1
|
1月前
|
SQL 缓存 Java
mybatis工作原理
mybatis工作原理
77 0
|
2月前
|
SQL Java 数据库连接
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
46 0
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
|
2月前
|
SQL 设计模式 Java
干翻Mybatis源码系列之第十篇:Mybatis拦截器基本开发、基本使用和基本细节分析
干翻Mybatis源码系列之第十篇:Mybatis拦截器基本开发、基本使用和基本细节分析
|
2月前
|
Java 数据库连接 数据安全/隐私保护
MyBatis中的插件分析与开发
MyBatis中的插件分析与开发
27 0
|
2月前
|
XML 缓存 Java
MyBatis原理分析之获取Mapper接口的代理对象
MyBatis原理分析之获取Mapper接口的代理对象
38 0

相关产品

  • 云迁移中心