文档章节

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

强子1985
 强子1985
发布于 2017/06/04 13:47
字数 508
阅读 26
收藏 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也可以做,就不再深究了。

© 著作权归作者所有

共有 人打赏支持
强子1985

强子1985

粉丝 875
博文 1086
码字总数 798492
作品 8
南京
架构师
私信 提问
Windows Phone 7 Motion Sensor 使用指南

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

长平狐
2012/08/21
424
1
Ruby 和 Python 分析器是如何工作的?

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

Julia Evans
2017/12/24
0
0
Mango数据库数据导出备份

移动app项目,后台存储数据和图片的数据库用的部分是My SQL,部分是Mango,现在Mango数据库服务器有登录账号和密码,但是需要导出数据 并分析下数据结构。数据量不大

zb1489754019124
2017/03/17
1
0
GCC Coverage代码分析-基本块图、插桩位置及桩代码执行分析

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

晨曦之光
2012/03/09
605
0
基于Python的datetime模块和time模块源码阅读分析

目录 1 前言 2 datetime.pyi源码分步解析 2.1 头部定义源码分析 2.2 tzinfo类源码分析 2.3 date类源码分析 2.4 time类源码分析 2.5 timedelta类源码分析 2.6 datetime类源码分析 2.7 格式化字...

舞动的心
07/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 自定义你的空间

通过对你的空间进行界面的自定义能够让你的空间更加出类拔萃。 如果你具有空间管理员权限,你可以修改你空间的颜色配色,添加你自己的空间标识,选择是否在你空间中显示边栏。或者你可以进入...

honeymose
今天
1
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部