java sql 拼接工具_java防sql注入的sql语句拼接工具sqlHandle

1.[代码]sqlHandle

package com.sql.db;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import java.util.Iterator;

import java.util.List;

import org.hibernate.SQLQuery;

import org.hibernate.Session;

/**

* sql拼接代码

* 一个完整的sql语句可以有多个sqlHandle拼接而成

* sqlHandle分sql语句 与 sql值,在sql语句中值由?

* 替代在最后运行是值将依此赋值给hibernate

* @author 梁前武

* www.apkplug.com

*/

public class sqlHandle {

public String strSql="%s";

public Object fsql="";

public String type="";

public Object[] v=null;

public List list=null;

public sqlHandle(String strSql,Object fsql,String type,Object[] v){

this.strSql=strSql;

this.fsql=fsql;

this.type=type;

this.v=v;

}

public sqlHandle(Object fsql,String type,Object[] v){

this.fsql=fsql;

this.type=type;

this.v=v;

}

public sqlHandle(){

}

public SQLQuery handle(Session session){

//拼接本sqlHandle sql字符串

String sql=addWhereSql(strSql,fsql,type);

for (int i=0;i

//依此拼接子sqlHandle

sqlHandle sqlHandle = (sqlHandle) list.get(i);

sql+=addWhereSql(sqlHandle.strSql,sqlHandle.fsql,sqlHandle.type);

}

System.out.println(sql);

SQLQuery query=session.createSQLQuery(sql);

//赋值

setV(query,0);

return query;

}

/**

* 将sql中?代替的值依此赋值给hibernate

* @param q

* @param i 传递值索引位置

* @return

*/

public int setV(SQLQuery q,int i){

if(v!=null)

for(int j=0;j

if(v[j]!=null){

//System.out.println("添加参数");

setV(q,i,v[j]);

i++;

}

}

if(fsql!=null&&fsql instanceof sqlHandle)

i=((sqlHandle)fsql).setV(q, i);

if(list!=null)

for (int j=0;j

sqlHandle sqlHandle = (sqlHandle) list.get(j);

i=sqlHandle.setV(q, i);

}

return i;

}

/**

* 将sql中?代替的值依此赋值给hibernate

* @param q

* @param i 值索引位置

* @param v 值

*/

public void setV(SQLQuery q,int i,Object v){

if(v instanceof String){

q.setString(i, (String)v);

}else if(v instanceof Integer){

q.setInteger(i, (Integer)v);

}else if(v instanceof Float){

q.setFloat(i, (Float)v);

}else if(v instanceof Double){

q.setDouble(i, (Double)v);

}else if(v instanceof Date){

q.setDate(i, (Date)v);

}else if(v instanceof java.sql.Date){

q.setDate(i, (Date)v);

}else if(v instanceof Boolean){

q.setBoolean(i, (Boolean)v);

}else if(v instanceof byte[]){

q.setBinary(i, (byte[])v);

}else if(v instanceof Byte){

q.setByte(i, (Byte)v);

}else if(v instanceof Calendar){

q.setCalendar(i, (Calendar)v);

}

}

/**

* 拼接sql字符串

* @param strSql 连接字符串 如 in(%s)

* @param sqlOne 实体字符串 如 select * user 可以是字符串也可以是sqlHandle

* @param type 连接类型 如 and,or

* @return 返回 如 and in(select * user)

*/

private static String addWhereSql(String strSql,Object sqlOne,String type){

return " "+type+" "+String.format(strSql, sqlOne)+" ";

}

/**

* 添加多个sql参数值

* @param fsql sql语句段 如 name=?

* @param type sql连接类型 如 and

* @param v Object[]{"liming"} 如无值便为null

* @return

*/

public sqlHandle AddMore(Object fsql,String type,Object[] v){

if (list==null)

list=new ArrayList();

sqlHandle sql=new sqlHandle(fsql,type,v);

list.add(sql);

return this;

}

/**

* 添加0-1个sql参数

* @param fsql sql语句段 如 name=?

* @param type sql连接类型 如 and

* @param v "liming" 如无值便为null

* @return

*/

public sqlHandle Add(Object fsql,String type,Object v){

AddMore( fsql, type,new Object[]{v});

return this;

}

/**

* 添加多个sql参数值

* 多一共 strSql字符 有时我们需要 in(sql...) 这种情况。

* 我们可以通过设置 strSql=in(%s) fsql=sql... 这种形式来实现

* strSql默认为"%s"

* @param strSql 替代副

* @param fsql

* @param type

* @param v

* @return

*/

public sqlHandle AddMoreAndRep(String strSql,Object fsql,String type,Object[] v){

if (list==null)

list=new ArrayList();

sqlHandle sql=new sqlHandle(strSql,fsql,type,v);

list.add(sql);

return this;

}

/**

* 添加多个sql参数值

* 多一共 strSql字符 有时我们需要 in(sql...) 这种情况。

* 我们可以通过设置 strSql=in(%s) fsql=sql... 这种形式来实现

* strSql默认为"%s"

* @param strSql

* @param fsql

* @param type

* @param v

* @return

*/

public sqlHandle AddAndRep(String strSql,Object fsql,String type,Object v){

AddMoreAndRep(strSql, fsql, type,new Object[]{v});

return this;

}

/**

* 生成自身sql语句

*/

public String toString(){

String sql="";

for (int i=0;i

sqlHandle sqlHandle = (sqlHandle) list.get(i);

sql+=addWhereSql(sqlHandle.strSql,sqlHandle.fsql,sqlHandle.type);

}

return sql;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C语言文件中执行SQL语句,你需要使用数据库连接库和SQL语句执行库,比如ODBC、JDBC、MySQL Connector/C等库。这些库可以通过API或函数来连接数据库、执行SQL语句和获取执行结果。 下面是一个使用ODBC库来执行SQL查询语句的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <sql.h> #include <sqlext.h> void show_error(unsigned int handle_type, const SQLHANDLE& handle) { SQLCHAR sqlstate[1024]; SQLCHAR message[1024]; if (SQL_SUCCESS == SQLGetDiagRec(handle_type, handle, 1, sqlstate, NULL, message, 1024, NULL)) { printf("Message: %s\n", message); printf("SQLSTATE: %s\n", sqlstate); } } int main() { SQLHENV env; SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN ret; /* ODBC API return status */ /* Allocate an environment handle */ SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); /* We want ODBC 3 support */ SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); /* Allocate a connection handle */ SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); /* Connect to the DSN */ ret = SQLDriverConnect(dbc, NULL, (SQLCHAR*)"DSN=mydsn;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); if (SQL_SUCCESS != ret) { show_error(SQL_HANDLE_DBC, dbc); return EXIT_FAILURE; } /* Allocate a statement handle */ SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); /* Execute the query */ ret = SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM mytable", SQL_NTS); if (SQL_SUCCESS != ret) { show_error(SQL_HANDLE_STMT, stmt); return EXIT_FAILURE; } /* Fetch and display the result set */ while (SQLFetch(stmt) == SQL_SUCCESS) { SQLINTEGER id; SQLCHAR name[256]; SQLGetData(stmt, 1, SQL_C_SLONG, &id, 0, NULL); SQLGetData(stmt, 2, SQL_C_CHAR, name, 256, NULL); printf("%d %s\n", id, name); } /* Free up the handles */ SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLDisconnect(dbc); SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env); return EXIT_SUCCESS; } ``` 这个示例代码使用ODBC库连接数据库,并执行一个简单的SELECT查询语句,然后获取查询结果并输出。在执行SQL语句之前,需要先连接到数据库,并分配环境句柄、连接句柄和语句句柄。然后,使用SQLExecDirect函数执行SQL语句,再使用SQLGetData函数获取结果。最后,释放句柄并关闭连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值