Myjdbc反向代理简易框架

  源码地址:https://github.com/beijing-penguin/Myjdbc

  我为什么要写这个Myjdbc?

  毕业后的一段时间一直在用hibernate,和mybatis框架,后来感觉这种框架太繁琐,比如,现在要用java读取客户给的一个excel表格,读取里面的数据后插入到数据库,这样一个小的需求,我都需要配置hibernate文件、配置mybatis的文件,对我来说,太麻烦了,因为我是懒人,不喜欢太多的东西,只喜欢简单易用就可以。

  我记得有一次用hibernate框架管理多数据源的时候,出现一个问题(人为问题),当第一个连接提交后,第二个提交就会报错,那个时候怎么办,项目紧,人手不够,苦苦百度寻找不到答案,那么只能干坐着了吗?或者去找他人帮忙?这得花费多少人力和财力?我当年学hibernate又花了多少时间?等等。总之第三方框架一旦出错,就意味着找不到根本原因,很难调试。在我的Myjdbc中,调试将变得非常简单。

  聊聊我的Myjdbc

  我很高兴,我昨天在群里告知各位群友后,能够得到某些群友的反馈,说想研究一下(或者看看)我的框架。其实,如果说我的框架是需要"研究"后才能用的话,那么说明,我设计失败了。jdbc的框架,有那么多的人封装多,为什么我还要造轮子,我是个懒人,我更加不想造轮子,我只想创新一个开发思想,或者说我只想快速开发,完成项目,然后喝着饮料,玩着手机坐在公司潇潇洒洒,即便出现bug,我也能秒秒钟定位问题的根本原因,并解决。那么为此MyJdbc诞生了,一个只属于自己框架,也是属于每个人自己的框架。。框架功能:数据库连接与数据库操作(增删改查),提供多数据源管理和多数据源下的弱事务操作(提交和回滚)。框架优点:高度灵活可扩展,可复用的组件,简单易用,可自行定义其他功能,非常方便的调试。框架缺点:1,不支持动态sql,2,暂时不支持分表分库,正在开发中......3,

  Myjdbc如何使用及有哪些特点

  建议,开发时,尽量拷贝源码到项目中使用。上线后稳定下来,可以考虑打包成Myjdbc.jar

  要了解清楚怎么去调试和如何使用,首先请看我设计的目录结构

  

anno里是注解类,

config是全局的jdbc的配置,任何配置都可以在这里定义,比如是否在执行sql前打印sql日志?

core包,就是封装了原始的jdbc操作,且任何操作类的方法都只有3个参数,比如下面这段DeleteOper.java的源码,

/**
 * 删除操作
 * @author dc
 * @time 2015-8-17
 */
public class DeleteOper extends OperSuper{
    private static DeleteOper deleteOper = new DeleteOper();
    public static DeleteOper getInstance(){
        return deleteOper;
    }
	public  int delete(Connection conn,String sql,Object[] params) throws Exception{
		return super.preparedAndExcuteSQL(conn, sql, params);
	}
}

如果我封装的这段代码还不满足你的公司的项目需求,请自行写个方法,但是有且只有3个参数,如果3个参数不够,请及时给我反馈,并说明原因。

entity包,是作为sql元素相关信息的临时媒介。比如可以用来保存sql字符串和这个字符串所对象参数数组。

因为java语法并不支持执行一个方法,返回两个参数,就像这样的形式Object sql,param = getUser()这样的形式(lua语言支持)。

hepler包,就相当于最表面的应用级的工具,可以理解为view层。作为将底层方法透明可见的一种方式

init包。则为jdbc在前可以选择性执行init初始化的操作工具类在这个包下,比如需要加载xml文件中定义好的sql文件

utils包下面,目前主要定义的有反射获取方法名,java类型匹配及转化等工具。

使用案例如下面这段代码

package test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dc.jdbc.core.ConnectionManager;
import org.dc.jdbc.helper.DBHelper;
import org.junit.Test;

public class JDBCTest {
    private static DBHelper accDBHelper = new DBHelper(Configure.accSource);
    private static DBHelper testDBHelper = new DBHelper(Configure.testSource);
    @Test
    public void select(){
        try {
            ConnectionManager.isTransaction.set(false);
            /*start*/
            Map<String,Object> map = testDBHelper.selectOne("select * from user limit 1");
            List<Map<String,Object>> mapList = testDBHelper.selectList("select * from user");
            /*end*/
            Map<String,Object> map_WithParam1 = testDBHelper.selectOne("select * from user where name=? age=? limit 1","dc",20);
            User user = testDBHelper.selectOne("select name,age from user where name=? age=? limit 1",User.class,"dc",20);
            //只返回年龄
            int age = testDBHelper.selectOne("select age from user where name=? age=? limit 1",Integer.class,"dc",20);
            String name = testDBHelper.selectOne("select name from user where name=? age=? limit 1",String.class,"dc",20);
            Map<String,Object> map_WithParam1_1 = testDBHelper.selectOne("select * from user where name=? age=? limit 1",new Object[]{"dc",20});

            //传入Map
            Map<String,Object> mapParams = new HashMap<String, Object>();
            mapParams.put("name", "dc");
            mapParams.put("age", 12);
            Map<String,Object> map_WithParam1_2 = testDBHelper.selectOne("select * from user where name=#{name} age=#{age} limit 1",mapParams);
            Map<String,Object> map_WithParam1_2_1 = testDBHelper.selectOne("$user.getOneUser",mapParams);

            //传入对象,也可以对象和Map一起作为参数传入方法
            User userObj = new User();
            userObj.setName("dc");
            userObj.setAge(12);
            Map<String,Object> map_WithParam1_3 = testDBHelper.selectOne("select * from user where name=#{name} age=#{age} limit 1",userObj);
            List<Map<String,Object>> mapList_withParam1 = testDBHelper.selectList("select * from user");
            List<User> mapList_withParam1_1 = testDBHelper.selectList("select name,age from user",User.class);
            List<String> mapList_withParam1_2 = testDBHelper.selectList("select name from user",String.class);
            List<Integer> mapList_withParam1_3 = testDBHelper.selectList("select name from user",Integer.class);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            ConnectionManager.closeConnection();
        }
    }
    @Test
    public void insert(){
        ConnectionManager.isTransaction.set(true);
        try {
            testDBHelper.insert("insert into user(name,age) values(?,?)", "dc",12);
            ConnectionManager.commit();
        } catch (Exception e) {
            e.printStackTrace();
            ConnectionManager.rollback();
        }finally{
            ConnectionManager.closeConnection();
        }
    }
}
class User{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
时间: 2024-10-16 19:41:27

Myjdbc反向代理简易框架的相关文章

Nginx 反向代理基本框架

全局配置指令:user nginx; 模块配置段 # 事件驱动模块,提供并发响应功能events{......}# http模块,提供web请求处理,可嵌套其他重要模块http{.......#server{}} 开始配置:#备份nginx.conf ,清空文件# vim /etc/hosts 增加主机记录vim /etc/nginx/nginx.conf worker_processes 2; # 两个nginx进程events {worker_connections 1024; # 可同时处

利用智能DNS和squid反向代理模拟简易CDN

前提本次实验应该用到5台Server和至少两台测试Client.但受制于服务器数量影响,实际一共用到了3台服务器,其中权威DNS本次没有配置.智能DNS跟CDN缓存节点1共用同一台服务器. 本次实验不介绍源站Server的搭建.本实验环境中用的是现成的系统.本次实验默认读者已经了解 DNS的相关知识,如A记录.CNAME记录.NS记录等.本次实验默认读者已经了解CDN的基本原理.本次实验默认读者了解Linux基本的知识点.如果不具备以上知识点,请先补充完善自己的知识体系. 实验规划:1. 客户源

Linux下Squid正向/反向代理配置

Squid是一个支持HTTP, HTTPS, FTP的web缓存代理,它能通过缓存和反复使用频繁访问的网页来减少带宽.提高响应速度.Squid被广泛用于访问控制和做前端加速,它能运行在大部分操作系统平台上,Squid能减少服务器的压力,提高客户端的响应速度,其高级的内容路由配置允许建立集群和负载均衡来处理各种WEB请求,3.2及之后的版本基本都已支持SMP和多CPU 应用场景: 1.正向代理 Squid被数以百计的网络提供商用来为他们的用户提供最好的网页访问,为了提升性能和常用内容来减少带宽sq

关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10)

反向代理也是一种可以帮助实现网站静态化的重要技术,今天我就来讲讲反向代理这个主题.那么首先我们要了解下什么是反向代理.和反向代理相对应的是正向代理,正向代理也就是我们常说的代理服务,正向代理是非常常见的,例如在某些公司里我们想使用互联网,那么我们就得在浏览器里设置一个代理服务器,通过代理服务器我们才能正常使用互联网,而这个代理服务器就是一个正向代理服务器.正向代理更加让人熟悉的使用场景估计还是在FQ技术里的使用,我们使用一个放置在国外的代理服务器来访问那些在国内无法正常访问的网站,这其实也是在使

Atitit.实现反向代理(1)----url rewrite 配置and内容改写 and -绝对路径链接改写 java php

Atitit.实现反向代理(1)----url rewrite  配置and内容改写 and -绝对路径链接改写 java php 1. 代理的实现:::普通代理and反向代理?? 1 2. url rewrite 的框架选型 1 3. ---------反向代理rewrite 配置mode_rewrite 1 1. Java的实现 2 4. 排除自身(apache_mode_rewrite) 2 2. Java的实现 排除自身 2 5. 内容改写(php mode_rwt) 3 3. Java

Nginx学习之反向代理WebSocket配置实例

写在开始去年,做过一款竞赛打分的APP.具体需求,同组教师之间可以相互通信,及时通知同组人员,其他组员做了那些操作(当然,这只是针对特定操作) 写在开始 去年,做过一款竞赛打分的APP.具体需求,同组教师之间可以相互通信,及时通知同组人员,其他组员做了那些操作(当然,这只是针对特定操作). 实现方案 采用目前比较成熟的WebSocket技术,WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择.其为HTML5的一部分,WebSocket相较于原来开发这类app

linux 下apache反向代理 tomcat

一.实验说明 Apache HTTP server 和 Tomcat server 整合,一般是希望对于用户只公布 Apache HTTP server 的网址,而 Tomcat 的网址则不公布,扮演一个幕后英雄的角色.访问 Tomcat 的 HTTP 请求,通过 Apache 转发给 Tomcat,Tomcat 处理完后,将 HTTP 回应返回给 Apache,然后 Apache  HTTP 回应发回给用户端浏览器. Apache HTTP server和 Tomcat server 直接的

高性能Web服务之Httpd+Tomcat实现负债均衡反向代理实现

httpd作为前端的反向代理,那有两种选择,一是利用"proxy_module"这个代理框架下的"proxy_http_module"与"proxy_ajp_module"这两个代理模块,这两个代理模块是独自工作的,二是利用"mod_jk"模块实现httpd的反向代理至后端tomcat. 下面通过以下架构部署httpd+tomcat实现方向代理: 反向代理系统架构规划如下: 服务器角色 服务器IP httpd eth0:172

在ubuntu上面配置nginx实现反向代理和负载均衡

上一篇文章(http://www.cnblogs.com/chenxizhang/p/4684260.html),我做了一个实验,就是利用Visual Studio,基于Nancy框架,开发了一个自托管(Self-hosting)的应用程序,然后将其部署到了一台Ubuntu的虚拟机上面,通过mono将其顺利地运行了起来,这样也就实现了.NET应用程序在Liunx系统上面的移植. 这一篇要讲解的是进一步的实验,我们都知道Nginx这款服务器,它可以用来做反向代理服务器,也可以做负载均衡. 关于ng