Mybatis-原生Mybatis原理分析

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语句

<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>

namespace ,是接口类相同

id 是接口类里的方法,

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

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

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

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

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

发布了311 篇原创文章 · 获赞 58 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_30353203/article/details/103577585