mybatis工作原理简介

一、前言

本例没有引入spring框架。

简单介绍了mybatis查询数据库数据的流程。

 

二、准备工作

1,安装数据库

此处安装mysql,官网下载“社区版”,过程百度。

 2,安装可视化工具

此处安装sqlyog,官网下载“社区版”,过程百度。

3,创建maven项目,引入mybatis

a,idea上,New -> Project -> 语言选java,构建系统选maven;

b,pom.xml添加依赖

    <dependencies>
        <!-- mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.0</version>
        </dependency>

        <!-- MySQL数据库依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    </dependencies>

4,测试代码

4.1,数据库数据

创建数据库database_2024,创建表u_user,插入一条数据。

CREATE DATABASE database_2024; 
CREATE TABLE `database_2024`.`u_user` ( `id` BIGINT(10) NOT NULL COMMENT '主键,用户id', `username` VARCHAR(100) COMMENT '用户名称', `phone` VARCHAR(30) COMMENT '电话号码', `province` VARCHAR(50) COMMENT '所在省份', PRIMARY KEY (`id`) ); 
INSERT INTO `database_2024`.`u_user` (`id`, `username`, `phone`, `province`) VALUES ('1', '张三', '13331331333', '江苏'); 

4.2,mybatis配置文件

resources目录下创建配置文件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>
<environments default="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://localhost:3306/database_2024?useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

<mappers>
<mapper resource="mapperxml/UserMapper.xml"/>
</mappers>
</configuration>

4.3,实体类

java目录下创建entity包,entity包下创建实体类User.java。

/**
 * 使用lombok的注解可以省去getter、setter代码的编写,pom.xml中引入依赖<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version></dependency>。
 * 否则代码里加上getter、setter代码。
 */
@Data
public class User {
    private Long id;
    private String username;
    private String phone;
    private String province;
}

4.4,数据库接口类

java目录下创建dao包,dao包下创建接口UserDao。

public interface UserDao {
    List<User> listUsers();
}

4.5,映射文件

resources目录下创建目录mapperxml,mapperxml目录下创建映射文件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="dao.UserDao">
    <select id="listUsers" resultType="entity.User">
        select * from u_user;
    </select>
</mapper>

4.6,测试代码

    public static void main(String[] args) throws IOException {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.建造SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession创建Dao的代理对象
        UserDao userDao = session.getMapper(UserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.listUsers();
        for (User user : users) {
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }

 

三、原理介绍

1,SqlSessionFactory

用于生成SqlSession。

工厂模式,目的是为了解决新产品的制造问题,方法是通过新建工厂来完成新产品的制造。代码中,工厂制造产品的主流程不变,只是将工厂指向新建的工厂,产品自然变成了新的产品,通过添加一些新类即可实现。

 

2,SqlSessionFactoryBuilder

用于生成SqlSessionFactory。

建造者模式,主角是建造者,他隐藏了建造的细节,提供了参数界面。代码中,你只需要在界面上输入参数,他便能建造相应的东西。

 

3,原理介绍

3.1,概述

用户(main方法)在建造者(SqlSessionFactoryBuilder)的界面输入关键参数(SqlMapConfig.xml),建造者(SqlSessionFactoryBuilder)因此建造了一座相应的工厂(DefaultSqlSessionFactory);

这座工厂(DefaultSqlSessionFactory)可以生产产品(DefaultSqlSession);

这个产品(DefaultSqlSession)的功能是代理数据库接口(dao包下的那些接口),并按照自己的方式(要求预先编写和java接口对应的xml映射文件即mapperxml目录下的那些文件)实现对数据库的增删改查等等操作。

 

3.2,jdk动态代理

 

 如上图所示,jdk动态代理的使用方式如下

public class jdk动态代理 implements InvocationHandler {
    public Object 数据库接口;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        重新定制数据库接口的方法实现
    }
}

// 使用方式
数据库接口对象 ——> Proxy.newProxyInstance(数据库接口的类加载器, 数据库接口的类对象数组, jdk动态代理对象);
数据库接口对象.执行方法;

实际操作

最终数据库接口对象执行方法,实际内部是jdk的动态代理对象执行了方法。

a,根据入参构建sql;

b,使用jdbc链接数据库,执行sql,获取数据;

c,将数据库的数据映射到java对象。

 

三、总结

mybatis可以将程序员编写的所有数据库接口都交给jdk动态代理对象处理,jdk动态代理对象又能将他们和sql语句一一对应,还能将查询结果都返回给他们。这样sql语句可以集中在一个文件中,显得优美一点。jdk动态代理对象还能为他们添加点附加功能,如线程池、缓存、拦截器等。

 

posted @ 2024-03-19 18:02  seeAll  阅读(4)  评论(0编辑  收藏  举报