手撸MyBatis从配置文件到读出数据库的模拟实现
手动模拟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从配置文件到读出数据库的模拟实现的更多相关文章
- 《Mybatis 手撸专栏》第1章:开篇介绍,我要带你撸 Mybatis 啦!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 1. 为甚,撸Mybatis 我就知道,你会忍不住对它下手! 21年带着粉丝伙伴撸了一遍 Sp ...
- 《Mybatis 手撸专栏》第7章:SQL执行器的定义和实现
作者:小傅哥 博客:https://bugstack.cn - <手写Mybatis系列> 一.前言 为什么,要读框架源码? 因为手里的业务工程代码太拉胯了!通常作为业务研发,所开发出来的 ...
- 《Mybatis 手撸专栏》第6章:数据源池化技术实现
作者:小傅哥 博客:https://bugstack.cn - 手写Mybatis系列文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 码农,只会做不会说? 你有发现吗,其实很大一部分码农 ...
- 《Mybatis 手撸专栏》第8章:把反射用到出神入化
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么,读不懂框架源码? 我们都知道作为一个程序员,如果想学习到更深层次的技术,就需 ...
- 要想精通Mybatis?从手写Mybatis框架开始吧!
1.Mybatis组成 动态SQL Config配置 Mapper配置 2.核心源码分析 Configuration源码解析 SqlSessionFactory源码解析 SqlSession源码解析 ...
- 手写mybatis框架笔记
MyBatis 手写MyBatis流程 架构流程图 封装数据 封装到Configuration中 1.封装全局配置文件,包含数据库连接信息和mappers信息 2.封装*mapper.xml映射文件 ...
- 手写MyBatis流程
MyBatis 手写MyBatis流程 架构流程图 封装数据 封装到Configuration中 1.封装全局配置文件,包含数据库连接信息和mappers信息 2.封装*mapper.xml映射文件 ...
- C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架
C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...
- 手撸一个SpringBoot-Starter
1. 简介 通过了解SpringBoot的原理后,我们可以手撸一个spring-boot-starter来加深理解. 1.1 什么是starter spring官网解释 starters是一组方便的依 ...
随机推荐
- keras使用、函数功能
#1. keras.engine.input_layer.Input() def Input(shape=None, batch_shape=None, name=None, dtype=None ...
- django框架进阶-auth认证系统-长期维护
################## django的认证系统 ####################### 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要 ...
- 最大流/最小割模板(isap) POJ1273
isap模板核心代码: //d[]为距离标号数组,d[i]表示节点i到汇点的距离 //gap[]为GAP优化数组,gap[i]表示到汇点距离为i的节点个数 int dfs(int k,int flow ...
- 为Nginx启用目录浏览功能
今天工作需要,要给客户提供一个patch的下载地址,于是想用nginx的目录浏览功能来做,需要让客户看到指定一个目录下的文件列表,然后让他自己来选择该下载那个文件: 我们都知道在apache下可以配置 ...
- PLL到底是个啥么东西呢?
——————————————————更新于20180826———————————————————————————— PLL:完成两个电信号的相位同步的自闭环控制系统叫锁相环.用电压控制延时,用到了VC ...
- echart封装,前端简单路由,图表设置自动化
https://github.com/cclient/EhartDemoSetByAngular 后端node.js 前端插件 echart,jquery,jqueryui,datapicker,an ...
- leetcode第30题:括号生成
这是目前遇到最难的题,刚开始的思路是:匹配words中元素是否在s中,若在找所在元素的后words长度位的字符串,判断words其他元素是否都在s中. 看似这个思路可行,实际上存在的问题: 1.wor ...
- python自动化工具
公司有些业务不断的重复复制和黏贴实在让人头疼,于是乎考虑使用python自动的生成文件,并且替换文件中的一些内容,把需要复制和黏贴的内容制作成 模版,以后的开发工作可以根据模版来自动生成文件,自己以后 ...
- loadrunner通过web的post请求方法测接口 1
loadrunner通过web的post请求方法测接口 loginapi() { web_url("rest", "URL=http://192 ...
- 基于SR-IOV的IO虚拟化技术
服务器配置要求 x86服务器内存不能低于32GB 服务器CPU需要支持虚拟化和设备虚拟化 VT-x VT-d,SR-IOV 功能,并且在BIOS中能启用了SR-IOV 网卡配置最起码为千兆配置 支持 ...