mybatis的mapper生成原理

mybatis的mapper生成原理,第1张

mybatis的mapper生成原理

实现一个最简单的MyBatis
  • MyBatis是什么
  • 思考一下,我们怎么用在Spring中使用mybatis这个框架的
    • SqlSessionFactoryBean
    • 你写的接口
    • MapperFactoryBean 重点
      • mybatis 动态代理 接口编程
        • 怎么实现?
  • 搞定
  • sqlSessionFactory呢?

MyBatis是什么

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

思考一下,我们怎么用在Spring中使用mybatis这个框架的 SqlSessionFactoryBean
//首先是不是有一个SqlSessionFactoryBean
//这个就是Mybatis创建SQL连接的一个工厂

	//在SqlSessionFactoryBean中定义一个数据源
  
  // 配置mybatis
   

你写的接口
public interface UserMapper {
  @Select("SELECT * FROM users WHERe id = #{userId}")
  User getUser(@Param("userId") String userId);
}
MapperFactoryBean 重点
//把链接和你的接口放到一个类中再找到 配置文件 执行创建一个可以使用的bean
//原理是动态代理

   //你写的mapper接口
  
  //sqlSessionFactoryBean对象
  

mybatis 动态代理 接口编程

userMapperz这个bean是不是一个org.mybatis.spring.mapper.MapperFactoryBean类
为什么这个类可以注入到我们创建的对象类型中
看属性 mapperInterface 指定的是你的接口


怎么实现?

首先创建一个interface

public interface UserDao {
    public void insert();
    public void select();
    public void query();
    public void upate();
}

再有一个代理类对象

//实现InvocationHandler 接口 重写 invoker方法
public class DaoTemplate implements InvocationHandler {
    public static Object newInstance(Class[] interfaces) {
    	//使用JDK的动态代理创建代理对象
        return Proxy.newProxyInstance(DaoTemplate.class.getClassLoader(),
                interfaces, new DaoTemplate());
    }
	
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String methodName = method.getName();
        System.out.println("调用的方法名称为:"+methodName);
        Class returnType = method.getReturnType();
        System.out.println("返回的类型为"+returnType.getName());

        if ("select".equals(methodName)) {
            this.getClass().getMethod("select");
        } else if ("update".equals(methodName)) {
            this.getClass().getMethod("update");
        } else if ("insert".equals(methodName)) {
            this.getClass().getMethod("insert");
        } else if ("query".equals(methodName)) {
            this.getClass().getMethod("query");
        }


        return null;
    }

    public void select(){
        System.out.println("执行了select");
    }

    public void query(){
        System.out.println("执行了query");
    }

    public void delect(){
        System.out.println("执行力delect");
    }

    public void insert(){
        System.out.println("执行了insert");
    }

}


搞定

public class MyBatisTest {
    public static void main(String[] args) {
        UserDao userDao = (UserDao) DaoTemplate.newInstance(new Class[]{UserDao.class});
        userDao.insert();
        userDao.query();
        userDao.select();
        userDao.upate();
    }
}

sqlSessionFactory呢?

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4996725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存