- 浏览: 234026 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
mhsjlove:
正则表达式的捕获组比这好用多了
高效率分离字符串到一个Map中 -
yk0025:
正在研究中。。。
Antx学习总结 -
asialee:
博主这块写的挺好的,我完全看了,不过我也写了一些关于编解码器的 ...
Netty源代码框架剖析( 二 ) -
he_wen:
不能够停止tomcat的话 kill -9 进程号 得到进程 ...
检查tomcat是否宕机 -
zhangyou1010:
catalina.sh stop 如果这个不能停止tomc ...
检查tomcat是否宕机
各位网友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
- DBParamManage.rar (1.1 MB)
- 描述: 源代码
- 下载次数: 45
发表评论
-
Netty源代码框架剖析( 三 )
2011-04-06 14:35 2599本篇文章主要是为了想研究Netty打基础 一、http ... -
Netty源代码框架剖析( 二 )
2011-04-06 11:28 2862主要想介绍一下一般想研究开源软件的框架,源代码是如何下 ... -
Netty源代码框架剖析( 一 )
2011-04-06 11:14 1951一、前言 研究Netty源代码已经有了半个月左右,我想 ... -
从数据库得到的结果集存放到List集合中
2010-09-08 21:01 52372一、业务阐述 在开发中查询的数据库结果集,既要连接数据库 ... -
HTTP请求的数据映射到封装的DAO
2010-09-06 22:09 2633一、业务背景 web前端发送一系列数据给后台,这些数据包含字 ...
相关推荐
sql语句分页查询 自己总结下来的 希望能给大家一点帮助!
Jmeter中JDBC request多条SQL语句使用
动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...
JDBC是执行SQL语句的Java API。其实,JDBC本身是一个产品的商标名。相对与ODBC(Open Database Connectivity开放数据库连接),也可以把JDBC看作“Java Database Connectivity(Java数据库连接)”。它由一组用Java...
很详细的讲解如何在Myeclipse中用jdbc连接数据库
这是JDBC连接SQL Server2008示例代码,其中有一份是在“SQL Server Authentication”模式下的,即需要账号密码,另一份为在“Windows Authentication”模式下的,不需要账号密码
执行sql语句, 并将结果通过ArrayList返回。字段名统一大写 比如 select * FROM A 返回的List中包含了所有A表中的字段值,通过MAP来取,字段名统一大写。 只有两个方法,没有示例,请自行编写测试。主体结构肯定是...
com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作 解决方案
打印完整带参数sql,不用自己去替换问号,后端省时省力。
是一个有用户,商品分类,商品,订单和订单相信五个表的简单数据库SQL语句,这是在学习jdbc是专门用来练习使用的。
JDBC+注册驱动+获取连接+定义sql语句+获取执行sql对象+执行sql
P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的。 p6spy的安装步骤: 1. 下载p6spy的安装包 2. 把p6spy的jar包放到Classpath中,如果是WEB App...
2、在日志系统中设置jdbc.sqlonly、jdbc.sqltiming等日志级别,可直接将log4jdbc doc中的日志内容copy过去; 3、运行系统测试,到对应日志文件中查看SQL相关信息; zip文件里已经包括所有依赖包,除了数据库驱动。 ...
DBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和...
JDBC API 主要用来连接数据库并通过 SQL 语句操作数据库。它可以执行一般的 SQL 语句、动态 SQL 语句及带 IN 和 OUT参数的存储过程。通过使用 JDBC 简化了开发数据库应用的复杂度, 加快了开发速度。开发人员可以很...
sqlserver各版本驱动 DriverManager:负责...Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)
JAVA的SQL帮助类,帮助使用jdbc快速使用SQL语句更新,删除,查询数据,只需要专注于SQL语句的执行,而不需要写数据库的连接与释放
java十分经典的jdbc增删改查程序,含sql语句
Transact-SQL语句总汇