乱写的一个SQL框架
闲来没事,看了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框架的更多相关文章
- 用node写的一个后台框架
server.js var http=require('http') var handleUrl=require('./handleUrl') var config = require('./conf ...
- 一个sql导致temp表空间爆掉
Buffer sort引发的血案 今天遇到的一个问题,在线系统上,有两张表,test1大概50G,test2大概200G,需要查询出来test1表中部分记录,并且这些记录不存在test2表中.于是就写 ...
- 工作日常-SQL不能乱写
前言:刚接手别人的项目没多久,在昨天的一次上线中无故躺坑,且该大兄弟已经离职,不得不帮他填坑,整完后,今天想搞一个总结,结论就是:SQL不能乱写. 搜索关键词:Cause: java.sql.SQLE ...
- 从 0 开始手写一个 Mybatis 框架,三步搞定!
阅读本文大概需要 3 分钟. MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码. 本文完成的Mybatis功能比较简单,代码还有许 ...
- 为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]
ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只是一个很轻量级的框架,但是在大部分情况下能够满足我们的需要.不过我觉得 ...
- CI(codeigniter)框架,routes.php设置正确,但是显示服务器错误,是__construct少写了一个下划线
今天弄了一下CI框架,大概看了一下文档,感觉CI框架非常精简,但是在做的时候遇到了问题,CI文档中提供了一个新闻系统的例子,所有工作都做完了,在浏览器中打开相对应的url是,却显示“服务器错误”,一点 ...
- 自己手写一个SpringMVC框架
前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课. Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实 ...
- 2018.2.5 PHP如何写好一个程序用框架
随着PHP标准和Composer包管理工具的面世,普通开发者撸一个框架已经不再是什么难事了. 无论是路由管理.ORM管理.还是视图渲染都有许许多多优秀的包可以使用.我们就像堆积木一样把这些包用comp ...
- NET Core写了一个轻量级的Interception框架[开源]
NET Core写了一个轻量级的Interception框架[开源] ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架,虽然这只 ...
随机推荐
- ios美颜 调研 GPUImage GPUImageBeautifyFilter BeautifyFaceDemo
最近需要给直播项目中添加美颜的功能,调研了很多SDK和开源代码(视决,涂图,七牛,金山云,videoCore等),综合成本/效果/对项目侵入性,最后决定使用一款基于GPUImage实现的 Beauti ...
- IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯(三)
IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯(三) 后台服务用户与认证 新建一个空的.net core web项目Demo.Chat,端口配置为 ...
- programming review (c++): (1)vector, linked list, stack, queue, map, string, bit manipulation
编程题常用知识点的review. most important: 想好(1)详尽步骤(2)边界特例,再开始写代码. I.vector #include <iostream> //0.头文件 ...
- 2015年多校联合训练第一场OO’s Sequence(hdu5288)
题意:给定一个长度为n的序列,规定f(l,r)是对于l,r范围内的某个数字a[i],都不能找到一个相应的j使得a[i]%a[j]=0.那么l,r内有多少个i,f(l,r)就是几. 问全部f(l,r)的 ...
- Django Rest Framework remove csrf
37down votefavorite 14 I know that there are answers regarding Django Rest Framework, but I couldn't ...
- EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:bootstrap弹窗功能的实现
在web前端的网页设计中,为了展示出简洁的网页风格和美观的效果,往往就会使用弹窗效果 在EasyNVR前端页面录像检索功能时,必然会播放录像,如果单独为播放录像文件排一个界面,用户在使用上会更加繁琐, ...
- 九度OJ 1048:判断三角形类型 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6794 解决:3361 题目描述: 给定三角形的三条边,a,b,c.判断该三角形类型. 输入: 测试数据有多组,每组输入三角形的三条边. 输 ...
- java中byte转string的方法有哪些?
1.第一种 byte b = 1; String valueOf = String.valueOf(b) 2.第二种 byte b = 1; String st = Byte.toString(b); ...
- Bootstrap——全局CSS样式
1.栅格系统 containter:用于固定宽度并支持响应式布局的容器 container-fluid:用于100%宽度,占据全部视口(viewport)的容器 row:行,必须在container或 ...
- HTML5实现中国象棋游戏
在线演示 本地下载