最近实现了一个小功能,针对Oracle数据库两张关联表进行查询和修改,因为比较简单,所以选择了spring框架里的JdbcTemplate。JdbcTemplate算是老古董了,是当年spring为了封装JDBC对数据库繁琐的操作而搞出来一个模板,相比起spring框架后来搞的JPA就显得比较low了。但技术只有合适的,没有最好的。这次因为时间紧,功能简单,使用JPA反而有点杀猪用牛刀了。直接上例子:

  maven项目,当然先把依赖配置好了,spring框架的几个需要的jar包,这里只贴出来pom.xml里的依赖节点

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-core</artifactId>
  5. <version>4.3.12.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-context-support</artifactId>
  10. <version>4.3.12.RELEASE</version>
  11. <scope>compile</scope>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-context</artifactId>
  16. <version>4.3.12.RELEASE</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-jdbc</artifactId>
  21. <version>4.3.12.RELEASE</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.vividsolutions</groupId>
  25. <artifactId>jts</artifactId>
  26. <version>1.8</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>commons-dbcp</groupId>
  30. <artifactId>commons-dbcp</artifactId>
  31. <version>1.2.2</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>com.oracle</groupId>
  35. <artifactId>ojdbc14</artifactId>
  36. <version>10.2.0.2.0</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>junit</groupId>
  40. <artifactId>junit</artifactId>
  41. <version>4.12</version>
  42. <scope>test</scope>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.quartz-scheduler</groupId>
  46. <artifactId>quartz</artifactId>
  47. <version>2.3.0</version>
  48. </dependency>
  49. </dependencies>

  JdbcTemplate在spring-jdbc这个包里,如果需要用到事务,那么再引入一个tx包,我这里比较简单,无须用事务。commons-dbcp和ojdbc14这两个包是用来连接oracle数据库用的。接下来看spring的配置文件

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  3. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  9.  
  10. <context:annotation-config />
  11.  
  12. <bean id="PropertyConfig" class="com.inspur.chinanet.point.util.PropertiesConfigUtil">
  13. <property name="locations">
  14. <list>
  15. <value>classpath:global.properties</value>
  16. </list>
  17. </property>
  18. <property name="fileEncoding">
  19. <value>UTF-8</value>
  20. </property>
  21. <property name="ignoreResourceNotFound" value="true" />
  22. <property name="ignoreUnresolvablePlaceholders" value="true" />
  23. </bean>
  24.  
  25. <bean id="jdbcImpl" class="com.inspur.chinanet.point.dao.JdbcImpl" />
  26.  
  27. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  28. <property name="dataSource" ref="dataSource" />
  29. </bean>
  30.  
  31. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  32. <property name="driverClassName" value="${driver.class}" />
  33. <property name="url" value="${driver.url}" />
  34. <property name="username" value="${db.username}" />
  35. <property name="password" value="${db.password}" />
  36. </bean>
  37.  
  38. <!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法 -->
  39. <bean id="taskJob" class="com.inspur.chinanet.point.task.CirclePointTask" />
  40. <bean id="jobDetail"
  41. class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  42. <property name="group" value="circle_point_group" />
  43. <property name="name" value="circle_point_update" />
  44. <!--false表示等上一个任务执行完后再开启新的任务 -->
  45. <property name="concurrent" value="false" />
  46. <property name="targetObject">
  47. <ref bean="taskJob" />
  48. </property>
  49. <property name="targetMethod">
  50. <value>run</value>
  51. </property>
  52. </bean>
  53.  
  54. <!-- 调度触发器 -->
  55. <bean id="myTrigger"
  56. class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  57. <property name="name" value="circle_point_update" />
  58. <property name="group" value="circle_point_group" />
  59. <property name="jobDetail">
  60. <ref bean="jobDetail" />
  61. </property>
  62. <property name="cronExpression">
  63. <value>0 11 13 ? * *</value>
  64. </property>
  65. </bean>
  66.  
  67. <!-- 调度工厂 -->
  68. <bean id="scheduler"
  69. class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  70. <property name="triggers">
  71. <list>
  72. <ref bean="myTrigger" />
  73. </list>
  74. </property>
  75. </bean>
  76. </beans>

  这里先配置数据库的连接参数dataSource,然后把JdbcTemplate作为一个bean加载到spring容器中,然后我们就可以在DAO里执行数据库操作了。这里按spring提倡的面向接口编程,提供一个DAO的接口和实现类

  1. package com.inspur.chinanet.point.dao;
  2.  
  3. import java.sql.Date;
  4. import java.util.List;
  5. import java.util.Map;
  6.  
  7. /**
  8. * 数据库增删查改接口
  9. *
  10. * @author wulinfeng
  11. * @version C10 2018年1月25日
  12. * @since SDP V300R003C10
  13. */
  14. public interface JdbcInterface
  15. {
  16. /**
  17. * 查询所有多边形
  18. *
  19. * @author wulinfeng
  20. * @return
  21. */
  22. public List<Map<String, Object>> queryCircles();
  23.  
  24. /**
  25. * 根据日志查询点
  26. *
  27. * @author wulinfeng
  28. * @return
  29. */
  30. public List<Map<String, Object>> queryPoints(Date orderDate);
  31.  
  32. /**
  33. * 查询每一个点
  34. *
  35. * @author wulinfeng
  36. * @return
  37. */
  38. public List<Map<String, Object>> querySinglePoint(Date orderDate, String openNumber);
  39.  
  40. /**
  41. * 更新点所对应的多边形编码
  42. *
  43. * @author wulinfeng
  44. * @param circleId
  45. */
  46. public int updateCircleIdToPoint(Date orderDate, String openNumber, String longitude, String latitude,
  47. String gridId);
  48.  
  49. }

  实现类

  1. package com.inspur.chinanet.point.dao;
  2.  
  3. import java.sql.Date;
  4. import java.util.List;
  5. import java.util.Map;
  6.  
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.jdbc.core.JdbcTemplate;
  9.  
  10. public class JdbcImpl implements JdbcInterface
  11. {
  12. @Autowired
  13. private JdbcTemplate jdbcTemplate;
  14.  
  15. /**
  16. * 查询所有多边形
  17. *
  18. * @author wulinfeng
  19. * @return
  20. */
  21. public List<Map<String, Object>> queryCircles()
  22. {
  23. return jdbcTemplate.queryForList(
  24. "select OID, t.x LONGITUDE, t.y LATITUDE from I2_GRID_INFO_CUR,table (sdo_util.getvertices(LOCA_TION)) t");
  25. }
  26.  
  27. /**
  28. * 根据日志查询点
  29. *
  30. * @author wulinfeng
  31. * @return
  32. */
  33. public List<Map<String, Object>> queryPoints(Date orderDate)
  34. {
  35. return jdbcTemplate.queryForList(
  36. "select OPEN_NUMBER from ORDER_2I_NEW where ORDER_DATE = ? and LONGITUDE != null and LATITUDE != null",
  37. orderDate);
  38. }
  39.  
  40. /**
  41. * 查询每一个点
  42. *
  43. * @author wulinfeng
  44. * @return
  45. */
  46. public List<Map<String, Object>> querySinglePoint(Date orderDate, String openNumber)
  47. {
  48. return jdbcTemplate.queryForList(
  49. "select LONGITUDE,LATITUDE from ORDER_2I_NEW where ORDER_DATE = ? and OPEN_NUMBER = ?",
  50. new Object[] {orderDate, openNumber});
  51. }
  52.  
  53. /**
  54. * 更新网格id
  55. *
  56. * @author wulinfeng
  57. * @return
  58. */
  59. public int updateCircleIdToPoint(Date orderDate, String openNumber, String longitude, String latitude,
  60. String gridId)
  61. {
  62. return jdbcTemplate.update(
  63. "update ORDER_2I_NEW set GRID_ID = ? where ORDER_DATE = ? and OPEN_NUMBER = ? and LONGITUDE = ? and LATITUDE = ?",
  64. new Object[] {gridId, orderDate, openNumber, longitude, latitude});
  65. }
  66. }

  我们在实现类里通过JdbcTemplate执行query和update。因为这里查到的数据有多条记录,所以使用了queryForList,然后再把查到的记录通过map的key,即记录的字段名,来获取字段值。具体来看下第一条查询的处理:

  1. /**
  2. * 查询多边形,封装数据到map
  3. *
  4. * @author wulinfeng
  5. * @param jdbcImpl
  6. * @return
  7. */
  8. public static Map<String, String> dealCircles(JdbcImpl jdbcImpl)
  9. {
  10. LOG.info("Start to deal with Table : [I2_GRID_INFO_CUR] *****");
  11.  
  12. List<Map<String, Object>> circleDatas = jdbcImpl.queryCircles();
  13.  
  14. if (circleDatas == null || circleDatas.size() == 0)
  15. {
  16. LOG.warning("Table: [I2_GRID_INFO_CUR] is empty.");
  17. return null;
  18. }
  19.  
  20. Map<String, String> circleMap = null;
  21. circleMap = new HashMap<>();
  22.  
  23. String oId = null;
  24. String longitude_circle = null;
  25. String latitude_circle = null;
  26.  
  27. // 先遍历数据库查询的多边形列表,按oId为key,value拼接经纬度成类似:"39.8160521200 116.6385841370"
  28. for (Map<String, Object> circleItem : circleDatas)
  29. {
  30. oId = circleItem.get("OID").toString();
  31. longitude_circle = circleItem.get("LONGITUDE").toString();
  32. latitude_circle = circleItem.get("LATITUDE").toString();
  33.  
  34. // 数据校验
  35. if (StringUtils.isEmpty(oId))
  36. {
  37. LOG.warning("Field OID in Table [I2_GRID_INFO_CUR] is null.");
  38. continue;
  39. }
  40.  
  41. if (StringUtils.isEmpty(longitude_circle) || StringUtils.isEmpty(latitude_circle))
  42. {
  43. LOG.warning("Field LOCA_TION in Table [I2_GRID_INFO_CUR] has problem query by OID : " + oId);
  44. continue;
  45. }
  46.  
  47. // 合并相同oId经纬度
  48. if (!circleMap.containsKey(oId))
  49. {
  50. circleMap.put(oId, latitude_circle + " " + longitude_circle);
  51. }
  52. else
  53. {
  54. circleMap.put(oId, circleMap.get(oId) + "," + latitude_circle + " " + longitude_circle);
  55. }
  56. }
  57.  
  58. // 再遍历一次合并后的map,拼接成POLYGON ((39.8160521200 116.6385841370,39.8078766971 116.6742897034))"
  59. Iterator<String> it = circleMap.keySet().iterator();
  60. while (it.hasNext())
  61. {
  62. String key = it.next();
  63. circleMap.put(key, "POLYGON ((" + circleMap.get(key) + "))");
  64. }
  65.  
  66. LOG.info("Table: [I2_GRID_INFO_CUR] has " + circleMap.size() + " records.");
  67.  
  68. return circleMap;
  69. }

  我们看到这里查出I2_GRID_INFO_CUR表里所有记录,然后遍历记录list,通过map取出每条记录的3个字段值:OID、LONGITUDE和LATITUDE。最后我们回到spring配置文件,看下数据库连接的配置dataSource,这里是从global.properties里取到的配置参数:

  1. driver.class=oracle.jdbc.driver.OracleDriver
  2. driver.url=jdbc:oracle:thin:@192.168.12.3:1521:nwom
  3. db.username=wlf
  4. db.password=wlf

使用spring框架的JdbcTemplate实现对Oracle数据库的简单操作实例的更多相关文章

  1. jmeter实现对Oracle数据库的操作

    实现目的 有时候,根据业务需要,可能需要直接对数据库进行性能测试,此时可利用jmeter对Oracle.MySQL等数据库进行相关测试. 脚本实现 添加JDBC Connection Configur ...

  2. oracle数据库的简单操作

    本操作是在oracle的11g版本中的操作 一.数据库登录操作: 如果是在服务器上登录oracle,需要先切换到oracle用户再进行登录 #切换到oracle用户 su - oracle #登录or ...

  3. Spring框架之JdbcTemplate

    Spring框架之JdbcTemplate 一.JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到Jd ...

  4. C# - VS2019 通过DataGridView实现对Oracle数据表的增删改查

    前言 通过VS2019建立WinFrm应用程序,搭建桌面程序后,通过封装数据库操作OracleHelper类和业务逻辑操作OracleSQL类,进而通过DataGridView实现对Oracle数据表 ...

  5. 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

    1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...

  6. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  7. 实现对MySQL数据库进行分库/分表备份(shell脚本)

    工作中,往往数据库备份是件非常重要的事情,毕竟数据就是金钱,就是生命!废话不多,下面介绍一下:如何实现对MySQL数据库进行分库备份(shell脚本) Mysq数据库dump备份/还原语法: mysq ...

  8. Oracle数据库安装图文操作步骤1

    Oracle数据库安装图文操作步骤 一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符.   官 ...

  9. oracle数据库的导入 导出实例

    oracle数据库的导入 导出实例 分类: DataBase2011-09-07 23:25 377人阅读 评论(0) 收藏 举报 数据库oraclefileusercmdservice 我要从另外一 ...

随机推荐

  1. Java JDBC概要总结一(基本操作和SQL注入问题)

    JDBC定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同的关系 ...

  2. idea使用maven骨架创建maven项目

    Maven 骨架创建 Java Web 项目 1) File -> New -> Project... 2) 如下图 3)如下图 GroupId和ArtifactId<项目名> ...

  3. LeetCode—— Invert Binary Tree

    LeetCode-- Invert Binary Tree Question invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 ...

  4. 完全理解Android中的RemoteViews

    一.什么是RemoteViews RemoteViews翻译过来就是远程视图.顾名思义,RemoteViews不是当前进程的View,是属于SystemServer进程.应用程序与RemoteView ...

  5. C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

    C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...

  6. c# 使用事务

    EcAttendanceMatterBLL.OpenTransaction(); DbTransaction Tran = EcAttendanceMatterBLL.Transaction; _wf ...

  7. 智课雅思词汇---二十五、形容词后缀-ate-fic-ose-ulent-olent-ous-ulous-y

    智课雅思词汇---二十五.形容词后缀-ate-fic-ose-ulent-olent-ous-ulous-y 一.总结 一句话总结: 1.形容词后缀-ate(determinate)? determi ...

  8. C++(十八) — 内存模式、堆和栈

    1.内存模式 一个程序执行时,先复制到内存,然后CPU逐句读取指令执行. 每个存储单元存放一个字节(8bit)数据,每个有一个唯一的地址,地址是顺序编码的.比如:一台计算机256MB内存,则有256* ...

  9. <mvc:default-servlet-handler/>的作用

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  10. python迭代器与生成器(二)

      一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中 ...