`
he_wen
  • 浏览: 239463 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

连接jdbc时sql语句统一设置参数

阅读更多

各位网友java代码里面的注释怎么不变颜色,具体方法怎么操作,请各位网友指点?还有本文描述的怎么样?是否叙述的详细?请各位博主能指点一二,谢谢

一、业务背景介绍

本业务专门针对连接oracle数据库,经常在开发中写sql语句有的字段需要预定义,而这些字段类型有多种,如:

sql="select * from t_corp t where t.corpid=? and t.corpname=? " ,本文解决的问题就是如何把sql语句预定义的

字段统一的进行管理,客户不需考虑设置的字段是什么类型,只需要添加字段的值就可以,

如:DBParams params = new DBParams();
  params.addParam(1314);
  params.addParam("惠山分局钱桥派出所");
  params.addParam("2010-01-01 00:00:00");

二、代码详解

客户端的调用

package com.hewen.param.manage;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


/***
 * 注意从数据库取日期,比如:数据库字段中有stamp=2010-02-08 09:31:53
 * rs.getTime("stamp")只能得到09:31:53,rs.getDate("stamp")只能得到2010-02-08
 * rs.getTimestamp("stamp"),得到2010-02-08 09:31:53.0,
 * 只能通过函数rs.getTimestamp("stamp").toString().substring(0, rs.getTimestamp("stamp").toString().length()-2)
 * 得到2010-02-08 09:31:53
 * @author Administrator
 *
 */
public class DBParamTest {
	public static void main(String[] args) {	
		StringBuilder sql=new StringBuilder();
		 sql.append( "select * from t_corp t where t.corpid=? and t.corpname=? ")
		 .append("and t.stamp between to_date(?,'yyyy-mm-dd HH24:mi:ss') and to_date(?,'yyyy-mm-dd HH24:mi:ss')");
		
		Connection con = null;
		try {
			con = DBTest.getCon();//连接数据库
		} catch (SQLException e) {
			e.printStackTrace();
			return;
		}
		//为sql语句设置参数
		DBParams params = new DBParams();
		params.addParam(1314);
		params.addParam("惠山分局钱桥派出所");
		params.addParam("2010-01-01 00:00:00");
		params.addParam("2010-04-03 03:00:00");

		PreparedStatement pst = null;
		ResultSet rs = null;
		try {
			pst = con.prepareStatement(sql.toString());
			params.prepareStatement(pst);
			rs = pst.executeQuery();
			if(rs.next()){
				System.out.println("remark:" + rs.getString("corpname"));
				System.out.println("stamp:"+rs.getTimestamp("stamp").toString().substring(0, rs.getTimestamp("stamp").toString().length()-2));
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			DBUtil.closeRs(rs);
			DBUtil.closePst(pst);
			DBUtil.closeCon(con);
		}
	}
}

 负责连接数据库的类

package com.hewen.param.manage;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/***
 * 这个是连接Oracle数据库
 * @author Administrator
 *
 */
public class DBTest {
	public static Connection getCon() throws SQLException{
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		String user = "avls";
		String password = "1";
		
		return DriverManager.getConnection(url, user, password);	
	}
}

对设置的参数统一管理类

package com.hewen.param.manage;

import java.lang.reflect.Type;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

public class DBParams 
{
	/**
	 * 数据库的基本类型,包含的jdbc的封装的基本类型
	 */
	private static final int[] SQLTYPES = {Types.INTEGER, Types.BIGINT, Types.VARCHAR, 
			Types.DATE, Types.TIMESTAMP, Types.DOUBLE, Types.TIME};
	/**
	 * Java数据基本类型,SQLTYPES与CLASSTYPES类型是一一对应的
	 */
	private static final Class<?>[] CLASSTYPES = {Integer.class, Long.class, String.class,
			Date.class, Timestamp.class, Double.class, Time.class};
	//访问数据库,更新、删除、修改、查询、添加的sql语句预先定义的语句参数
	private List<ParamEntity> paramList = new ArrayList<ParamEntity>();
	/**
	 * 复制一份sql语句预定义参数的集合
	 * @return 
	 * 
	 */
	public DBParams copy(){
		DBParams copy = new DBParams();
		for(ParamEntity entity: paramList){
			copy.paramList.add(entity);
		}
		return copy;
	}
	/***
	 * 为sql语句设置参数如:
	 * select * from t_logistics_road t where t.roadid=?
	 * @param o 添加的参数对象,此对象可以是任意的数据基本类型和类
	 */
	public void addParam(Object o){
		addParam(o, getSqlTypeByClassType(o.getClass()));
	}
	/**
	 * 
	 * @param type Java 编程语言中所有类型的公共高级接口。
	 * 它们包括原始类型、参数化类型、数组类型、类型变量和基本类型
	 * @return
	 */
	private int getSqlTypeByClassType(Type type){
		for(int i = 0; i < CLASSTYPES.length; i++){
			if(type == CLASSTYPES[i]){
				return SQLTYPES[i];
			}
		}
		throw new RuntimeException("unSupport Type type:" + type);
	}
	
	private int checkSupportType(int sqlType){
		for(int i = 0; i < SQLTYPES.length; i++){
			if(sqlType == SQLTYPES[i]){
				return i;
			}
		}
		throw new RuntimeException("unsurpport sqltype:" + sqlType);
	}
	
	public void addNullParam(int sqlType){
		checkSupportType(sqlType);
		addParam(null, sqlType);
	}
	
	public void addNullParam(Type t){
		addParam(null, getSqlTypeByClassType(t));
	}
	/***
	 * 
	 * @param o 添加参数设置对象
	 * @param type jdbc数据库数据类型,如Types.INTEGER, Types.BIGINT, Types.VARCHAR等
	 */
	private void addParam(Object o, int type){
		ParamEntity entity = new ParamEntity(o, type);
		paramList.add(entity);
	}
	
//	public void removeParam(int index){
//		paramList.remove(index);
//	}
//	
//	public void clearParams(){
//		paramList.clear();
//	}
	/***
	 * @param pst
	 * @param startIndex 由于sql语句设置的参数有多个,注意默认是从1开始
	 */
	public void prepareStatement(PreparedStatement pst,int startIndex) throws SQLException{
		for(ParamEntity e: paramList){
			int v = e.getValueType();
			Object o = e.getValue();
			if(o == null){//如果为空就设置为null
				pst.setNull(startIndex++, v);
				continue;
			}
			//判断参数实体ParamEntity中Object对象是哪一种jdbc数据类型			
			if(v == SQLTYPES[0]){				
				pst.setInt(startIndex++, (Integer) o);
			}else if(v == SQLTYPES[1]){
				pst.setLong(startIndex++, (Long) o);
			}else if(v == SQLTYPES[2]){
				pst.setString(startIndex++, (String) o);
			}else if(v == SQLTYPES[3]){
				pst.setDate(startIndex++, (Date) o);
			}else if(v == SQLTYPES[4]){
				pst.setTimestamp(startIndex++, (Timestamp) o);
			}else if(v == SQLTYPES[5]){
				pst.setDouble(startIndex++, (Double) o);
			}else if(v == SQLTYPES[6]){
				pst.setTime(startIndex++, (Time) o);
			}
		}
	}
	/***
	 * 为执行数据库的sql语句设置参数值
	 * @param pst
	 * @throws SQLException
	 */
	public void prepareStatement(PreparedStatement pst) throws SQLException{
		prepareStatement(pst, 1);
	}
}

jdbc数据类型的种类和该数据类型的对应的值, 相当于map中的 key和value,把这样的参数类型封装成一个实体对象

package com.hewen.param.manage;
/***
 * jdbc数据类型的种类和该数据类型的对应的值,
 * 相当于map中的 key和value,把这样的参数类型封装成一个实体对象
 * @author Administrator
 *
 */
public class ParamEntity {
	private Object value;//该jdbc数据类型的哪个类型
	private int sqlType;//jdbc数据类型的哪一种
	/***
	 * 
	 * @param value
	 * @param sqlType
	 */
	public ParamEntity(Object value, int sqlType){
		this.value = value;
		this.sqlType = sqlType;
	}
	
	public Object getValue() {
		return value;
	}
	public void setValue(Object value) {
		this.value = value;
	}
	public int getValueType() {
		return sqlType;
	}
	public void setValueType(int sqlType) {
		this.sqlType = sqlType;
	
	}
}

 一个公共的类,对数据库进行查询,添加、修改、删除操作,这里只用到了对数据库的关闭,其他功能在下面的文章进行讲解

package com.hewen.param.manage;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DBUtil {
	public static void rollBack(Connection con){
		try {
			con.rollback();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static List<Map<String, Object>> executeQuery(Connection con, String sql) throws SQLException{
		PreparedStatement pst = null;
		ResultSet rs = null;
		try {
			pst = con.prepareStatement(sql);
			rs = pst.executeQuery();
			return getListFromRs(rs);
		}finally{
			closeRs(rs);
			closePst(pst);
		}
	}
	
	public static List<Object> executeQuery(Connection con, String sql, Class<?> c) throws SQLException{
		PreparedStatement pst = null;
		ResultSet rs = null;
		try {
			pst = con.prepareStatement(sql);
			rs = pst.executeQuery();
			return getListFromRs(rs, c);
		}finally{
			closeRs(rs);
			closePst(pst);
		}
	}
	
	public static List<Map<String, Object>> getListFromRs(ResultSet rs) throws SQLException{
		ResultSetMetaData md = rs.getMetaData();
		int columns = md.getColumnCount();
		int i;
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		while(rs.next()){
			Map<String, Object> map = new HashMap<String, Object>();
			for(i = 0; i < columns; i++){
				map.put(md.getColumnName(i + 1), getValueByType(rs, md.getColumnType(i + 1), md.getColumnName(i + 1)));
			}
			list.add(map);
		}
		return list;
	}
	
	public static List<Map<String, Object>> getListFromRsLowerCase(ResultSet rs) throws SQLException{
		ResultSetMetaData md = rs.getMetaData();
		int columns = md.getColumnCount();
		int i;
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		while(rs.next()){
			Map<String, Object> map = new HashMap<String, Object>();
			for(i = 0; i < columns; i++){
				map.put(md.getColumnName(i + 1).toLowerCase(), getValueByType(rs, md.getColumnType(i + 1), md.getColumnName(i + 1)));
			}
			list.add(map);
		}
		return list;
	}
	
	public static List<Map<String, Object>> getListFromRsUpperCase(ResultSet rs) throws SQLException{
		ResultSetMetaData md = rs.getMetaData();
		int columns = md.getColumnCount();
		int i;
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		while(rs.next()){
			Map<String, Object> map = new HashMap<String, Object>();
			for(i = 0; i < columns; i++){
				map.put(md.getColumnName(i + 1).toUpperCase(), getValueByType(rs, md.getColumnType(i + 1), md.getColumnName(i + 1)));
			}
			list.add(map);
		}
		return list;
	}
	
	public static List<Object> getListFromRs(ResultSet rs, Class<?> c) throws SQLException{
		List<Object> list = new ArrayList<Object>();
		try {
			while(rs.next()){
				Object o = initObjectFromRs(rs, c);
				list.add(o);
			}
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	public static Object getFirstObjectFromRs(ResultSet rs, Class<?> c) throws SQLException{
		Object o = null;
		try {
			o = initObjectFromRsIfExist(rs, c);
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return o;
	}
	
	//根据类型获取值
	private static Object getValueByType(ResultSet rs, int type, String name) throws SQLException{
		switch(type){
			case Types.NUMERIC:
				return rs.getLong(name);
			case Types.VARCHAR:
				return rs.getString(name);
			case Types.DATE:
				return rs.getDate(name);
			case Types.TIMESTAMP:
				return rs.getTimestamp(name);
			case Types.INTEGER:
				return rs.getInt(name);
			case Types.DOUBLE:
				return rs.getDouble(name);
			case Types.FLOAT:
				return rs.getFloat(name);
			case Types.BIGINT:
				return rs.getLong(name);
			default:
				return rs.getObject(name);
		}
	}
	
	private static boolean rsContainsFields(ResultSet rs, String fieldName) throws SQLException{
		ResultSetMetaData md = rs.getMetaData();
		for(int i = 0; i < md.getColumnCount(); i++){
			if(md.getColumnName(i + 1).equalsIgnoreCase(fieldName)){
				return true;
			}
		}
		return false;
	}
	
	private static Object initObjectFromRs(ResultSet rs, Class<?> c) throws InstantiationException, SQLException, IllegalAccessException{
		Object o = c.newInstance();
		Method[] methods = o.getClass().getMethods();
		for(Method m: methods){
			if(m.getName().startsWith("set")){
				try {					
					m.invoke(o, getParamValueFromRs(rs, m));					
				} catch (IllegalArgumentException e) {
					throw new RuntimeException("IllegalArgumentException:" + e + "\nMethods:" + m.getName());
				} catch (InvocationTargetException e) {
					throw new RuntimeException("InvocationTargetException:" + e + "\nMethods:" + m.getName());
				}
			}
		}
		return o;
	}
	
	private static Object initObjectFromRsIfExist(ResultSet rs, Class<?> c) throws SQLException, IllegalAccessException, InstantiationException{
		Object o = c.newInstance();
		Method[] methods = o.getClass().getMethods();
		String field;
		for(Method m: methods){
			field = m.getName().substring(3);
			if(m.getName().startsWith("set") && rsContainsFields(rs, field)){
				try {					
					m.invoke(o, getParamValueFromRs(rs, m));					
				} catch (IllegalArgumentException e) {
					throw new RuntimeException("IllegalArgumentException:" + e + "\nMethods:" + m.getName());
				} catch (InvocationTargetException e) {
					throw new RuntimeException("InvocationTargetException:" + e + "\nMethods:" + m.getName());
				}
			}
		}
		return o;
	}
	
	private static Object getParamValueFromRs(ResultSet rs, Method m) throws SQLException
	{
		String fieldName = m.getName().substring(3);
		Type type = m.getGenericParameterTypes()[0];		
		return getValueFromRs(rs, fieldName, type);
	}
	
	private static Object getValueFromRs(ResultSet rs, String fieldName, Type t) throws SQLException{
		String type = t.toString();
		try{
			if(type.equals("int") || type.equals("class java.lang.Integer")){
				return rs.getInt(fieldName);
			}else if(type.equals("float") || type.equals("class java.lang.Float")){
				return rs.getFloat(fieldName);
			}else if(type.equals("double") || type.equals("class java.lang.Double")){
				return rs.getDouble(fieldName);
			}else if(type.equals("long") || type.equals("class java.lang.Long")){
				return rs.getLong(fieldName);
			}else if(type.equals("class java.lang.String")){
				return rs.getString(fieldName);
			}else if(type.equals("class java.sql.Timestamp")){
				return rs.getTimestamp(fieldName);
			}else if(type.equals("class java.sql.Date")){
				return rs.getDate(fieldName);
			}else if(type.equals("class java.sql.Time")){
				return rs.getTime(fieldName);
			}
		}catch(SQLException e){
			throw new SQLException("SQLException when get field:" + fieldName + "\n" + e);
		}
		throw new RuntimeException("getValueFromRsByField fail, field type is:" + type + ",field name is:" + fieldName);
	}
	
	public static void closeRs(ResultSet... rss){
		for(ResultSet rs: rss){
			if(rs != null){
				try {
					rs.close();
				} catch (SQLException e) {
				}
			}
		}
	}
	
	public static void closePst(Statement... psts){
		for(Statement pst: psts){
			if(pst != null){
				try {
					pst.close();
				} catch (SQLException e) {
				}
			}
		}
	}
	
	public static void closeCon(Connection... cons){
		for(Connection con: cons){
			if(con != null)
			{
				try {
					con.close();
				} catch (SQLException e) {
				}
			}
		}
	}
}

    运行的结果

remark:惠山分局钱桥派出所
stamp:2010-02-08 09:31:53

 

0
0
分享到:
评论

相关推荐

    sqljdbc和sqljdbc4 sqlserver最新驱动

    使用SQLJDBC或SQLJDBC4驱动,Java开发者可以使用JDBC API来创建数据库连接,执行SQL语句,处理结果集等。基本步骤如下: - 加载驱动:`Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");` - 建立...

    JDBC是执行SQL语句的Java API

    JDBC允许Java开发者通过编写Java代码来执行SQL语句,实现对数据库的操作,如查询、插入、更新和删除数据。 JDBC的主要优势在于其跨平台性和数据库无关性。与ODBC(Open Database Connectivity)不同,ODBC是一个...

    JDBC与SQL Server 2005的连接方式

    JDBC (Java Database Connectivity) 是 Java 开发语言中用于连接数据库的标准API,它允许Java程序通过标准SQL语句来查询或更新数据库中的数据。本文将详细介绍如何配置JDBC以实现与SQL Server 2005数据库的有效连接...

    jdbc连接sqlserver数据库连接代码

    Java Database Connectivity (JDBC) 是 Java 中一种用于执行 SQL 语句的标准 API,它允许 Java 应用程序通过统一的接口访问多种类型的数据库。本文将详细介绍如何使用 JDBC 连接 SQL Server 数据库,并创建表、插入...

    JDBC 连接SQL2005

    PreparedStatement允许在SQL语句中使用占位符,然后通过`setXXX()`方法设置参数。 此外,为了优化性能,可以使用Connection的事务管理功能,例如通过`conn.setAutoCommit(false)`来开启手动提交事务,然后在所有...

    JDBC连接SQL Server2008示例代码

    JDBC是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问接口,使得Java应用程序能够跨平台地访问各种类型的数据库。本文将详细介绍两种不同的连接方式:一种是基于SQL Server身份验证的方式,...

    执行sql语句,并将结果通过ArrayList返回。字段名统一大写 JDBC 连接数据库

    JDBC是一种用于执行SQL语句的标准Java API,它可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了诸如查询执行和结果处理等功能。 ##### 1. 获取数据库连接 在提供的代码中,...

    sqljdbc4 (SQL连接驱动包)

    11. **性能优化**:通过配置JDBC连接参数,如超时设置、连接池大小、批处理大小等,可以进一步优化`sqljdbc4`的性能。 总之,`sqljdbc4`作为微软提供的JDBC驱动,为Java开发者提供了便捷、高效的方式来访问和操作...

    springboot log4jdbc 打印完整sql

    当我们执行这个方法时,Log4jdbc 将打印出完整的 SQL 语句,包括参数 replacement: ``` DEBUG [main] JDBC - { conn:100, pstmt:102, sql:SELECT * FROM users WHERE name = ?, params:['John Doe'] } ``` 从上面的...

    动态拼接sql语句工具类,拼接where后面语句

    动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...

    java通过JDBC链接SQLServer2016

    ### 使用Java通过JDBC连接SQL ...此外,还可以利用JDBC进行更复杂的数据操作,如执行SQL语句、获取查询结果集等,从而满足不同的业务需求。希望本文能帮助大家更好地掌握这一技能,并在未来的工作和学习中加以应用。

    jdbc 连接 sql server 2005的驱动

    JDBC是Java平台中用于与各种数据库进行交互的一组接口和类,它允许Java开发者执行SQL语句并处理结果。在SQL Server 2005的场景中,你需要一个特定的JDBC驱动程序,通常是Microsoft提供的JDBC Driver for SQL Server...

    jdbc连接sqlserver2000 源码 jar

    总结,JDBC连接SQL Server 2000涉及到的关键点有:导入JDBC驱动库,注册驱动,创建数据库连接,执行SQL语句,处理结果集,以及正确关闭资源。"jdbc连接sqlserver2000 源码 jar"提供的资源正是帮助开发者完成这些任务...

    JDBC连接sqlserver与mysql

    4. **执行SQL语句**:通过`Connection`对象创建`Statement`或`PreparedStatement`实例,然后调用其`executeQuery()`或`executeUpdate()`方法执行SQL。 5. **处理结果**:如果执行的是查询操作,可以使用`ResultSet`...

    JDBC连接SQL Server 2008 R2的驱动

    JDBC驱动还提供了高级特性,如预编译的SQL语句(`PreparedStatement`)、存储过程调用、游标支持等,以便更高效、安全地与SQL Server交互。 对于SQL Server 2008 R2,了解JDBC驱动的使用是关键,但也要注意驱动的...

    jdbc连接sqlserver数据库sqljdbc4.zip

    总之,`jdbc连接sqlserver数据库sqljdbc4.zip`是一个提供Java连接SQL Server能力的驱动包,通过引入`sqljdbc4.jar`,开发者可以在Java应用程序中轻松地执行SQL语句,进行数据操作和管理。这个驱动的免费性质使得更多...

    sql server2000 jdbc

    要优化JDBC性能,可以考虑预编译SQL语句(使用`PreparedStatement`)、批量操作(使用`addBatch()`和`executeBatch()`)、使用最新的JDBC驱动,以及合理设置连接池参数。 以上就是关于"sql server2000 jdbc"的相关...

    sqljdbc和sqljdbc4

    SQLJDBC驱动程序允许Java开发者使用标准的JDBC API来执行SQL语句、处理结果集、事务管理和数据库连接管理。这些驱动程序在Java应用服务器、Web应用,如JSP(JavaServer Pages)中特别有用,因为它们提供了跨平台的...

    jdbc连接sqlserver2005

    它可以预编译SQL语句,并允许动态参数化。 ```java String sql = "INSERT INTO myTable (name, age) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "John"); pstmt....

Global site tag (gtag.js) - Google Analytics