Java数据库编程

ava与数据库交互的主要API是jdbc。jdbc的主要目的是:
1.通过使用SQL或者专有的SQL扩展,程序员可以利用java语言开发访问数据的应用。
2.数据库开发商或者数据库工具开发商改进数据库驱动程序
jdbc通用的使用方式如下:
Class.forName(jdbcDriverName);  Connection conn= DriverManager.getConnection(url,user,password);
根据数据库和驱动不同,下面是一些常用数据库的jdbc:
1.mysql:
Class.forName("com.mysql.jdbc.Driver");
Connection conn=
DriverManager.getConnection("jdbc:mysql://localhost:3306/database","user","password");
2.oracle(thin):
Class.forName("Oracle.jdbc.driver.OracleDriver");
Connection conn=
DriverManager.getConnection("jdbc:oracle:thin@localhost:1521/database","user","password");
3.DB2:
Class.forName("com.ibm.db2.jdbc.app.DB2Driver");
Connection conn=
DriverManager.getConnection("jdbc:db2://localhost:50000/sample","user","password");
其他类型数据库与java一起使用的频率就比上面这些出现的频率小多了。
在配置jdbc驱动的时候,oracle与mysql的配置是一样,但是DB2有些不同,因为DB2的jdbc有三个jar包,在配置的时候要如下操作:
1. 将 db2jcc.jar 和 db2jcc_license_cu.jar 配置在环境变量classpath下。
2. 将 db2jcc.jar 和 db2jcc_license_cu.jar复制在你所用的应用服务器中工程下的WEB-INF/lib包下
3.jdbc中数据库地址URL为:jdbc:db2://localhost:50000/sample
4.数据库驱动类为:com.ibm.db2.jdbc.jcc.DB2Driver
5.使用正确的user和password进行连接测试
执行SQL的操作
要执行SQL,首先要创建一个Statement对象来进行SQL操作。创建方法如下:
Statement st=conn.createStatement();
Statement执行操作SQL的方法有三个,分别是:
st.execute(String sql):执行任意的SQL语句,它通常用于用户提供的交互式查询,服务于技术人员
st.executeUpdate(String sql):执行插入,更新,删除语句,以及表的创建删除语句,返回sql语句影响的数据的行数
st.executeQuery(String sql):只执行查询操作,返回结果集ResultSet。
为什么不能只提供execute(String sql)方法?
因为在正常的情况下,查询操作比其他的操作更频繁。单独提供方法可以更好地优化它。
当查询操作时,可以使用如下的方式进行取出查询到的数据:
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
//rs.getString(1);类似的操作
}
注意:由于每一次查询都会产生这样的结果集,所以在使用完之后要立即关闭这个ResultSet,产生它的Statement,或者进一步关闭Connection。以免大量查询操作导致内存不足。如果这个连接conn使用的时间很短,可以直接关闭conn就可以了。
预处理方式的查询(prepared statement)
在sql参数中使用“?”来代替从现实情况中取到的实际参数值,再用它生成prepareStatement对象,然后通过prepare statement的方法来进行替换占位符“?”,所有的占位符替换完成后,才进行执行。下面是代码示例:
String sql="select * from person where name=? and age=?";
PreparedStatement pst=conn.createPreparedStatement(sql);
pst.setString(1,"wangxiao");
pst.setInt(2,25);
ResultSet rs=pst.executeQuery();
读写LOB问题
在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB。要读取LOB,需要执行select语句,然后在ResultSet上调用getBlob和getClob方法,这样可以获取BLOB或者CLOB类型的对象。要从BLOB中获取二进制数据可以调用getBytes或者getInputStream。类似的获取CLOB对象,,就可以调用getSubString或者getCharacterStream来获取其中的字符数据。下面是一段BLOB从数据库读出和写入的代码片段:
从数据库读取:
PreparedStatement pst = conn.prepareStatement("select cover from book where isbn=?");
pst.setString(1, "isbn");
ResultSet res = pst.executeQuery();
if (res.next()) {
Blob blob = res.getBlob(1);
Image image = ImageIO.read(blob.getBinaryStream());
}
向数据库写入:
Blob blob=conn.createBlob();
int offset=0;
OutputStream out=blob.setBinaryStream(offset);
RenderedImage image=null;// set the source of store
ImageIO.write(image, "PNG", out);
PreparedStatement pst=conn.prepareStatement("insert into cover values (?,?)");
pst.setString(1,"isbn");
pst.setBlob(2, blob);
pst.executeUpdate();
SQL转义问题
这个问题涉及到日期和时间的字面量,调用标量函数,调用存储过程,外连接,like中用到的转义字符。最普遍的情况就是时间字符串,时间戳的问题。
多结果集的处理
在执行存储过程或者在试用允许在单个查询中提交多个select语句的数据库时,查询可能返回多个结果集。下面是获取所有结果集的步骤:
1.试用execute方法来执行SQL语句
2.获取第一个结果集或者更新计数
3.重复调用getMoreResults方法移动到下一个结果集
4.当不存在更多的结果集或更新计数时完成操作。
boolean done=false;
boolean isResult=statement.execute(command);
while(!done){
if(isResult){
ResultSet result=statement.getResultSet();
//do something with result
}else{
int updateCount=statement.getUpdateCount();
if(updateCount>=0){
//do something with update
}else{
done=false;  
}
}
isResult=statement.getMoreResults();
}
获取新建数据行的自动生成键
statement.executeUpdate(insertSql,Statement.RETURN_GENERATED_KEYS);
ResultSet rs=statement.getGeneratedKeys();
int key;
if(rs.next()){
key=rs.getInt(1);
}
可滚动和可更新的结果集
我们非常疑惑,有了上面的固定的结果集ResultSet之后,这一部分真的需要吗?
我经过仔细的查阅资料文档后发现,这个可滚动的结果集是用于不断同步数据库表单中数据的时候使用的。但是有限定条件用于一张表的可视化显示,用户会用到在结果集上前后移动。
使用可滚动结果集的语法:
Statement st=conn.createStatement(type,concurrency);
PreparedStatement pst=conn.preparedStatement(command,type,concurrency);
ResultSet rs=st.executeQuery(sql);
这样的rs里面会带有一个光标,可以前后移动。
如果是可更新的结果集,要要求更严格一些,有些数据库不一定能够支持这种形式。这种操作会始终连接着数据库,效率是个问题。
行集
行集的出现就是为了解决可更新结果集长时间连接数据库的问题。行集有很多种实现类型,有CachedRowSet,WebRowSet,jdbcRowSet,FilterdRowSet,JoinRowSet.下面是CachedRowSet的启用语法:
ResultSet rs=st.executeQuery(sql);
CachedRowSet crs=new com.sun.rowset.CachedRowSetImpl();
crs.populate(rs);
conn.close();
//使用crs操作
元数据
元数据在SQL中是用来描述数据库或其组成部分的数据。我们可以获得三类元数据:关于数据库的元数据,关于结果集的元数据,关于预备语句参数的元数据。这个元数据在百度上百度一下,可以看到它的标准定义,它是描述基本数据信息的数据。操作元数据的语法如下:
DatabaseMetaData meta=conn.getMetaData();
ResultSet mrs=meta.getTables(null,null,null,new String[]{"TABLE"});
元数据结果集中第一列代表了表目录,第二列代表了表结构模式,第三列表名,第四列表类型,第五列关于表的注释。
事物
这个是数据库操作中常用到的数据操作保障,一般情况下要在jdbc操作失败的时候进行回滚操作,前提是jdbc操作不是自动提交事物的。
取消事物自动提交的语法是:
conn.setAutoCommit(false);
提交语法:conn.commit();
回滚语法:conn.rollback();
当一个处理过程中涉及到很多步骤的非查询操作的时候,可以设立保存点,以更好地控制回滚操作。
使用语法说明:
//step1 jdbc operations
Savepoint svpt=conn.setSavepoint();
//step2 jdbc operations
if(...)conn.rollback(svpt);//如果step2操作失败的话
//other operations
conn.commit();
批量更新
当一起执行多个非查询操作的时候,可以考虑是用批量更新的方式来提高效率。这种效率随着操作语句数量的增多而提高的更多。批量操作在处理异常时可以作为单个事物操作。具体使用,查询batch update.

转载于:https://www.cnblogs.com/duscl/p/4872545.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Avalonia跨平台入门第六篇之Grid动态分割

前面玩耍了ListBox多选,今天在他的基础上对Grid进行动态分割;这个效果其实在Xamarin中已经实现过了;其实都没太大区别;直接看效果吧:在ListBox中选择了具体的布局后进行Grid布局分割:具体分割的方法和原来在移动端没啥区别:下一篇就是控件的拖放了;最终简单的效果先这样吧;以后…

Python打包方法基本应用方式介绍

Python编程语言是一款功能强大的免费开源的通用型计算机程序应用语言,对于经验丰富的开发人员来说,掌握这样一款语言在其程序开发中是一个比较重要的选择。我们今天就先来了解一下python打包方法的相关应用。Python查找重复文件相关操作方式分享四种Pyth…

使用ABBYY FineReader进行自动图像预处理

2019独角兽企业重金招聘Python工程师标准>>> 扫描图像和数码照片中常见的扭曲文本行、歪斜、噪声和其他缺陷可能会降低识别质量,ABBYY FineReader可自动消除这些缺陷,也允许手动消除。 ABBYY FineReader有几个图像预处理功能,如果…

Android之在launcher里面动态加载桌面图标

1、在手机桌面加载图标方式 1)、动态加载 Launcher.java private void addSourceList() {Intent launchIntent new Intent(this, RcGrpActivity.class);launchIntent.setAction(Intent.ACTION_MAIN);launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Intent …

计算机与交通工程论文,交通工程论文.doc

淮 阴 工 学 院毕业设计(论文)系 部: 交 通 工 程 系专 业: 交 通 工 程学生姓名: 徐东成 学 号:设计(论文)题目: 城市交通信息系统功能研究起 迄 日 期: 2006年 2 月 20日 ~ 06月10日设计(论文) 地点: 大学城指 导 教 师: 夏晶晶专 业 负 责…

Avalonia跨平台入门第五篇之ListBox多选

前面我也提前预告了今天要实现的效果;不过中间被卡了一下;今天赶紧去弥补上次要做的效果,其实在WPF效果中已经实现过了,看效果吧:ListBox的前台布局代码:使用的附加属性和WPF好相似:子项模板(绑定写法简化了好多):多值转换器(少了一个ConvertBack):最终简单的效果先这样吧;以后…

Android之android.os.NewWorkOnMainThreadException解决办法

1、问题 用别人提供的的sdk的Demo出现android.os.NewWorkOnMainThreadException 2、解决办法 网络请求开启一个线程请求或者开启异步任务都行 3、总结 1、 之前就看到过这种android.os.NewWorkOnMainThreadException异常,时间很久了,自己也没反映过来&a…

mediawiki 搭建

[1] http://www.cnblogs.com/mchina/archive/2012/11/28/2778779.html转载于:https://www.cnblogs.com/deepblueme/p/4665610.html

金蝶K/3 WISE 12.3订单跟踪SQL报表

金蝶K3一直缺少完整的跟踪报表,所以我们开发了一张完整的跟踪报表,通过查询分析工具直接生成。代码(WIN2008 R2SQL 2008 R2环境,K3 WISE 12.3):select t1.fname1 客户,t1.fname2 业务员,t1.f_102 款号,t1.f…

计算机与人脑的异同作文,小学信息技术3-6年级全册教案.pdf

清华版小学信息技术 3-6 年级全册教案三年级上册教学计划课 题 1、芝麻开门1、了解计算机的组成和用途,认识计算机的桌面。教学目标2 、鼠标的基本操作。教 学初步学会使用鼠标的移动、指向、单击。重难点PowerPoint教具软件、多媒体电脑一、引入:教 同学…

Fragment 键盘弹出方式设置

由于在FragmentActivity中配置SoftInputMode不好使,所以要在Fragment 中设定:getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);转载于:https://www.cnblogs.com/chenlong-50954265/p/3924094.html

开源绘画应用 Pinta 已移植到GTK 3和.NET 6

Pinta [1]是一款开源绘画应用,适用于 Linux、Windows 和 macOS。你可以用它来进行自由手绘/素描。你也可以用它在现有的图片上添加箭头、方框、文字等。年初发布了 Pinta 2.0.2 版本,这是我看到的第一款桌面的dotnet6 和 gtksharp的 应用。Pinta是一个小…

Druid源码分析系列1:dataSource.init()的准备工作

2019独角兽企业重金招聘Python工程师标准>>> 本节,讲解 dataSource.init(); 打断点在 stop in com.alibaba.druid.pool.DruidDataSource.init 好,开始研究代码 public void init() throws SQLException {// 首先确定没有initedif (inited) {r…

软件测试推荐专业,软件测试专业老师推荐信

尊敬的领导:您好!首先感谢您在百忙之中抽出时间来阅读我学生XX的推荐信!该生是XX大学软件测试专业应届毕业生,自进入XX大学以来,凭借自身扎实的基础和顽强拼搏的奋斗精神,经过几年不断的学习,在…

Android之用Handler实现主线程和子线程互相通信以及子线程和子线程之间的通信

1、上代码 activity_main.xml文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_p…

poj 2398 Toy Storage (计算几何,判断点和线段关系)

http://poj.org/problem?id2398 题意大概是说将一个盒子用n个board分成n1 部分 然后往里面放toy,给定盒子,board,和toy的坐标 问所有的toy放完后,有多少部分中有t个toy; 简单计算几何 需要判断的是点和直线的关系. 判断 某一点在直线左右侧 左右方向是相对前进方向的,只要指定…

[转]Android中pendingIntent的深入理解

转自;here pendingIntent字面意义&#xff1a;等待的&#xff0c;未决定的Intent。要得到一个pendingIntent对象&#xff0c;使用方法类的静态方法 getActivity(Context, int, Intent, int),getBroadcast(Context, int, Intent, int),getService(Context, int, Intent, int) 分…

叮,您有一份ML.NET 速查手册请查收!

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;7分钟&#xff09;本篇文章简要介绍 ML.NET 背景和面向 .NET 开发的特色功能&#xff0c;以及典型的机器学习编码示例&#xff0c;并分享自己整理的 ML.NET API 速查手册。微软MVP实验室研究员项斌微软全球最有价值专…

微信公众号开发之文本消息自动回复,以及系统关注自动回复,php代码

以tshop为例 直接上代码&#xff1a; 企业 cc_wx_sys表为自建&#xff0c;存储系统消息的配置的 字段: id type key status <?php /*** tpshop* * * 版权所有 2015-2027 深圳搜豹网络科技有限公司&#xff0c;并保留所有权利。* 网站地址: http://www.tp-shop.cn* -------…

java之ThreadLocal简单使用总结

1、介绍ThreadLocal 看安卓源码的时候&#xff0c;在这个类Looper.java &#xff0c;会有这个一句函数 static final ThreadLocal<Looper> sThreadLocal new ThreadLocal<Looper>(); 一开始我不是很懂ThreadLocal.java这个类&#xff0c;简单理解 ThreadLocal 就…