java 的数据库操作--JDBC
一、java与数据库的交互
1、jdbc:java data base connectivity,java数据库连接。java的JDBC操作主要通过操作两个类进行连接操作:Connection 和 Statement。
2、java 连接数据库的一般步骤:
A、加载驱动,通过Class.forName(className)手动显示加载对应的驱动类,因为初始时jdbc的驱动类不会自动加载。
B、创建连接对象Connection
C、创建Statement对象
D、利用Statemet执行sql语句
E、处理结果集
具体上代码吧:
public void doJdbc(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
//1,加载驱动
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接对象
//这里需要知道数据库的路径和用户名以及密码
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/atm","root","root");
//创建一个可向数据库发送SQL命令并返回结果的传送对象Statement
stmt = conn.createStatement();
//将sql命令通过传送对象Statement传送到数据库执行,并返回结果
String sql = "select * from tableName";
rs = stmt.excuteQuery(sql);//excuteQuery()方法用于执行查询语句,返回结果表
//处理结果集
while(rs.next()){
String code = rs.getString("code");
int password = rs.getDouble("money");
//根据游标获取
// String code = rs.getString(1);
// String password = rs.getInt(2);
// double money = rs.getDouble(3);
System.out.println(code + password + money);
}
}catch(Exception e){
}finally{
//关闭操作,省略
}
}
(这个模式,其实就是设计模式中的命令模式吧!)
二、Connection Statement 和Result的关系
1、首先,Connection是一个连接(类比IO中的流),是一个数据库通道,利用Connection,便可操作与某个数据库的交互了;Statement其实就是一个命令模式中的一个Command,它负责将sql命令运输给数据库让数据库执行sql命令,并返回一个结果集Result对象,所以,Statement是主要和数据库进行交互的对象,下面的讨论将会重点讨论Statement的相关用法
2、多个Connection?多个Statement?在利用JDBC连接数据时,如果是单线程的环境,一般只需要一个Connection即可满足操作条件。但是,如果需要同时执行多个sql命令,不能用同一个statement,例如下面的例子:
//jdbc操作说明方法一
public void methodTest(){
Connection conn = null;
Statement stmt = null;
ResultSet rs1 = null;
ResultSet rs2 = null;
try{
String sql1 = "select id from user where id>5";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbcRul","username","userpass");
stmt = conn.createStatement();
rs1 = stmt.executeQuery(sql);
int id = 0;
while (rs1.next()){
//这里会出错,原因是一个stmt关联一个result,当stmt重复执行sql时会覆盖原来的结果!
rs2 = stmt.executeQuery("select * from otherTable where userId='" + id + "'");
}
}catch (Exception e) {
// TODO: handle exception
}finally{
//关闭操作,省略
}
}
在上面的代码中,尽管rs1和rs2代表不同的Result对象,但是,一个result对象对应着一个statemetn,一旦重新执行sql语句,原谅的result对象会被抹掉,因为它对应的statemet已经重新执行另外一个sql语句了。
这时候,应该一个Result对象对应一个statement,避免覆盖情况。
3、什么时候需要多个Connection?当不同线程之间提交数据时,需要不同的Connection,否则,会造成事务混乱。这个这里不重点讨论。
三、jdbc与事务
1、几个概念:事务回滚,保存点,事务提交的梳理:
A、事务回滚:执行回滚操作会将操作回滚到指定的保存点;
B、保存点:标记并保存着jdbc操作的一系列状态,每个保存点对应一个状态;
C、事务提交:正式将所有操作的命令集提交给数据库,此时命令集操作正式生效。
2、首先说保存点类(实际是个接口来)--SavePoint。保存点保存有某个sql执行前的一个状态;它通过connection.setSavePoint来获得;
然后,在设置保存点后,如果执行过程知道某一个步骤发生了异常,可以回滚到异常发生前的那个执行状态,避免前面的执行业务失效(当然,这前提是失败的业务和前面成功执行的业务之间没有关系,否则,不能只是回滚部分,要回滚全部!),事务回滚调用connection.roolBack进行操作;
在事务中,所有的sql命令集都不会自动提交,需要调用connection.commit进行提交。具体请看下面的代码:
//事务说明方法
public void transaction(){
Connection conn = null;
Statement stmt1 = null;
Statement stmt2 = null;
Savepoint point = null;
try{
String sql1 = "update table1 set ...";
String sql2 = "update table2 set ...";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbcRul","username","userpass");
//如果要自己控制事务,需要将默认提交设置为false
conn.setAutoCommit(false);
stmt1 = conn.createStatement();
stmt1.executeUpdate(sql1);
point = conn.setSavepoint();
stmt2.executeUpdate(sql2);
//需要显式提交
conn.commit();
}catch (SQLException e) {
// TODO: handle exception
//捕获到异常,进行事务回滚
try {
conn.rollback();//这是表示所有事务都回滚了,当然也可以只是回滚到某一点
//conn.rollback(point);//这个是对应回滚到stmt2执行前
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//关闭操作,省略
}
}
事务回滚其实要结合具体的业务进行考虑,所以很多时候是挺复杂的,所以这里不详细讨论如何进行事务设置,毕竟,我功力也没达到那个水平。
四、使用jdbc与数据库交互时需要注意的是:使用完后,一定要记得关闭所有数据库相关对象!因为数据库连接其实也涉及到IO连接,所以,不关闭的话很容易造成内存泄露。关闭的顺序是:先Result,然后Statement,最后Connection,而且必须写在finally 块里面。
java 的数据库操作--JDBC的更多相关文章
- java:数据库操作JDBC
JDBC详解:https://www.cnblogs.com/erbing/p/5805727.html JDBC存储过程,事务管理,数据库连接池,jdbc的封装框架:https://www.cnbl ...
- Java实现数据库操作
Java实现数据库操作 这里的样例是使用mysql数据库 代码实现 /* MySQLHelper.java */ import java.io.*; import java.util.*; impor ...
- JavaSE学习总结(九)—— Java访问数据库(JDBC)
一.JDBC简介 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...
- 第20章 数据库操作----JDBC概述
JDBC是一种可用于执行SQL语句的Java API(Application Programming Interface,应用程序设计接口),是连接数据库和Java应用程序的纽带. 1.JDBC-OD ...
- 【Java 与数据库】JDBC中日期时间的处理技巧
JDBC中日期时间的处理技巧 详谈Java.util.Date和Java.sql.Date 基础知识 Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒 ...
- db2 数据库操作JDBC .addBatch() 方法执行时,报错排查结果
今天调试db2数据的存储时,jdbc使用addBatch方法时,抛出异常,异常信息如下: [jcc][1091][10404][3.62.56] 数据转换无效:参数实例 对于所请求的转换无效. ER ...
- java工具类--数据库操作封装类
java对数据库操作简单处理,如下代码即可,封装了 增删改查及获取连接.关闭连接. 代码如下: package com.test; import java.sql.Connection; import ...
- 安卓 SQLite数据库操作实例
前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLi ...
- 在安卓开发中使用SQLite数据库操作实例
前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLi ...
随机推荐
- php 多维数据根据某个或多个字段排序
实现多维数组的指定多个字段排序 上面的实例讲解了如何实现多维数组指定一个字段排序,但如果要实现指定多个字段来对数组进行排序该如何思考? 多个字段是几个?2个,3个或更多,所以这个不确定的因素需要排除. ...
- PHP中预定义超全局数组(变量)
PHP中许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用.超全局变量除了具有全局变量特点外,在函数或方法中无需执行global $variable:就可以访问它们. 提供超全 ...
- win7 设置docker加速器
本来专门已经有了一个源于docker加速器的了,公司的电脑是mac,配置很简单,但是我自己的电脑是win7,在实际操作的时候还真是累啊,官网的教程不知道为什么没起效果,所以最终还是找了其他人发的帖,可 ...
- Object类和包装类的一些方法
一.instanceof关键字的使用: a instanceof A:判断对象a是否是类A的实例.如果是,返回true:如果不是,返回false. 使用场景:为了避免在向下转型时出现ClassCast ...
- 吴裕雄 python 机器学习——聚类
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import ma ...
- JAVA static深入了解
static关键字: 1)static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享:2)只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的 ...
- ssh协议git利用ss代理
前言 不知道ss为何物的绕道 求帐号的绕道 这里只是亲测 ssh协议下的git, 如何判断是什么协议出门左拐 判断是否需要代理 我遇到的问题是: ssh_exchange_identification ...
- java 使用idea将工程打成jar并创建成exe文件类型执行
https://blog.csdn.net/weixin_38310965/article/details/80392767
- linux中校验文件完整性(md5,sha1)
经常在Linux下下载软件的人,一定会有一个良好的习惯:校验文件的hash,以确定文件的完整性甚至是安全性.我配置环境的时候也恰好用到了,笔者的是一个lubuntu的机子.这里我大致做个记录.(不了解 ...
- 单臂vlan路由实现过程
单臂路由拓扑图如下: 实现步骤如下: 1)pc的ip自己配置. 2)在交换机的各个端上划分好vlan 下联口:vlan 10 port g1/0/2 vlan 20 port g1/0/3 ...