乱写的一个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为核心的依赖注入框架,虽然这只 ...
随机推荐
- Hibernate demo之使用xml
1.新建maven项目 testHibernate,pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...
- JVM中垃圾收集选项
最初并发垃圾收集被引入的时候,激活并发垃圾收集的命令选项是: -XX:+UseParallelGC 增强的并行收集和Java 6一起发布,通过一个新的命令行选项: -XX:+UseParallelOl ...
- RethinkDB创始人教你怎样找到创业点子
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1YmFpdGlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- ASP.NET MVC 4 技术讲解
ASP.NET MVC 相关的社群与讨论区 Routing 与 ASP.NET MVC 生命周期 Model相关技术 Controller相关技术 View数据呈现相关技术 Area区域相关技术 AS ...
- sigar 监控服务器硬件信息
转载 http://www.cnblogs.com/jifeng/archive/2012/05/16/2503519.html 通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1 ...
- php生成唯一的串
1.方法一: <?php md5(uniqid('aa',true)); ?> 2.方法2: //生成16位的串$randLength=6; $chars='abcdefghijklmno ...
- 多文档自己主动文摘:Multi-Document Summarization,MDS
- href=http:// href=// 的区别,src=http:// src=// 的区别。 链接里不带http,链接里直接使用双斜线 // 有什么不同。http://和//有什么区别?
其实很简单,当一个连接用双斜线 // 开头时表示如果浏览器当前使用的是https协议,那么就加载https协议的脚本,否则使用http,这保证了页面所有资源使用同一协议. 其实是有人将其做为规范来实践 ...
- thinkphp5 (最棒的php开源框架)
tp5的唯一可访问目录是public,即项目根目录: http://localhost/tp5/public/ 开发规范: 类库.函数文件统一以.php为后缀 类(命名和路径)和命名空间保持一致 类文 ...
- python网络爬虫之使用scrapy自动登录网站
前面曾经介绍过requests实现自动登录的方法.这里介绍下使用scrapy如何实现自动登录.还是以csdn网站为例. Scrapy使用FormRequest来登录并递交数据给服务器.只是带有额外的f ...