手动模拟MyBatis入门案例的底层实现:

需要了解的关键技术:

java反射、动态代理(comming soon)

一、Mybatis入门案例

点击此处跳过入门案例


首先看一下MyBatis最基础的入门案例

目标:读取数据库名为mybatis中的user表内容



maven依赖

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

Mybatis入门案例的两个配置文件:1.SqlMapConfig.xml 2.IUserDao.xml

1.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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="club/leyvan/dao/IUserDao.xml"/>
</mappers>
</configuration>

2.IUserDao.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="club.leyvan.dao.IUserDao">
<select id="findAll" resultType="club.leyvan.domain.User">
select * from user
</select>
</mapper>

实体类

package club.leyvan.domain;

import java.util.Date;

/**
* @Auther: http://www.leyvan.club
* @Date: 2019/12/13
* @Description: club.leyvan.domain
* @version: 1.0
*/
public class User {
/**
* `id` int(11) NOT NULL AUTO_INCREMENT,
* `username` varchar(32) NOT NULL COMMENT '用户名称',
* `birthday` date DEFAULT NULL COMMENT '生日',
* `sex` char(1) DEFAULT NULL COMMENT '性别',
* `address` varchar(256) DEFAULT NULL COMMENT '地址',
*/
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 + '\'' +
'}';
}
}

Dao层接口

package club.leyvan.dao;

import club.leyvan.domain.User;

import java.util.List;

/**
* @Auther: http://www.leyvan.club
* @Date: 2019/12/13
* @Description: club.leyvan.dao
* @version: 1.0
*/
public interface IUserDao { public List<User> findAll(); }

测试类

package club.leyvan.test;

import club.leyvan.dao.IUserDao;
import club.leyvan.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream;
import java.util.List; /**
* @Auther: http://www.leyvan.club
* @Date: 2019/12/13
* @Description: club.leyvan.test
* @version: 1.0
*/
public class Demo { public static void main(String[] args) {
try{
//加载配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//构造者模式创建工厂建造者
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//工厂模式创建session
SqlSession session = factory.openSession();
//通过动态代理创建代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
List<User> list = userDao.findAll();
for (User user: list) {
System.out.println(user);
}
session.close();
in.close();
}catch (Exception e){
e.printStackTrace();
} } }

输出结果

User{id=1, username='王五', birthday=null, sex='2', address='null'}
User{id=10, username='张三', birthday=Thu Jul 10 00:00:00 CST 2014, sex='1', address='北京市'}
User{id=16, username='张小明', birthday=null, sex='1', address='河南郑州'}
User{id=22, username='陈小明', birthday=null, sex='1', address='河南郑州'}
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
User{id=25, username='陈小明', birthday=null, sex='1', address='河南郑州'}
User{id=26, username='王五', birthday=null, sex='null', address='null'}

二、模拟Mybatis实现上面的入门案例

将maven的依赖删除以后,手动模拟实现上面的入门案例:

[分析]



代码实现在GITHUB

结果:

使用的是XML
User{id=1, username='王五', birthday=null, sex='2', address='null'}
User{id=10, username='张三', birthday=2014-07-10, sex='1', address='北京市'}
User{id=16, username='张小明', birthday=null, sex='1', address='河南郑州'}
User{id=22, username='陈小明', birthday=null, sex='1', address='河南郑州'}
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
User{id=25, username='陈小明', birthday=null, sex='1', address='河南郑州'}
User{id=26, username='王五', birthday=null, sex='null', address='null'}
使用的是注解
User{id=1, username='王五', birthday=null, sex='2', address='null'}
User{id=10, username='张三', birthday=2014-07-10, sex='1', address='北京市'}
User{id=16, username='张小明', birthday=null, sex='1', address='河南郑州'}
User{id=22, username='陈小明', birthday=null, sex='1', address='河南郑州'}
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
User{id=25, username='陈小明', birthday=null, sex='1', address='河南郑州'}
User{id=26, username='王五', birthday=null, sex='null', address='null'}

手撸MyBatis从配置文件到读出数据库的模拟实现的更多相关文章

  1. 《Mybatis 手撸专栏》第1章:开篇介绍,我要带你撸 Mybatis 啦!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 1. 为甚,撸Mybatis 我就知道,你会忍不住对它下手! 21年带着粉丝伙伴撸了一遍 Sp ...

  2. 《Mybatis 手撸专栏》第7章:SQL执行器的定义和实现

    作者:小傅哥 博客:https://bugstack.cn - <手写Mybatis系列> 一.前言 为什么,要读框架源码? 因为手里的业务工程代码太拉胯了!通常作为业务研发,所开发出来的 ...

  3. 《Mybatis 手撸专栏》第6章:数据源池化技术实现

    作者:小傅哥 博客:https://bugstack.cn - 手写Mybatis系列文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 码农,只会做不会说? 你有发现吗,其实很大一部分码农 ...

  4. 《Mybatis 手撸专栏》第8章:把反射用到出神入化

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么,读不懂框架源码? 我们都知道作为一个程序员,如果想学习到更深层次的技术,就需 ...

  5. 要想精通Mybatis?从手写Mybatis框架开始吧!

    1.Mybatis组成 动态SQL Config配置 Mapper配置 2.核心源码分析 Configuration源码解析 SqlSessionFactory源码解析 SqlSession源码解析 ...

  6. 手写mybatis框架笔记

    MyBatis 手写MyBatis流程 架构流程图 封装数据 封装到Configuration中 1.封装全局配置文件,包含数据库连接信息和mappers信息 2.封装*mapper.xml映射文件 ...

  7. 手写MyBatis流程

    MyBatis 手写MyBatis流程 架构流程图 封装数据 封装到Configuration中 1.封装全局配置文件,包含数据库连接信息和mappers信息 2.封装*mapper.xml映射文件 ...

  8. C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架

    C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...

  9. 手撸一个SpringBoot-Starter

    1. 简介 通过了解SpringBoot的原理后,我们可以手撸一个spring-boot-starter来加深理解. 1.1 什么是starter spring官网解释 starters是一组方便的依 ...

随机推荐

  1. C# 怎样判断 datagridview 中的checkbox列是否被选中

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e){ for (int i  ...

  2. confessed to doing|conform|confined|entitle|

    to admit that you have done something wrong or something that you feel guilty or bad about 坦白:供认,招认: ...

  3. 二评北科团委:“斩首计划”进行时,其用心也毒

    近日,在同学们和热心群众的共同努力下,各高校相继悬崖勒马,北大马会.北语新新青年.人大新光等进步社团均顺利注册.而北科团委倒行逆施,可谓一枝独秀,对于齐民学社的同学们的诉求,不仅不予以回应,反而采取表 ...

  4. WordPress快速打造个人博客

    前些天用wordpress搭建了现在这个博客,所以总结了一篇文章,讲讲怎么样简单的创建一个博客.开始前这里有篇我搭建时所遇到的问题可以作为参考<WordPress建站注意事项>,首先我们要 ...

  5. gin源码剖析

    介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:https:// ...

  6. 初级string

    标准库string类型 string对象初始化 string s1; string s2(s1); string s3("value"); string s4(n,'c'); st ...

  7. 吴裕雄--天生自然 R语言开发学习:高级数据管理

    #-----------------------------------# # R in Action (2nd ed): Chapter 5 # # Advanced data management ...

  8. 主成分分析(PCA)模型概述

    数据降维 降维是对数据高维度特征的一种预处理方法.降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的.在实际的生产和应用中,降维在一定信息损失范围内,可 ...

  9. webpack在用dev-server的时候怎么配置多入口文件

    类似下面这样就可以了,entry设置为对象 每个入口设置为属性,属性的值是一个数组,就可以像单入口一样往这个数组添加entry: { Profile: [ 'webpack-dev-server/cl ...

  10. AF(操作者框架)系列(3)-创建第一个Actor的程序

    这节课的内容,语言描述基本是无趣的,就是一个纯程序编写,直接上图了. 如果想做其他练习,可参考前面的文章: https://zhuanlan.zhihu.com/p/105133597 1. 新建一个 ...