- 浏览: 238787 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 2675本篇文章主要是为了想研究Netty打基础 一、http ... -
Netty源代码框架剖析( 二 )
2011-04-06 11:28 2907主要想介绍一下一般想研究开源软件的框架,源代码是如何下 ... -
Netty源代码框架剖析( 一 )
2011-04-06 11:14 2048一、前言 研究Netty源代码已经有了半个月左右,我想 ... -
从数据库得到的结果集存放到List集合中
2010-09-08 21:01 52448一、业务阐述 在开发中查询的数据库结果集,既要连接数据库 ... -
HTTP请求的数据映射到封装的DAO
2010-09-06 22:09 2675一、业务背景 web前端发送一系列数据给后台,这些数据包含字 ...
相关推荐
使用SQLJDBC或SQLJDBC4驱动,Java开发者可以使用JDBC API来创建数据库连接,执行SQL语句,处理结果集等。基本步骤如下: - 加载驱动:`Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");` - 建立...
JDBC允许Java开发者通过编写Java代码来执行SQL语句,实现对数据库的操作,如查询、插入、更新和删除数据。 JDBC的主要优势在于其跨平台性和数据库无关性。与ODBC(Open Database Connectivity)不同,ODBC是一个...
JDBC (Java Database Connectivity) 是 Java 开发语言中用于连接数据库的标准API,它允许Java程序通过标准SQL语句来查询或更新数据库中的数据。本文将详细介绍如何配置JDBC以实现与SQL Server 2005数据库的有效连接...
Java Database Connectivity (JDBC) 是 Java 中一种用于执行 SQL 语句的标准 API,它允许 Java 应用程序通过统一的接口访问多种类型的数据库。本文将详细介绍如何使用 JDBC 连接 SQL Server 数据库,并创建表、插入...
PreparedStatement允许在SQL语句中使用占位符,然后通过`setXXX()`方法设置参数。 此外,为了优化性能,可以使用Connection的事务管理功能,例如通过`conn.setAutoCommit(false)`来开启手动提交事务,然后在所有...
JDBC是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问接口,使得Java应用程序能够跨平台地访问各种类型的数据库。本文将详细介绍两种不同的连接方式:一种是基于SQL Server身份验证的方式,...
JDBC是一种用于执行SQL语句的标准Java API,它可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了诸如查询执行和结果处理等功能。 ##### 1. 获取数据库连接 在提供的代码中,...
11. **性能优化**:通过配置JDBC连接参数,如超时设置、连接池大小、批处理大小等,可以进一步优化`sqljdbc4`的性能。 总之,`sqljdbc4`作为微软提供的JDBC驱动,为Java开发者提供了便捷、高效的方式来访问和操作...
当我们执行这个方法时,Log4jdbc 将打印出完整的 SQL 语句,包括参数 replacement: ``` DEBUG [main] JDBC - { conn:100, pstmt:102, sql:SELECT * FROM users WHERE name = ?, params:['John Doe'] } ``` 从上面的...
动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...
### 使用Java通过JDBC连接SQL ...此外,还可以利用JDBC进行更复杂的数据操作,如执行SQL语句、获取查询结果集等,从而满足不同的业务需求。希望本文能帮助大家更好地掌握这一技能,并在未来的工作和学习中加以应用。
JDBC是Java平台中用于与各种数据库进行交互的一组接口和类,它允许Java开发者执行SQL语句并处理结果。在SQL Server 2005的场景中,你需要一个特定的JDBC驱动程序,通常是Microsoft提供的JDBC Driver for SQL Server...
总结,JDBC连接SQL Server 2000涉及到的关键点有:导入JDBC驱动库,注册驱动,创建数据库连接,执行SQL语句,处理结果集,以及正确关闭资源。"jdbc连接sqlserver2000 源码 jar"提供的资源正是帮助开发者完成这些任务...
4. **执行SQL语句**:通过`Connection`对象创建`Statement`或`PreparedStatement`实例,然后调用其`executeQuery()`或`executeUpdate()`方法执行SQL。 5. **处理结果**:如果执行的是查询操作,可以使用`ResultSet`...
JDBC驱动还提供了高级特性,如预编译的SQL语句(`PreparedStatement`)、存储过程调用、游标支持等,以便更高效、安全地与SQL Server交互。 对于SQL Server 2008 R2,了解JDBC驱动的使用是关键,但也要注意驱动的...
总之,`jdbc连接sqlserver数据库sqljdbc4.zip`是一个提供Java连接SQL Server能力的驱动包,通过引入`sqljdbc4.jar`,开发者可以在Java应用程序中轻松地执行SQL语句,进行数据操作和管理。这个驱动的免费性质使得更多...
要优化JDBC性能,可以考虑预编译SQL语句(使用`PreparedStatement`)、批量操作(使用`addBatch()`和`executeBatch()`)、使用最新的JDBC驱动,以及合理设置连接池参数。 以上就是关于"sql server2000 jdbc"的相关...
SQLJDBC驱动程序允许Java开发者使用标准的JDBC API来执行SQL语句、处理结果集、事务管理和数据库连接管理。这些驱动程序在Java应用服务器、Web应用,如JSP(JavaServer Pages)中特别有用,因为它们提供了跨平台的...
它可以预编译SQL语句,并允许动态参数化。 ```java String sql = "INSERT INTO myTable (name, age) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "John"); pstmt....