手动模拟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. mysql idb文件过大

    分开 保存,每个数据库有自己的 innodb_file_per_table=1

  2. 荼菜的iOS笔记--UIView的几个Block动画

    前言:我的第一篇文章荼菜的iOS笔记–Core Animation 核心动画算是比较详细讲了核心动画的用法,但是如你上篇看到的,有时我们只是想实现一些很小的动画,这时再用coreAnimation就会 ...

  3. [LC] 231. Power of Two

    Given an integer, write a function to determine if it is a power of two. Example 1: Input: 1 Output: ...

  4. C语言学习笔记之字符串拼接的2种方法——strcat、sprintf

    本文为原创文章,转载请标明出处 1. 使用strcat进行字符串拼接 #include <stdio.h> #include <stdlib.h> #include <s ...

  5. CSS--沃顿商学院网页布局

    源代码: <head> 右键CSS样式--附加样式表 </head> <body> <div id="dd"> <div id ...

  6. spring提供的事务配置--纯注解

    spring提供的事务--纯注解 模拟转账业务  ,出错需要事务回滚,没错正常执行 事务和数据库技术都是spring的内置提供的 --------dao包--------------- IAccoun ...

  7. RROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2

    RROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 ...

  8. Python---3基础输入方法

    一字符串写法 1.单一字符串 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hell ...

  9. centos7开启ntp并同步时间到指定时区

    前提:近期公司都是使用的直接对外的云服务器,在登上服务器后用date命令查看新服务器的时间,发现并不是标准时间,于是需要做时间同步.我这里讲的是能连接外网的情况下,在服务器不多的情况下是否此方法,大型 ...

  10. 滑动表层div时 禁止底层滑动

    $(".container").bind("touchstart", function (events) { startX = events.originalE ...