闲来没事,看了mybatis的实现形式,就心血来潮的自己弄了一个仿照mybatis的框架,性能肯定不好,而且有很多问题,但是是一次有益的尝试

1.基本配置文件

<!--加载数据源--> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.inventory</value>
</property>
</bean> <bean id="InventoryTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref local='dataSource' />
</property>
</bean>

<!--定义数据库类型-->
<bean id="multiDBSQLSupport" class="com.****.linkalarm.dao.db.MultiDBSQLSupport">
<property name="type" value="mysql"></property>
</bean>
<!--加载数据库操作-->
<bean id="basicDBOper" class="com.****.linkalarm.dao.db.BasicDBOper">
<property name="multiDBSQLSupport" ref="multiDBSQLSupport"></property>
<property name="jdbcTemplate" ref="InventoryTemplate"></property>
</bean>

2.主要实现类

  1).SQL语句支持类

  

/**
* 多数据库支持类型*/
public class MultiDBSQLSupport { //数据库类型
private String type = "mysql"; private Properties localProperties; public String getBasicSQL(String key){
return getProperties(key,"");
} /**
* 获得插入SQL*/
public String getInsertSQL(String key,Map<String,String> valueMap){
if(valueMap==null){
return null;
}
String sql = getBasicSQL(key).toLowerCase();
if(!sql.equals("")){
String v = sql.trim().split("values")[1].replace("(", "").replace(")", "").replace(";", "");
String[] vs = v.split(",");
for(String s:vs){
s = s.trim();
if(s.contains("#")){
String s1 = s.replaceAll("#", "").trim();
String valueString;
if(valueMap.containsKey(s1)){
valueString = valueMap.get(s1);
}else if(valueMap.containsKey(s1.toUpperCase())){
valueString = valueMap.get(s1.toUpperCase());
}else{
valueString = "";
}
sql = sql.replace(s, valueString);
}
}
}
return sql;
} /**
* 获得查询SQL*/
public String getQuerySQL(String key,Map<String,String> valueMap){
String sql = getBasicSQL(key).toLowerCase().trim();
List<String> paramsList = new ArrayList<String>();
for(int i=0;i<sql.length();i++){
char ch = sql.charAt(i);
if(ch=='#'){
String tempStr = "";
char c;
while((c = sql.charAt(++i))!='#'){
tempStr = tempStr + sql.charAt(i);
}
paramsList.add("#"+tempStr+"#");
}
} for(String parms:paramsList){
sql = sql .replace(parms, valueMap.get(parms.replaceAll("#", "").trim()));
}
return sql;
} /**
* 获得插入SQL*/
public String getQuerySQL(String key,String...values){
String sql = getBasicSQL(key).toLowerCase().trim();
List<String> paramsList = new ArrayList<String>();
for(int i=0;i<sql.length();i++){
char ch = sql.charAt(i);
if(ch=='#'){
String tempStr = "";
char c;
while((c = sql.charAt(++i))!='#'){
tempStr = tempStr + sql.charAt(i);
}
paramsList.add("#"+tempStr+"#");
}
}
for(int i=0;i<values.length;i++){
sql = sql.replace(paramsList.get(i), values[i]+"");
}
return sql;
} /**
* 获得批量插入SQL*/
public String[] getBatchInsertSQL(String key,List<Map<String,String>> valueMaps){
if(valueMaps==null){
return null;
}
int length = valueMaps.size();
String[] results = new String[length]; String sql = getBasicSQL(key).toLowerCase();
if(!sql.equals("")){
String v = sql.trim().split("values")[1].replace("(", "").replace(")", "").replace(";", "");
String[] vs = v.split(",");
for(int i=0;i<length;i++){
String newsql = sql;
Map<String,String> valueMap = valueMaps.get(i);
for(String s:vs){
s = s.trim();
if(s.contains("#")){
String s1 = s.replaceAll("#", "").trim();
String valueString;
if(valueMap.containsKey(s1)){
valueString = valueMap.get(s1);
}else if(valueMap.containsKey(s1.toUpperCase())){
valueString = valueMap.get(s1.toUpperCase());
}else{
valueString = "";
}
newsql = newsql.replace(s, valueString);
}
}
results[i] = newsql;
}
}
return results;
} /**
* 读取配置文件
* */
private String getProperties(String key,String defaultValue){
if(localProperties==null){
try{
String path = ProgramPathHelper.getProgramPath() +System.getProperty("file.separator")+"sql_"+type+".properties";
URL url = null;
File file = new File(path);
try {
if (file.exists()) { url = file.toURI().toURL();
} else {
path="sql_"+type+".properties";
url = new URL(path);
}
} catch (MalformedURLException e) {
url = ConfigHelp.findAsResource(path);
}
if (null == url) {
throw new FileNotFoundException(path);
}
InputStream in = new BufferedInputStream(new FileInputStream(new File(url.toURI())));
localProperties = new Properties();
localProperties.load(in);
}catch(Exception ex){
Logger logger = Logger.getLogger(ConfigHelp.class);
logger.warn("read configuration.properties while error", ex);
}
}
try{
String result = localProperties.getProperty(key);
if(result!=null && !"".equals(result)){
return result;
}
}catch(Exception ex){
Logger logger = Logger.getLogger(ConfigHelp.class);
logger.warn("return configuration.properties value while error", ex);
}
return defaultValue;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} }

  2).数据操作接口

 

public interface IDataBaseOper<T> {

    /**
* 查询*/
public List<Map<String,Object>> getQueryList(String sql); /**
* 查询*/
public List<T> getQueryList(String sql,Class classs); /**
* 插入*/
public int insertSQL(String sql); /**
* 更新*/
public int updateSQL(String sql); /**
* 获取sql语句*/
public String getSQL(String key,String...values); }

  3).抽象数据操作

public abstract class ADataBaseOper<T> implements IDataBaseOper<T>{

    protected JdbcTemplate jdbcTemplate;

    protected MultiDBSQLSupport multiDBSQLSupport;

    public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
} public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
} public MultiDBSQLSupport getMultiDBSQLSupport() {
return multiDBSQLSupport;
} public void setMultiDBSQLSupport(MultiDBSQLSupport multiDBSQLSupport) {
this.multiDBSQLSupport = multiDBSQLSupport;
} }

  4).基本数据操作类

/**
* 基础数据库操作类*/
public class BasicDBOper<T> extends ADataBaseOper<T>{ private static final Logger logger = Logger.getLogger(BasicDBOper.class); public List<Map<String,Object>> getQueryList(String sql){
try {
return jdbcTemplate.queryForList(sql);
} catch (DataAccessException e) {
try {
System.out.println(jdbcTemplate.getDataSource().getConnection().getMetaData().getURL());
} catch (SQLException e1) {
e1.printStackTrace();
}
logger.info(e);
}
return null;
} public int insertSQL(String sql){
try {
jdbcTemplate.execute(sql);
return 1;
} catch (Exception e) {
try {
System.out.println(jdbcTemplate.getDataSource().getConnection().getMetaData().getURL());
} catch (SQLException e1) {
e1.printStackTrace();
}
logger.info(e);
}
return 0;
} public int updateSQL(String sql){
return jdbcTemplate.update(sql);
}

@Override
public List<T> getQueryList(String sql,Class classs) {
try {
List<T> objects = null;
List<Map<String,Object>> results = this.getQueryList(sql);
if(results!=null&&results.size()>0){
objects = new ArrayList<T>();
for(int i=0;i<results.size();i++){
Map<String,Object> map = results.get(i);
try {
Object obj = classs.newInstance();
Field[] fs = classs.getDeclaredFields();
for(Field f:fs){
String name = f.getName();
if(map.containsKey(name)){
f.setAccessible(true);
f.set(obj, map.get(name)+"");
f.setAccessible(false);
}
}
objects.add((T)obj);
} catch (Exception e) {
logger.info(e);
continue;
}
}
}
return objects;
} catch (Exception e) {
try {
System.out.println(jdbcTemplate.getDataSource().getConnection().getMetaData().getURL());
} catch (SQLException e1) {
e1.printStackTrace();
}
logger.info(e);
}
return null;
} @Override
public String getSQL(String key, String... values) {
String sql = this.getMultiDBSQLSupport().getQuerySQL(key, values);
//logger.info("GET SQL result is "+sql);
return sql;
} }

3.使用这个框架

  1).定义SQL语句

  sql_mysql.properties

  

jdbc.getLinkVPN=select v.name from link l,re_link_vpn r,vpn v where l.UUID ='#linkid#' and r.vpn_id = v.UUID and l.UUID = r.link_id
jdbc.analyse.getRule=select uuid,name,raction as action from patrolrule where atype = '' and uuid = #ruleid#

  2).使用类

  

public static List<Map<String,Object>> getLinkVPN(String linkid){
return dataBaseOper.getQueryList(dataBaseOper.getSQL("jdbc.getLinkVPN",linkid));
}
public static List<PatrolRule> getTaskRule(String ruleId){
return dataBaseOper.getQueryList(dataBaseOper.getSQL("jdbc.analyse.getRule", ruleId), PatrolRule.class);
}

乱写的一个SQL框架的更多相关文章

  1. 用node写的一个后台框架

    server.js var http=require('http') var handleUrl=require('./handleUrl') var config = require('./conf ...

  2. 一个sql导致temp表空间爆掉

    Buffer sort引发的血案 今天遇到的一个问题,在线系统上,有两张表,test1大概50G,test2大概200G,需要查询出来test1表中部分记录,并且这些记录不存在test2表中.于是就写 ...

  3. 工作日常-SQL不能乱写

    前言:刚接手别人的项目没多久,在昨天的一次上线中无故躺坑,且该大兄弟已经离职,不得不帮他填坑,整完后,今天想搞一个总结,结论就是:SQL不能乱写. 搜索关键词:Cause: java.sql.SQLE ...

  4. 从 0 开始手写一个 Mybatis 框架,三步搞定!

    阅读本文大概需要 3 分钟. MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码. 本文完成的Mybatis功能比较简单,代码还有许 ...

  5. 为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]

    ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只是一个很轻量级的框架,但是在大部分情况下能够满足我们的需要.不过我觉得 ...

  6. CI(codeigniter)框架,routes.php设置正确,但是显示服务器错误,是__construct少写了一个下划线

    今天弄了一下CI框架,大概看了一下文档,感觉CI框架非常精简,但是在做的时候遇到了问题,CI文档中提供了一个新闻系统的例子,所有工作都做完了,在浏览器中打开相对应的url是,却显示“服务器错误”,一点 ...

  7. 自己手写一个SpringMVC框架

    前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课. Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实 ...

  8. 2018.2.5 PHP如何写好一个程序用框架

    随着PHP标准和Composer包管理工具的面世,普通开发者撸一个框架已经不再是什么难事了. 无论是路由管理.ORM管理.还是视图渲染都有许许多多优秀的包可以使用.我们就像堆积木一样把这些包用comp ...

  9. NET Core写了一个轻量级的Interception框架[开源]

    NET Core写了一个轻量级的Interception框架[开源] ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只 ...

随机推荐

  1. 智能手机的耗电特征及APP耗电量测试的两种方法

    文章陈述了手机发展趋势及耗电特性,集中讨论了时下最为关心的智能手机耗电问题,并介绍了测量手机软件耗电量的两种方法.此外还解释了为何运营商此前会提出收取微信的费用,心跳机制是什么. 美国著名手机公司Pa ...

  2. windows下如何快速优雅的使用python的科学计算库?

    Python是一种强大的编程语言,其提供了很多用于科学计算的模块,常见的包括numpy.scipy.pandas和matplotlib.要利用Python进行科学计算,就需要一一安装所需的模块,而这些 ...

  3. 一些编译php时的configure 参数

    一些编译php时的configure 参数 ./configure –prefix=/usr/local/php php 安装目录 –with-apxs2=/usr/local/apache/bin/ ...

  4. 37、pendingIntent 点击通知栏进入页面

    转载: http://blog.csdn.net/yuzhiboyi/article/details/8484771 https://my.oschina.net/youranhongcha/blog ...

  5. python 基础 5.4 类的私有属性和私有方法

    一. 类的私有变量和私有方法 1>   在python 中可以通过在属性变量名前,加上双下划线定义属性为私有属性   2>特殊变量命名 a. _xx 以单下划线开头的表示的是protect ...

  6. Java泛型【转】

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...

  7. 【BZOJ2626】JZPFAR kd-tree+堆

    [BZOJ2626]JZPFAR Description 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个( ...

  8. git创建项目的两种方式

    场景1: 将本地内容推送给远程库 1.创建版本库 git init 将此目录转换为git可管理的仓库 git config --global user.name "xx" 或 gi ...

  9. js调试笔记

    js调试方法很多,今天总结一下最实用的的断点方法: debugger断点 这个很常见,但许多人不知道其实可以添加条件判断 if(something){debugger;} source断点 这个最为常 ...

  10. "flash download failed - Target dll has been cancelled"错误解决办法

    在用mdk通过stlink烧写官方例程到stm32f429I discovery时,烧写了十来个程序都没问题,突然在烧写一个程序时, 弹出了“flash download failed - Targe ...