大家J2EE开发时对数据库版本控制进行版本控制吗

Git, Subversion 和其它版本控制系统非常适合一个团队和项目管理,确保在团队中的每个人都得到每个文件的最新版本。
然而,数据库版本控制并不是这些系统的内置功能,但是他们也应该同步。
DBV 是一个开源和PHP开发的应用程序,能够帮助我们将数据库包含在我们使用的版本控制系统中。
一旦安装完毕,它会跟踪每个结构/记录的变化(表,行,列,视图,函数等),使我们能够导出一个SQL文件,反映变化。这个SQL文件将会提交到版本控制系统中,团队中的其它成员就能够收到这个文件。
DBV 默认支持MySQL,它还拥有一个简单的接口用于支持其它任何数据库的连接器。
项目地址,github地址。
资源整理者简介:
可能感兴趣的文章
按分类快速查找
关于资源导航
伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1439 项工具资源。
关于资源导航
伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。
新浪微博:
推荐微信号
(加好友请注明来意)
- 好的话题、有启发的回复、值得信赖的圈子
- 分享和发现有价值的内容与观点
- 为IT单身男女服务的征婚传播平台
- 优秀的工具资源导航
- 翻译传播优秀的外文文章
- 国内外的精选博客文章
- UI,网页,交互和用户体验
- 专注iOS技术分享
- 专注Android技术分享
- JavaScript, HTML5, CSS
- 专注Java技术分享
- 专注Python技术分享
& 2017 伯乐在线> 博客详情
摘要: windows版
java工具 jdk:java开发运行环境 lombok:减少javabean的set、get方法及构造方法代码的一个插件。
java IDE eclipse:代码开发工具 IntelliJ IDEA:代码开发工具
web服务器 tomcat:web服务器 jetty:web服务器 JBoss:web服务器 wrapper:应用服务器
项目版本管理工具 git:版本控制器 gitbash:git命令行工具,可在windows下执行linux命令
项目构建工具 maven:项目构建工具
热部署插件 jrebel:java热部署插件
数据库 mysql:数据库 mysql workbench:mysql官方提供的可视化操作工具 Navicat Premium:mysql可视化操作工具 oracle:数据库 plsql:oracle数据库可视化操作工具 sql server:数据库 达梦数据库:数据库
抓包工具 postman:http请求测试工具 Charles:请求抓包工具
虚拟机 VMware Workstation:系统虚拟机(安装多个操作系统)
前端开发工具 HBuilder:HTML、CSS、JS开发工具 webstorm:JS IDE开发工具,跟idea同一个公司开发
远程操作软件 TeamViewer:远程操作电脑软件
文本文件比较工具 BCompare
文本编辑工具 notepad
windows下操作linux系统软件: securecrt:命令行软件 WinSCP:可视化文件操作软件
ftp工具 8UFTP
系统安装工具 老毛桃 小马PE
网盘工具 百度网盘 微云
本地日记 eDiary
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥博客分类:
以前和这个项目的策划人聊天,问他为什么不用Java,他说asp.net比Java开发周期短。我问为什么,他也说不出来。
不过现在这个项目确实开发很快
但这个.net 项目是怎么做的啊,说白了,就两层,表现+db。就是用工厂生成一个数据库接口的实现类,在页面调,然后和所谓的控件绑定,我们要做的工作就是写sql+页面的表现。
我想这个架构Java不能用吗?。我刚开始学Java的时候就是这么写的(无非就是我自己把数据放到list里面,而。net 中有datatable类,这个没什么啊,我自己可以写个标签和自己的list自动属性匹配生成数据啊)。
如果业务复杂点,如果还这么搞,我想开发人员和以后的维护人员都会骂人的。
写了这么多其实我想说的就是,很多人都说asp.net比java的开发效率高,我真没看出来,我唯一感觉的是asp.net的学习起点比j2ee的低。
谁能告诉我:问什么那么多人都说asp.net的开发效率高
论坛回复 /
(26 / 6243)
关键还是你怎么去看到这个问题。 java开发效率低下是有目共睹的,所以有rails,有django来抢地盘。
用传统的asp.net,你的着眼点应该在于控件,每个控件应该包含了自有的商业逻辑,然后用个模板来填充控件,开发起来就很欢乐。
所有大公司用java倒不见得,一个大公司里系统纷纷扰扰,各种乱糟糟的系统都有,银行里(中行还是什么)的柜员机也有用XP。(其实很简单,你把XP固化到ROM里,中个屁病毒)
windows如果只是为了卖VLK的话,那它可以说得上成功了。但是所有银行的服务器端现在都基本90%是java+linux。
MS整整错过了一个时代。MS早该拆分的,这样才能真正缔造一个帝国,现在S*B领军,啥希望也没有。看看人家Oracle值多少钱?Mssql值多少钱?QQ值多少钱?MSN值多少钱?Oracle买个破hyperion都几个billion,MS那个BI现在拆出来送人都不值几个钱了吧。WP就从头到尾10年都是个笑话。IE居然靠着垄断也被人从份额到性能都追上,拜托,人家是开源的,难道改一改代码用.net再实现一边很难吗?xbox,现在收回本了没有?任天堂值500亿美金。
回头看10年前的潮头儿,如果yahoo还能自我安慰说碰到Google这样神一样的对手,Cisco还可以说碰到华为这样的疯子。MS只能怨自己有个猪一样的总裁。在founder里面能弱成这样的,我只能说鲍尔默碰到盖茨和艾伦真是他祖上18辈铺路搭桥积德了。
MS还是改行做风投吧,别搞软件了,现在评点一下过去10年MS做的最成功的是入股5%的苹果和facebook。
BTW:最后你根本不明白为啥银行用java。java就是语言中AK47,虽然不一定好用,但是是用来军队定装最好的选择,代码有个相对可靠的下限,能完成C++以外基本所有功能并保证一定的代码下限。这点就把所有别的语言都抛到九霄云外去了。一个citi就有10万程序员,你指望他们用rails吗?
chinata 写道kulinglei 写道大姨妈好!
1:说起这个vs,感觉很不爽啊,也许是自己不会用,我用的是2005。感觉那个编译很差劲,有时有些包需要单独的编译,整个项目编译还不行。目前还没找到原因
2:版本控制用vss2005,vs有时有些代码刷不下来,同时其他的可以刷下来。但如果用vss客户端就可以刷下来。在代码全部提交的情况下
3:asp.net的控件(用的是.net自带的)生成一些table,而我们的美工用div布局,相当多的页面都变形了
这些问题搞的我们是相当的累啊,囧
.net有很多问题。在只有少量页面(n&10)的情况下,asp.net的开发速度秒杀java。页面多起来以后,这个优势就开始迅速下降。
asp的优势在于封装页面状态,java里你必须自己维护状态(当然如果用的好struts或者tapestry,可以达到类似的效果)。坏处在于用.net起步的程序员长期看进步会比较小 --- 我们公司现在面试.net程序员,基本上招进来的都是java进来再转,面纯.net背景的,90%答案都很欢乐。
本质来说,.net技术上非常漂亮,Anders天赋绝对远在高斯林之上。可惜MS不仅仅有Anders,还有个弱智总裁。其实本来.net虽然后发,但是很有机会击败java的。可惜要绑windows,我就不明白MS有些人脑子有大便还是咋的,生生把所有大公司和银行都推到java那边去了。如果时光推后几年,Anders其实还是去google更好(哪怕去apple也不错),还有一个选项是高盛---不过那样就只能做那个高盛自己玩的那个破语言了,对软件业是个损失。
PS:昨天看几个MS自己的人说skype值85亿,msn估计白送也没人要。对比来QQ和android,我觉得msn和wp这2个项目的总裁是不是和鲍尔默有啥基情啊,弱成这个样子也能拿块布盖着脸接着混
关键还是你怎么去看到这个问题。 java开发效率低下是有目共睹的,所以有rails,有django来抢地盘。
用传统的asp.net,你的着眼点应该在于控件,每个控件应该包含了自有的商业逻辑,然后用个模板来填充控件,开发起来就很欢乐。
所有大公司用java倒不见得,一个大公司里系统纷纷扰扰,各种乱糟糟的系统都有,银行里(中行还是什么)的柜员机也有用XP。(其实很简单,你把XP固化到ROM里,中个屁病毒)
建行的atm。。用win 2000
kulinglei 写道大姨妈好!
1:说起这个vs,感觉很不爽啊,也许是自己不会用,我用的是2005。感觉那个编译很差劲,有时有些包需要单独的编译,整个项目编译还不行。目前还没找到原因
2:版本控制用vss2005,vs有时有些代码刷不下来,同时其他的可以刷下来。但如果用vss客户端就可以刷下来。在代码全部提交的情况下
3:asp.net的控件(用的是.net自带的)生成一些table,而我们的美工用div布局,相当多的页面都变形了
这些问题搞的我们是相当的累啊,囧
.net有很多问题。在只有少量页面(n&10)的情况下,asp.net的开发速度秒杀java。页面多起来以后,这个优势就开始迅速下降。
asp的优势在于封装页面状态,java里你必须自己维护状态(当然如果用的好struts或者tapestry,可以达到类似的效果)。坏处在于用.net起步的程序员长期看进步会比较小 --- 我们公司现在面试.net程序员,基本上招进来的都是java进来再转,面纯.net背景的,90%答案都很欢乐。
本质来说,.net技术上非常漂亮,Anders天赋绝对远在高斯林之上。可惜MS不仅仅有Anders,还有个弱智总裁。其实本来.net虽然后发,但是很有机会击败java的。可惜要绑windows,我就不明白MS有些人脑子有大便还是咋的,生生把所有大公司和银行都推到java那边去了。如果时光推后几年,Anders其实还是去google更好(哪怕去apple也不错),还有一个选项是高盛---不过那样就只能做那个高盛自己玩的那个破语言了,对软件业是个损失。
PS:昨天看几个MS自己的人说skype值85亿,msn估计白送也没人要。对比来QQ和android,我觉得msn和wp这2个项目的总裁是不是和鲍尔默有啥基情啊,弱成这个样子也能拿块布盖着脸接着混
关键还是你怎么去看到这个问题。 java开发效率低下是有目共睹的,所以有rails,有django来抢地盘。
用传统的asp.net,你的着眼点应该在于控件,每个控件应该包含了自有的商业逻辑,然后用个模板来填充控件,开发起来就很欢乐。
所有大公司用java倒不见得,一个大公司里系统纷纷扰扰,各种乱糟糟的系统都有,银行里(中行还是什么)的柜员机也有用XP。(其实很简单,你把XP固化到ROM里,中个屁病毒)
大姨妈好!
1:说起这个vs,感觉很不爽啊,也许是自己不会用,我用的是2005。感觉那个编译很差劲,有时有些包需要单独的编译,整个项目编译还不行。目前还没找到原因
2:版本控制用vss2005,vs有时有些代码刷不下来,同时其他的可以刷下来。但如果用vss客户端就可以刷下来。在代码全部提交的情况下
3:asp.net的控件(用的是.net自带的)生成一些table,而我们的美工用div布局,相当多的页面都变形了
这些问题搞的我们是相当的累啊,囧
.net有很多问题。在只有少量页面(n&10)的情况下,asp.net的开发速度秒杀java。页面多起来以后,这个优势就开始迅速下降。
asp的优势在于封装页面状态,java里你必须自己维护状态(当然如果用的好struts或者tapestry,可以达到类似的效果)。坏处在于用.net起步的程序员长期看进步会比较小 --- 我们公司现在面试.net程序员,基本上招进来的都是java进来再转,面纯.net背景的,90%答案都很欢乐。
本质来说,.net技术上非常漂亮,Anders天赋绝对远在高斯林之上。可惜MS不仅仅有Anders,还有个弱智总裁。其实本来.net虽然后发,但是很有机会击败java的。可惜要绑windows,我就不明白MS有些人脑子有大便还是咋的,生生把所有大公司和银行都推到java那边去了。如果时光推后几年,Anders其实还是去google更好(哪怕去apple也不错),还有一个选项是高盛---不过那样就只能做那个高盛自己玩的那个破语言了,对软件业是个损失。
PS:昨天看几个MS自己的人说skype值85亿,msn估计白送也没人要。对比来QQ和android,我觉得msn和wp这2个项目的总裁是不是和鲍尔默有啥基情啊,弱成这个样子也能拿块布盖着脸接着混
2 下一页 &
浏览: 67654 次
来自: 深圳
高手带我星际哈,java
kulinglei 写道呵呵,她去年结婚了,我还是单身太让我失 ...
呵呵,她去年结婚了,我还是单身
5.1去岳父家面试。。 7.25就分手了。。。 现在是不是快结 ...
bonny 写道据我所知,国内情况大姨妈说的对。国外的情况的确 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'  推荐期刊投稿
&&&免费论文
&&&收费论文
&&&浏览历史J2ee开发用到的数据库操作类大全 - CSDN博客
J2ee开发用到的数据库操作类大全
J2ee项目开发过程中用到的数据库操作类
此数据库操作封装类在一个省级项目中使用到,在一个集团公司的科技管理项目中也使用过.
package jing.
import java.sql.*;
import java.util.*;
import javax.sql.rowset.CachedRowS
import oracle.jdbc.rowset.OracleCachedRowS
import com.sun.rowset.CachedRowSetI
&* Title:数据库操作类,有数据事物控制功能,请注意main函数中的调用事例
&* @author 欧朝敬
&* @version 1.0
public class DBManager {
&public DBManager(){
& * 开始事务
&public void beginTransaction() {
&&&Connection con = ConnectionFactory.getInstance().getConnection();
&&&con.setAutoCommit(false);
&&} catch (Exception e) {
&&&e.printStackTrace();
& * 回滚事务
&public void rollbackTransactoin() {
&&&Connection con = ConnectionFactory.getInstance().getConnection();
&&&con.rollback();
&&} catch (Exception e) {
&&&e.printStackTrace();
& * 提交事务
&public void commitTransaction() {
&&&Connection con = ConnectionFactory.getInstance().getConnection();
&&&con.setAutoCommit(true);
&&&ConnectionFactory.getInstance().closeConnection();
&&} catch (Exception e) {
&&&e.printStackTrace();
& * 结束事务
//&public void endTransaction() {
//&&&Connection con = ConnectionFactory.getInstance().getConnection();
//&&&mit();
//&&&con.setAutoCommit(true);
//&&&ConnectionFactory.getInstance().closeConnection();
//&&} catch (Exception e) {
//&&&e.printStackTrace();
&public boolean execute(String sql) throws Exception {
&&System.out.println(&execute:& + sql);
&&boolean re =
&&Connection con =
&&PreparedStatement pstmt =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&pstmt =con.prepareStatement(sql);
&&&re = pstmt.execute();
&&}catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&} finally {
&&&if (pstmt != null) {
&&&&pstmt.close();
& * 批量执行SQL语句,在一个事物里
& * @param sql
& * @return
& * @throws Exception
&public int[] executeBatch(String[] sql) throws Exception {
&&int[] re=;
&&Connection con =
&&Statement stmt =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&con.setAutoCommit(false);
&&&stmt =con.createStatement();
&&&stmt.clearBatch();
&&&for(int i=0;i&sql.i++){
&&&&stmt.addBatch(sql[i]);
&&&&System.out.println(&executeBatch:& + sql[i]);
&&&re = stmt.executeBatch();
&&}catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&finally {
&&&if (stmt != null) {
&&&&stmt.close();
& * @param sql
& * @param value
& * @param type
& * @return
& * @throws Exception
&public boolean execute(String sql, String[] value, int[] type)
&throws Exception {
&&System.out.println(&execute:& + sql);
&&boolean re =
&&Connection con =
&&PreparedStatement pstmt =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
&&&&&ResultSet.CONCUR_UPDATABLE);
&&&this.setParameters(pstmt,value,type);& //调用私有方法设置参数
&&&re = pstmt.execute();
&&} catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&}finally {
&&&if (pstmt != null) {
&&&&pstmt.close();
& * 执行查询,返回结果集 隐式事物处理
& * @param sql String 要执行的SELECT语句
& * @return CachedRowSet 未查到记录则返回null
& * @throws Exception
&public CachedRowSet executeQueryCachedRowSet(String sql) throws Exception {
&&System.out.println(&executeQueryCachedRowSet:& + sql);
&&CachedRowSet crs =
&&//OracleCachedRowSet crs=
&&Connection con =
&&PreparedStatement pstmt =
&&ResultSet rs =
&&&con =& ConnectionFactory.getInstance().getConnection();
&&&/*stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,&ResultSet.CONCUR_UPDATABLE);
&&& * java.sql.SQLException: 不允许的操作: Unsupported syntax for refreshRow()
&&& * Oracle: Unsupported syntax for refreshRow()报此错使用以下方式解决
&&& * 1、con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
&&& * 2、con.createStatement();
&&&pstmt=con.prepareStatement(sql);
&&&rs = pstmt.executeQuery();
&&&if (!(rs.isBeforeFirst() == rs.isAfterLast())) {
&&&&crs = new CachedRowSetImpl();
&&&&//crs = new OracleCachedRowSet();
&&&&crs.populate(rs);
&&} catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&}finally {
&&&if (rs != null) {
&&&&rs.close();
&&&if (pstmt != null) {
&&&&pstmt.close();
&/**使用OracleCachedRowSet实现,专门处理Oracle特有的SQL语句
& * 执行查询,返回结果集 隐式事物处理
& * @param sql String 要执行的SELECT语句
& * @return OracleCachedRowSet 未查到记录则返回null
& * @throws Exception
&public OracleCachedRowSet executeQueryOracleCachedRowSet(String sql) throws Exception {
&&System.out.println(&executeQueryOracleCachedRowSet:& + sql);
&&OracleCachedRowSet crs=
&&Connection con =
&&PreparedStatement pstmt =
&&ResultSet rs =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&/*stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,&ResultSet.CONCUR_UPDATABLE);
&&& * java.sql.SQLException: 不允许的操作: Unsupported syntax for refreshRow()
&&& * Oracle: Unsupported syntax for refreshRow()报此错使用以下方式解决
&&& * 1、con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
&&& * 2、con.createStatement();
&&&pstmt=con.prepareStatement(sql);
&&&rs = pstmt.executeQuery();
&&&if (!(rs.isBeforeFirst() == rs.isAfterLast())) {
&&&&crs = new OracleCachedRowSet();
&&&&crs.populate(rs);
&&}catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&} finally {
&&&if (rs != null) {
&&&&rs.close();
&&&if (pstmt != null) {
&&&&pstmt.close();
& * 执行高效率的SELECT语句,使用ORACLE的SQL特点
& * @param sql&String 带?号的SELECT语句
& * @param value&String[] ?对应的值
& * @param type&int[] ?对应的值的数据库表中的类型
& * @return CachedRowSet 未查到记录则返回null
& * @throws Exception
&public CachedRowSet executeQueryCachedRowSet(String sql, String[] value,
&&&int[] type) throws Exception {
&&System.out.println(&executeQueryRowSet:& + sql);
&&CachedRowSet crs =
&&Connection con =
&&PreparedStatement pstmt =
&&ResultSet rs =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
&&&&&ResultSet.CONCUR_UPDATABLE);
&&&this.setParameters(pstmt,value,type);& //调用私有方法设置参数
&&&rs = pstmt.executeQuery();
&&&if (!(rs.isBeforeFirst() == rs.isAfterLast())) {
&&&&crs = new CachedRowSetImpl();
&&&&crs.populate(rs);
&&}catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&} finally {
&&&if (rs != null) {
&&&&rs.close();
&&&if (pstmt != null) {
&&&&pstmt.close();
& * 执行查询,返回Map单条记录,如查执行结果有多条记录的情况下也只返回第一条记录 隐式事物处理
& * @param sql&String 要执行的SELECT语句
& * @return Map 未查到记录则返回null,使用列名的大家做为Map的Key,列值对象为Map的value
& * @throws Exception
&public Map executeQueryMap(String sql) throws Exception {
&&System.out.println(&executeQueryMap:& + sql);
&&Map map =
&&Connection con =
&&PreparedStatement pstmt =
&&ResultSet rs =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&pstmt =con.prepareStatement(sql);
&&&rs = pstmt.executeQuery();
&&&if (rs.next()) { // 有记录的情况
&&&&map = new HashMap();
&&&&ResultSetMetaData rsm = rs.getMetaData();
&&&&int colnum = rsm.getColumnCount(); // 得到记录的列数
&&&&for (int i = 1; i &= i++) {
&&&&&// rsm.getColumnName(i).toUpperCase()统一列名大写
&&&&&// rs.getObject(i)更的值为对象类型
&&&&&&&.put(rsm.getColumnName(i).toUpperCase(), rs
&&&&&&&&&.getObject(i));
&&} catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&}finally {
&&&if (rs != null) {
&&&&rs.close();
&&&if (pstmt != null) {
&&&&pstmt.close();
& * 执行高效率的SELECT语句,使用ORACLE的SQL特点
& * @param sql& String 带?号的SELECT语句
& * @param value String[] ?对应的值
& * @param type int[] ?对应的值的数据库表中的类型
& * @return Map 未查到记录则返回null,使用列名的大家做为Map的Key,列值对象为Map的value
& * @throws Exception
&public Map executeQueryMap(String sql, String[] value, int[] type)
&&&throws Exception {
&&System.out.println(&executeQueryMap:& + sql);
&&Map map =
&&Connection con =
&&PreparedStatement pstmt =
&&ResultSet rs =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
&&&&&ResultSet.CONCUR_UPDATABLE);
&&&this.setParameters(pstmt,value,type);& //调用私有方法设置参数
&&&rs = pstmt.executeQuery();
&&&if (rs.next()) { // 有记录的情况
&&&&map = new HashMap();
&&&&ResultSetMetaData rsm = rs.getMetaData();
&&&&int colnum = rsm.getColumnCount(); // 得到记录的列数
&&&&for (int i = 1; i &= i++) {
&&&&&// rsm.getColumnName(i).toUpperCase()统一列名大写
&&&&&// rs.getObject(i)更的值为对象类型
&&&&&&&.put(rsm.getColumnName(i).toUpperCase(), rs
&&&&&&&&&.getObject(i));
&&} catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&}finally {
&&&if (rs != null) {
&&&&rs.close();
&&&if (pstmt != null) {
&&&&pstmt.close();
& * 执行更新语句INSERT,UPDATE or DELETE
& * @param sql String 要执行的SQL语句
& * @return int 如果执行INSERT,UPDATE or DELETE则返回影响的记录行数,如果执行没有返回值的语句则返回为0
& * @throws Exception
&public int executeUpdate(String sql) throws Exception {
&&System.out.println(&executeUpdate:& + sql);
&&int re = 0;
&&Connection con =
&&PreparedStatement pstmt =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&pstmt = con.prepareStatement(sql);
&&&re = pstmt.executeUpdate();
&&}catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&} finally {
&&&if (pstmt != null) {
&&&&pstmt.close();
& * 执行更新语句INSERT,UPDATE or DELETE
& * @param sql String 要执行的带有?号的INSERT,UPDATE or DELETE语句
& * @param value String[] ?对应的值
& * @param type int[] ?对应的值的数据库表中的类型
& * @return int 如果执行INSERT,UPDATE or DELETE则返回影响的记录行数,如果执行没有返回值的语句则返回为0
& * @throws Exception
&public int executeUpdate(String sql, String[] value, int[] type)
&&&throws Exception {
&&System.out.println(&executeUpdate:& + sql);
&&int re = 0;
&&Connection con =
&&PreparedStatement pstmt =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
&&&&&ResultSet.CONCUR_UPDATABLE);
&&&this.setParameters(pstmt,value,type);& //调用私有方法设置参数
&&&re = pstmt.executeUpdate(); // 影响的记录行数
&&}catch(Exception ex){
&&&ex.printStackTrace();
&&&con.rollback();
&&} finally {
&&&if (pstmt != null) {
&&&&pstmt.close();
& 私有方法用来设置
& * @param pstmt PreparedStatement对象的参数
& * @param value& 参数值
& * @param type&& 参数类型
& * @throws Exception
&private void setParameters(PreparedStatement pstmt,String[] value,int[] type)throws Exception{
&&int j = 1;
&&for (int i = 0; i & value. i++) {
&&&switch (type[i]) {
&&&case Types.INTEGER:
&&&&pstmt.setInt(j, Integer.parseInt(value[i]));
&&&&System.out.println(&Parameter(&+i+&)&&& INTEGER&&&&& &+value[i]);
&&&case Types.FLOAT:
&&&case Types.DOUBLE:
&&&case Types.DECIMAL:
&&&case Types.NUMERIC:
&&&&pstmt.setDouble(j, Double.parseDouble(value[i]));
&&&&System.out.println(&Parameter(&+i+&)&&& FLOAT、DOUBLE、DECIMAL、NUMERIC&&&&& &+value[i]);
&&&case Types.CHAR:
&&&case Types.VARCHAR:
&&&case Types.LONGVARCHAR:
&&&&pstmt.setString(j, value[i]);
&&&&System.out.println(&Parameter(&+i+&)&&& CHAR、VARCHAR、LONGVARCHAR&&&&& &+value[i]);
&&&case Types.DATE:
&&&case Types.TIMESTAMP:
&&&&pstmt.setString(j, value[i]);
&&&&System.out.println(&Parameter(&+i+&)&&& DATE、TIMESTAMP&&&&& &+value[i]);
&&&case Types.BOOLEAN:
&&&&// Boolean.parseBoolean(value[i]) JDK5API
&&&&pstmt.setBoolean(j, Boolean.getBoolean(value[i]));
&&&&System.out.println(&Parameter(&+i+&)&&& BOOLEAN&&&&& &+value[i]);
&&&j = j + 1;
& * 执行记录的查询(调用存储过程)
& * @param procName:调用存储过程的名称;
& * @param returnType:游标返回类型
& * 0为CachedRowSet以及各种类型
& * @param outParameter:传入输出参数的类型,例如:new int[]{Types.REF,Types.REF,Types.VARCHAR},
& * 表示所调用的存储过程前两个输出结果的类型为游标类型,第三个输出结果的类型为VARCHAR2类型。
& * @param args&&&&&& 所调用存储过程的输入参数
& * @return List&Object& 存储过程的输出结果
&public List&Object& executeProc(String procName,int returnType,int[] outParameter,Object... args) throws Exception {
&&List&Object& list =
&&Connection con =
&&CallableStatement cstmt =
&&&con = ConnectionFactory.getInstance().getConnection();
&&&int iInStart = 1;// 存储过程输入参数的起始位
&&&// 统计问号的个数
&&&int parameterCount = args.length+outParameter. //调用的存储过程的总参数个数
&&&// 组装带问号的SQL
&&&String sql = &{call & + procName + &(&;
&&&for (int i = 1; i &= parameterC i++) {
&&&&if (i == parameterCount){
&&&&&sql += &?&;
&&&&}else{
&&&&&sql += &?,&;
&&&sql += &)}&;
&&&System.out.println(&executeProc:&+sql);
&&&cstmt = con.prepareCall(sql);
&&&for (int i = 0; i & args. i++) {// 循环设定存储过程的输入参数
&&&&cstmt.setObject(iInStart + i, args[i]);
&&&&System.out.println(&设置输入参数:&+iInStart+&& &+args[i]);
&&&int iOutStart = args.length + iInS// 存储过程输出参数的起始位
&&&for (int i = 0; i & outParameter. i++) {// 循环设定存储过程的输出参数
&&&&if (outParameter[i]==Types.REF){ //代表游标
&&&&&cstmt.registerOutParameter(i + iOutStart, oracle.jdbc.driver.OracleTypes.CURSOR);
&&&&&System.out.println(&设置输出参数:&+(i + iOutStart)+& 游标&);
&&&&}else if((outParameter[i]==Types.INTEGER)){
&&&&&cstmt.registerOutParameter(i + iOutStart, Types.INTEGER);
&&&&&System.out.println(&设置输出参数:&+(i + iOutStart)+& 数值型&);
&&&&}else{
&&&&&cstmt.registerOutParameter(i + iOutStart, Types.VARCHAR);
&&&&&System.out.println(&设置输出参数:&+(i + iOutStart)+& 字符型&);
&&&cstmt.execute();& //执行
&&&list = new ArrayList&Object&();
&&&switch (returnType) {
&&&case 0:// 把存储过程中返回的游标转换为CachedRowSet类型输出
&&&&for (int i = 0; i & outParameter. i++) {// 循环获取存储过程的输出结果,包括游标、字符串
&&&&&if (outParameter[i]==Types.REF) { //处理游标
&&&&&&CachedRowSet crs=new CachedRowSetImpl();
&&&&&&//OracleCachedRowSet crs=new OracleCachedRowSet();& //使用Oracle10g的数据则必须要用10g的驱动,Oracle 10g驱动解决了“ORA-01002: 读取违反顺序”这个问题
&&&&&&if (cstmt.getObject(i + iOutStart) != null){
&&&&&&&crs.populate((ResultSet)cstmt.getObject(i + iOutStart));
&&&&&&list.add(crs);
&&&&&} else{ //非游标
&&&&&&list.add(cstmt.getObject(i + iOutStart));
&&} catch (Exception ex) {
&&&ex.printStackTrace();
&&&con.rollback();
&&} finally {
&&&cstmt.close();
&public static void main(String[] args) throws Exception {
&&//DBManager dbm = new DBManager();
&&//dbm.execute(&update dept set dname=? where deptno=? &,new String[]{&sdfsdfsad&,&51&},new int[]{Types.VARCHAR,Types.NUMERIC});
&&// Connection con = SingletonDataSource.getInstance().getConnection();
&&// CachedRowSet crs = dbm.executeQueryRowSet(
&&// &SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM EMP WHERE
&&// EMPNO &7654&,
&&// con);
&&// while (crs.next()) {
&&// System.out.println(crs.getString(&EMPNO&) + & & +
&&// crs.getString(&ENAME&));
&&// System.out.println(&########################&);
&&// Map map = dbm.executeQueryMap(
&&// &SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM EMP WHERE
&&// EMPNO=7654&,
&&// con);
&&// System.out.println(map.get(&EMPNO&) + & & + map.get(&ENAME&) + & & +
&&// map.get(&COMM&));
&&// con.close();
&& * String sql = &select * from emp where comm=?&; String[] value = new
&& * String[] {&500&}; int[] type = {Types.DOUBLE}; Map map =
&& * dbm.executeQueryMap(sql, value, type, null); //Map map =
&& * dbm.executeQueryMap(&select * from emp where empno=? and ename=?&,new
&& * String[] {&7654&,&MARTIN&},new int[]{Types.INTEGER,Types.VARCHAR},
&& * null); if (map != null) { System.out.println(map.get(&EMPNO&) + & & +
&& * map.get(&ENAME&)); }
&& * String sql = &select * from emp where empno&?&; String[] value = new
&& * String[] {&7693&}; int[] type = {Types.INTEGER}; CachedRowSet crs =
&& * dbm.executeQueryRowSet(sql, value, type, null); boolean isprint =
&& * while (crs.next()) { ResultSetMetaData rsmd =
&& * crs.getMetaData(); int colcount = rsmd.getColumnCount(); if (isprint) {
&& * isprint= for (int i = 0; i & i++) {
&& * System.out.print(rsmd.getColumnName(i + 1) + &/t/t&); }
&& * System.out.println(); } for (int i = 0; i & i++) {
&& * System.out.print(crs.getString(i + 1)+&/t/t&); }
&& * System.out.println(); }
&& * String sql = &update emp set comm=? where comm=?&; String[] value =
&& * new String[] {&56.22&, &0&}; int[] type = {Types.DOUBLE,
&& * Types.INTEGER}; System.out.println(dbm.executeUpdate(sql, value,
&& * type, null));
&&// System.out.println(dbm.selectList(&test&, &empno&, &ename&, true,
&&// &&,&select * from emp&, null, null));
&&//DBManager dbmt = new DBManager();
/*&&//有事物操作示例
&&&dbmt.beginTransaction();
&&&dbmt.execute(&insert into emp values (1234, 'TEST', 'TEST', 0, to_date('', 'yyyy-mm-dd'), 0, 0, 10)&);
&&&dbmt.execute(&insert into emp values (1235, 'TEST', 'TEST', 0, to_date('', 'yyyy-mm-dd'), 0, 0, 10)&);
&&&//mitTransaction();
&&}catch(Exception ex){
&&&dbmt.rollbackTransactoin();
&&//自动事物处理
&&//dbmt.execute(&insert into emp values (1236, 'TEST', 'TEST', 0, to_date('', 'yyyy-mm-dd'), 0, 0, 10)&);
package jing.
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
&* Title: 使用单实例进行数据库连接池中的数据库连接获取
&* @author 欧朝敬
&* @version 1.0
public class ConnectionFactory {
&private static DataSource ds =
&private static ConnectionFactory cf = new ConnectionFactory();
&private static final ThreadLocal&Connection& threadLocal = new ThreadLocal&Connection&(); //线程本地变量
&private ConnectionFactory() {
&&&InitialContext ctx = new InitialContext();
&&&// 使用时改成正确的数据配置
&&&//ds = (DataSource) ctx.lookup(&jdbc/OracleSource&);
&&&//TomCat中的连接池获取方式使用java:/comp/env/
&&&ds = (DataSource) ctx.lookup(&java:/comp/env/jdbc/OracleSource&);
&&} catch (NamingException ne) {
&&&System.out.println(ne.getMessage() + &/n没有使用连接池!&);
&public static ConnectionFactory getInstance() {
&public Connection getConnection() throws Exception {
&&Connection con = threadLocal.get();
&&if (con == null) {
&&&if (ds == null) {
&&&&// 使用时改成正确的数据配置
&&&&Class.forName(&oracle.jdbc.driver.OracleDriver&).newInstance();
&&&&String url = &jdbc:oracle:thin:@localhost:1521:sample&;
&&&&con = DriverManager.getConnection(url, &scott&, &tiger&);
&&&} else {
&&&&con = ds.getConnection();
&&&//System.out.println(&未使用线程中的连接!&);
&&&threadLocal.set(con);
&&&//System.out.println(&使用线程中的连接!&);
&& * 如果不做Main方法的调试则使用如下方法体 return ds.getConnection();
& * 关闭连接&br&
& * 同时删除当前线程关联的连接对象,Client不能对用getConnection()方法获得的连接直接调用con.close()方法,必须使用此方法closeConnection()进行连接的关闭
&public void closeConnection() {
&&Connection con = threadLocal.get();
&&if (con != null) {
&&&&con.close();
&&&&threadLocal.set(null);
&&&} catch (Exception e) {
&&&&e.printStackTrace();
&public static void main(String[] args) throws Exception {
&& * 调用方式如下
&&Connection con =ConnectionFactory.getInstance().getConnection();
&&ConnectionFactory.getInstance().closeConnection();
&&con.createStatement();
-------------------------------------------------------------------------------------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&& &&
&&&&&& && &&
&&&&&&&&&&&&
&&&&&&&&& &&&&
本文已收录于以下专栏:
相关文章推荐
通过servlet操作数据库,就需要JDBC中的知识(ORM、DAO等)。创建表hero(MySQL)DROP TABLE IF EXISTS `hero`;CREATE TABLE `hero` (...
假设我们要建表X,那么我将需要执行以下步骤:
注意:在我们的项目中,我们将DAO文件和X.hbm.xml归入DAO包,将表的实例化放入model包,将Service Implement放入Servic...
阿里云服务器实战
安装gcc,配置vim, 配置C语言开发环境
安装tomcat,jdk部署J2EE网站
Proxool也是目前主流的数据库连接池,Proxool是一种Java数据库连接池技术。也是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提...
J2EE开发常用数据库连接池   
                                  &#...
JSP编码常识 GBK编码 GBK编码是中国制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 力控实时数据库 开发 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信