MyBatis使用与实现原理

Mybatis的创建与使用

创建Mybatis开发环境

创建maven工程

创建 mybatis01 的工程,工程信息如下:

Groupid:com.zzy

ArtifactId:mybatis01 

Packing:jar

添加 Mybatis3.4.5 的坐标

 <dependencies> 
	 <dependency> 
		<groupId>org.mybatis</groupId> 
		<artifactId>mybatis</artifactId> 
		<version>3.4.5</version> 
	</dependency> 
 	<dependency>
		<groupId>junit</groupId> 
		<artifactId>junit</artifactId> 
		<version>4.10</version> 
		<scope>test</scope> 
	 </dependency> 
 	<dependency> 
		<groupId>mysql</groupId> 
		<artifactId>mysql-connector-java</artifactId> 
		<version>5.1.6</version> 
		<scope>runtime</scope> 
 	</dependency> 
 	<dependency> 
		<groupId>log4j</groupId> 
		<artifactId>log4j</artifactId> 
		<version>1.2.12</version> 
 	</dependency> 
</dependencies>

编写 User 实体类

package com.itheima.domain;

import java.io.Serializable;
import java.util.Date;


public class User implements Serializable{

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

编写持久层接口 IUserDao

IUserDao 接口就是我们的持久层接口(也可以写成 UserDao 或者 UserMapper),具体代码如下:
/**
 * 用户的持久层接口
 */
public interface IUserDao {

    /**
     * 查询所有操作
     * @return
     */
    List<User> findAll();
}

编写持久层接口的映射文件 IUserDao.xml

要求:

  • **创建位置:**必须和持久层接口在相同的包中。
  • **名称:**必须以持久层接口名称命名文件名,扩展名是.xml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IyEx4xRS-1581929627700)(C:\Users\Administrator\Desktop\2.jpg)]

编写 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">
<!-- mybatis的主配置文件 -->
<configuration>
    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
    <mappers>
        <mapper resource="com/itheima/dao/IUserDao.xml"/>
    </mappers>
</configuration>

编写测试类

public class MybatisTest {

    /**
     * 利用mybatis查询所有的测试类
     * @param args
     */
    public static void main(String[] args)throws Exception {
        //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接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }
}

基于注解的 mybatis 使用

在持久层接口中添加注解

/**
 * 用户的持久层接口
 */
public interface IUserDao {

    /**
     * 查询所有操作
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}

修改SqlMapConfig.xml

<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
        如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名
    -->
    <mappers>
        <mapper class="com.itheima.dao.IUserDao"/>
    </mappers>

Mybatis的分析

在这里插入图片描述

查询所有的分析

在这里插入图片描述

自定义Mybatis框架

自定义mybatis的分析

在这里插入图片描述

自定义mybatis实现

基于 XML 的自定义 mybatis 框架

编写持久层接口和 IUserDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.itheima.dao.IUserDao">
    <!--配置查询所有-->
    <select id="findAll" resultType="com.itheima.domain.User">
        select * from user
    </select>
</mapper>

编写构建者类

package com.itheima.mybatis.sqlsession;

import java.io.InputStream;

/**
 *  用于创建一个SqlSessionFactory对象
 */
public class SqlSessionFactoryBuilder {

    /**
     * 根据参数的字节输入流来构建一个SqlSessionFactory工厂
     * @param config
     * @return
     */
    public SqlSessionFactory build(InputStream config){
        return null;
    }
}

编写 SqlSessionFactory 接口和实现类

package com.itheima.mybatis.sqlsession;

public interface SqlSessionFactory {

    /**
     * 用于打开一个新的SqlSession对象
     * @return
     */
    SqlSession openSession();
}

/**
* 
* <p>Title: DefaultSqlSessionFactory</p>
* <p>Description:SqlSessionFactory 的默认实现 </p>
* <p>Company: http://www.itheima.com/ </p>
*/
public class DefaultSqlSessionFactory implements SqlSessionFactory {
	private InputStream config = null;
	public void setConfig(InputStream config) {
		this.config = config; 
	}
	@Override
	public SqlSession openSession() {
		DefaultSqlSession session = new DefaultSqlSession();
		//调用工具类解析 xml 文件
		XMLConfigBuilder.loadConfiguration(session, config);
		return session; 
	} 
}

编写用于创建 Dao 接口代理对象的类

public class MapperProxy implements InvocationHandler {

    //map的key是全限定类名+方法名
    private Map<String,Mapper> mappers;
    private Connection conn;

    public MapperProxy(Map<String,Mapper> mappers,Connection conn){
        this.mappers = mappers;
        this.conn = conn;
    }

    /**
     * 用于对方法进行增强的,我们的增强其实就是调用selectList方法
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //1.获取方法名
        String methodName = method.getName();
        //2.获取方法所在类的名称
        String className = method.getDeclaringClass().getName();
        //3.组合key
        String key = className+"."+methodName;
        //4.获取mappers中的Mapper对象
        Mapper mapper = mappers.get(key);
        //5.判断是否有mapper
        if(mapper == null){
            throw new IllegalArgumentException("传入的参数有误");
        }
        //6.调用工具类执行查询所有
        return new Executor().selectList(mapper,conn);
    }
}

运行测试类

public class MybatisTest {

    /**
     * 入门案例
     * @param args
     */
    public static void main(String[] args)throws Exception {
        //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接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }
}

基于注解方式定义 Mybatis 框架

自定义@Select注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Select {
	String value();
}

修改持久层接口

public interface IUserDao {
	/**
	* 查询所有用户
	* @return
	*/
	@Select("select * from user")
	List<User> findAll();
}

修改 SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- mybatis的主配置文件 -->
<configuration>
    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
    <mappers>
        <!--<mapper resource="com/itheima/dao/IUserDao.xml"/>-->
        <mapper class="com.itheima.dao.IUserDao"/>
    </mappers>
</configuration>

lue=“jdbc:mysql://localhost:3306/eesy_mybatis”/>




<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
    <!--<mapper resource="com/itheima/dao/IUserDao.xml"/>-->
    <mapper class="com.itheima.dao.IUserDao"/>
</mappers>
```
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis 是一款优秀的持久层框架,其底层实现原理主要包括两个核心组件:SqlSessionFactory 和 SqlSession。 1. SqlSessionFactory:SqlSessionFactory 是 MyBatis 的核心接口,负责创建 SqlSession 对象。它的实现类 DefaultSqlSessionFactory 在初始化过程中主要完成以下几个步骤: - 解析配置文件:读取并解析 MyBatis 的配置文件,包括数据库连接信息、映射文件等。 - 创建 Configuration 对象:将解析得到的配置信息封装到 Configuration 对象中,包括数据库连接池、缓存配置、事务管理等。 - 创建环境对象:根据配置文件中的环境配置创建 Environment 对象,包括事务管理器、数据源等。 - 创建 SqlSessionFactory 对象:通过 Configuration 对象和 Environment 对象创建 SqlSessionFactory。 2. SqlSession:SqlSession 是 MyBatis 的核心接口,用于与数据库进行交互。它的实现类 DefaultSqlSession 主要实现了以下功能: - 封装了对数据库的操作:通过 SqlSession 提供的方法,可以执行 SQL 语句并返回结果。 - 提供了事务管理功能:SqlSession 可以开启、提交或回滚事务。 - 实现了一级缓存:SqlSession 内部维护了一个本地缓存,用于提高查询性能。 - 根据 Mapper 接口生成代理对象:SqlSession 根据 Mapper 接口的定义,动态生成 Mapper 接口的代理对象,简化了开发流程。 总体来说,MyBatis 的底层实现原理主要是通过 SqlSessionFactory 创建 SqlSession 对象,然后通过 SqlSession 进行与数据库的交互,并提供了缓存和事务管理功能。同时,MyBatis 还支持使用注解或 XML 配置文件来进行 SQL 映射。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一切如来心秘密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值