文档章节

Mango源码分析2: basic代码分析

强子哥哥
 强子哥哥
发布于 2017/06/04 13:47
字数 508
阅读 14
收藏 0
点赞 0
评论 0

我们先来看basic的代码,

jdb  org.jfaster.mango.example.basic.UserMain

stop in org.jfaster.mango.example.basic.UserMain.main

run

看代码实现

String driverClassName = "com.mysql.jdbc.Driver";
		// 常见的一些配置
		String url = "jdbc:mysql://localhost:3306/mango_example";
		String username = "root"; // 这里请使用您自己的用户名
		String password = "root"; // 这里请使用您自己的密码
		//构造成1个对象
		DataSource ds = new DriverManagerDataSource(driverClassName, url, username, password);

然后,

Mango mango = Mango.newInstance(ds); // 使用数据源初始化mango

其实执行了

Mango mango = new Mango();
public static Mango newInstance(DataSource dataSource) {
		//创建1个mango实例对象
		Mango mango = newInstance();
		//设置数据源
		mango.setDataSource(dataSource);
		//返回
		return mango;
	}

接下来执行 UserDao dao = mango.create(UserDao.class);这个跟mybatis的有点类似

/**
	 * 创建代理DAO类
	 */
	public <T> T create(Class<T> daoClass) {
		// 一个check的过程
		if (daoClass == null) {
			throw new NullPointerException("dao interface can't be null");
		}

		if (!daoClass.isInterface()) {
			throw new IllegalArgumentException("expected an interface to proxy, but " + daoClass);
		}
		// 确保注解存在
		DB dbAnno = daoClass.getAnnotation(DB.class);
		if (dbAnno == null) {
			throw new IllegalStateException("dao interface expected one @DB " + "annotation but not found");
		}
		// 检查Cache注解
		Cache cacheAnno = daoClass.getAnnotation(Cache.class);
		if (cacheAnno != null && cacheHandler == null) {
			throw new IllegalStateException("if @Cache annotation on dao interface, " + "cacheHandler can't be null");
		}
		// 确保dataSourceFactoryGroup已经初始化了
		if (dataSourceFactoryGroup == null) {
			throw new IllegalArgumentException("please set dataSource or dataSourceFactory or dataSourceFactories");
		}
		// 生成1个MangoInvocationHandler
		MangoInvocationHandler handler = new MangoInvocationHandler(daoClass, dataSourceFactoryGroup, cacheHandler,
				interceptorChain, statCollector, this);
		//
		if (!isLazyInit) { // 不使用懒加载,则提前加载
			// 获取这个类的所有方法
			List<Method> methods = Methods.listMethods(daoClass);
			// 遍历每1个方法
			for (Method method : methods) {
				try {
					// 交给handler处理
					handler.getOperator(method);
				} catch (Throwable e) {
					throw new InitializationException("initialize " + ToStringHelper.toString(method) + " error", e);
				}
			}
		}
		//生成反射对象
		return Reflection.newProxy(daoClass, handler);
	}

就如mybatis一样,生成了一个接口相关的类后,就可以进行一些操作了

===

String name = "ash";
		int age = 28;
		boolean gender = true;
		long money = 100;
		Date updateTime = new Date();		
		dao.insertUser(name, age, gender, money, updateTime);


    @SQL("insert into user(name, age, gender, money, update_time) values(:1, :2, :3, :4, :5)")
    public void insertUser(String name, int age, boolean gender, long money, Date updateTime);

===

User user = new User();
		user.setName(name);
		user.setAge(age);
		user.setGender(gender);
		user.setMoney(money);
		user.setUpdateTime(updateTime);

    @ReturnGeneratedId
    @SQL("insert into user(name, age, gender, money, update_time) " +
            "values(:1.name, :1.age, :1.gender, :1.money, :1.updateTime)")
    public int insertUser(User user);

===

dao.deleteUser(id);

    @SQL("delete from user where id=:1")
    public int deleteUser(int id);

感觉这些mybatis也可以做,就不再深究了。

© 著作权归作者所有

共有 人打赏支持
强子哥哥

强子哥哥

粉丝 856
博文 551
码字总数 647493
作品 8
南京
架构师
Ruby 和 Python 分析器是如何工作的?

原文出处:Julia Evans 译文出处:开源中国 你好! 我作为一名编写Ruby profiler的先驱,我想对现有的Ruby和Python profiler如何工作进行一次调查。 这也有助于回答很多人的问题:“你怎么写...

Julia Evans ⋅ 2017/12/24 ⋅ 0

Windows Phone 7 Motion Sensor 使用指南

1. 为什么要引入Motion API? 在上一篇《Windows Phone 7 数字罗盘使用指南》中,我们已经对WP7中的传感器有所了解,事实上,WP7正是通过这些传感器来获取手机当前的姿态和位置等信息。但是,...

长平狐 ⋅ 2012/08/21 ⋅ 1

Windows Phone Developer Tools for Mango

新版本的Windows Phone Developer Tools 已经发布了版本为7.1 Beta。具老鲍说Mango 系统具有500多个新特性,到底有几个反正我是统计不出来,相信老鲍不是吹牛皮。暂不谈Mango 的特性,既然新...

junwong ⋅ 2012/03/09 ⋅ 0

GCC Coverage代码分析-基本块图、插桩位置及桩代码执行分析

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正! Content 0. 序 1. 基本块概念 2. 基本块图及插桩点分析 2.1 基本块图 ...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

C++模板”>>”编译问题与词法消歧设计

原文出处:文艺复兴记,2013-10-09 在编译理论中,通常将编译过程抽象为5个主要阶段:词法分析(Lexical Analysis),语法分析(Parsing),语义分析(Semantic Analysis),优化(Optimization),代...

文艺复兴记,2013-10-09 ⋅ 2017/01/06 ⋅ 0

C 语言随机数生成器的实现分析

本文作者:伯乐在线 -卢亮 。未经作者许可,禁止转载! 欢迎加入伯乐在线专栏作者。 本文是为了记录和澄清一个由来已久的关于C语言随机数生成器的误解。 目前所看到的所有公开的关于C随机数生...

伯乐在线 ⋅ 2016/12/21 ⋅ 0

Java IO 之 FileInputStream & FileOutputStream源码分析

Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket 一、引子 文件,作为常见的数据源。关于操作文件的字节流就是 — FileInputS...

泥沙砖瓦浆木匠 ⋅ 2015/10/09 ⋅ 0

性能测试的艺术

原文出处:磁针石 为什么要进行性能测试? 什么是好的与坏的性能?为什么性能测试在软件开发生命周期(SDLC software development life cycle)中很重要? 性能不佳的应用通常无法实现企业预期...

磁针石 ⋅ 2016/03/21 ⋅ 0

Redis 专栏(使用介绍、源码分析、常见问题...)

来源http://blog.csdn.net/yangbodong22011/article/details/78529448 https://github.com/hurley25 https://github.com/hurley25/ANet ANet 基于Redis网络模型的简易网络库,网络模块代码取......

libaineu2004 ⋅ 2017/12/16 ⋅ 0

jQuery对象入门级介绍

本文由伯乐在线 -kmokidd 翻译。未经许可,禁止转载! 英文出处:smashingmagazine。欢迎加入翻译组。 你是否曾经见过像 这样的JavaScrip代码?或许你还会思考下 是什么,如果看到这些你都觉...

伯乐在线 ⋅ 2014/06/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

180621-一个简单的时间窗口设计与实现

如何设计一个计数的时间窗口 时间窗口,通常对于一些实时信息展示中用得比较多,比如维持一个五分钟的交易明细时间窗口,就需要记录当前时间,到五分钟之前的所有交易明细,而五分钟之前的数...

小灰灰Blog ⋅ 22分钟前 ⋅ 0

Android之Dalvik、ART、JIT、AOT

Android之Dalvik、ART、JIT、AOT 本文内容:Dalvik、ART、JIT、AOT之间关系 本文定位:知识记录 学习过程记录,加深理解,提升文字组合表达能力。也希望能给学习的同学一些灵感 本文整理于[...

lichuangnk ⋅ 26分钟前 ⋅ 0

Thrift RPC实战(五) thrift连接池

Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个 一、定义对象工厂 BasePooledObjectFactory<T> extends BaseObject implements PooledObjectFactory<T> public class......

lemonLove ⋅ 26分钟前 ⋅ 0

git 命令简写

简写 命令 g git gst git status gd git diff gdc git diff --cached gdv git diff -w "$@" | view - gl git pull gup git pull --rebase gp git push gc git commit -v gc! git commit -v ......

charley158 ⋅ 34分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 35分钟前 ⋅ 0

Intellij IDEA神器常用技巧四-类和方法注释模板设置

IDEA自带的注释模板不是太好用,我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家,我不是专业玩博客的,写这篇文章只是为了让大家省事。 这里设置的注释模...

Mkeeper ⋅ 38分钟前 ⋅ 0

Jira接入钉钉机器人

https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.9Z9czj&treeId=257&articleId=106075&docType=1...

谢思华 ⋅ 40分钟前 ⋅ 0

微信公众号开发

一、开通微信服务号,填写URL,微信将想你发送验证信息。接收并处理微信发来的GET请求 二、处理客户向公众号发送的各种消息: 如文本、图片、乐音、视频、音乐 : 消息分为:1 请求消息(文本...

无敌小学僧 ⋅ 46分钟前 ⋅ 0

广州三本找Java实习经历

前言 只有光头才能变强 这阵子跑去面试Java实习生啦~~~我来简单介绍一下背景吧。 广州三本大三在读,在广州找实习。大学开始接触编程,一个非常平庸的人。 在学习编程时,跟我类似的人应该会...

Java3y ⋅ 48分钟前 ⋅ 0

php json_encode()不转义中文字符 和 斜杠"/"

php格式化json的函数 json_encode($value,$options) 其中有2个比较常用到的参数 JSON_UNESCAPED_UNICODE (中文不转为unicode ,对应的数字 256) JSON_UNESCAPED_SLASHES (不转义斜杠,对应的...

一只大橘子 ⋅ 53分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部