Java中使用DbHeplper来连接Oracle数据库时,一般可以分为以下几个步骤:
第一步,导入sql包;
第二步,将Oracle中的Java驱动包添加到项目下,并生成路径,Java驱动包存放在路径:F:\oracle\product\10.2.0\db_1\jdbc\lib之下;
第三步,加载驱动;
第四步,使用驱动管理器获取数据库连接对象;
第五步,编写sql语句(事先在数据库中编译通过的正确的sql语句);
第六步,创建语句对象;
第七步,执行sql语句,返回ResultSet结果集对象;
第八步,关闭对象,Connection,PreparedStatement,ResultSet。
代码如下:
package jdbcDemo1;
/**
* jdbc
* @author 阿达
*
*/
//第一步 导入SQL包
import java.sql.*;
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//第二步:将驱动包放到项目下
//第三步:加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//第四步 :驱动管理器获取数据库连接对象
//url:数据库服务器地址:jdbc:oracle:thin:@主机IP:数据库端口:数据库实例
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "a");
//测试:是否获取到连接对象
System.out.println(conn.getClass().getName());
//第五步:编写SQL语句
String sql="select * from emp";
//第六步:创建语句对象(将 SQL 语句发送到数据库)
Statement stmt=conn.createStatement();
//第七步:执行sql语句,返回ResultSet结果集对象
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){//判断下一行是否有数据
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t");
//如果SQL语句中的字段顺序发生改变,则需要对结果集进行重新编号
}
//第七步:关闭流对象,释放内存
//关闭对象
//关闭结果集对象
rs.close();
//关闭语句对象
stmt.close();
//关闭连接对象;
conn.close();
}
}
常见异常有:
1.java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection
原因:Oralce数据库的主服务和监听服务没有开启,在服务中开启OracleServiceORCL和OracleOraDb10g_home1TNSListener服务即可。
2." java.lang.ClassNotFoundException: oracle.jdbc.driver.OarcleDriver
原因:1.没有将驱动包放到项目下 2.Class 类中的 forName 方法出错。
3. java.sql.SQLException: No suitable driver found for jdbc:orale:thin:@127.0.0.1:1521:orcl
原因:驱动管理器获取数据库连接对象出错,正确应为:jdbc:oracle:thin:@127.0.0.1:1521:orcl。
4.ExceptionInInitializerError
原因:forName方法所激发的初始化失败
5.java.sql.SQLException: ORA-00900: 无效 SQL 语句
原因:SQL 语句不正确,建议sql语句先在Oracle中运行无误后再写入代码中。
附:为了便于平时的使用,我们可以对DbHelper进行封装处理.首先创建一个db.properties文件存储的驱动信息和数据库连接对象时所要使用到的信息,
再自定义一个单例模式的MyProperties类继承Properties,调用db.properties中存储的驱动信息和数据库连接对象时所要使用到的信息。最后DbHelper调用MyProperties获取所需信息。
MyProperties.java的代码如下:
package jdbcDemo2;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 自定义MyProperties类继承Properties,当前类拥有Properties公共属性和方法
* @author 阿达
* 整个系统只需要创建一个对象
* 设计成单例模式
*/
public class MyProperties extends Properties{
private static MyProperties myProperties ;
private MyProperties() throws IOException{
InputStream in=MyProperties.class.getClassLoader().getResourceAsStream("jdbcDemo2/db.properties");
this.load(in); //从输入流中读取属性列表(键和元素对)
}
public static MyProperties getInstance() throws IOException {
if(null==myProperties){
myProperties=new MyProperties();
}
return myProperties;
}
}
db.properties的代码如下:
driverName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
user=scott
password=a
DbHelper.java的代码如下:
package jdbcDemo2;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbHelper4 {
private Connection conn=null;
private PreparedStatement pstmt=null;
private ResultSet rs=null;
//加载驱动
static{
try {
Class.forName(MyProperties.getInstance().getProperty("driverName"));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取数据库连接对象
public Connection getConn(){
try {
//getConnection(url,properties)
conn=DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance() );
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
// 关闭对象
public void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(null!=rs){//关闭结果集
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=pstmt){//关闭语句对象
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=conn){//关闭连接对象
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 设置参数
* @param pstmt 预编译对象
* @param params 外部传入的参数值 添加值时顺序一样要和?对应值得顺序一致
*
*/
public void setparams(PreparedStatement pstmt,List<Object> params) throws SQLException{
if(null!=params&¶ms.size()>0){
for(int i=0;i<params.size();i++){
pstmt.setObject(i+1, params.get(i));//设置?值
}
}
}
//获取结果集中的所有列表
private List<String> getAllColumnName(ResultSet rs2) throws SQLException {
// TODO Auto-generated method stub
List<String> columnNames=new ArrayList<String>();
ResultSetMetaData dd=rs.getMetaData();
for(int i=1;i<=dd.getColumnCount();i++){
columnNames.add(dd.getColumnName(i));
}
return columnNames;
}
// 查看操作:sql语句可以查看多条记录
public List<Map<String,Object>> findMultObject(String sql,List<Object>params) throws SQLException{
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
Map<String,Object> map=null;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params);
rs=pstmt.executeQuery();
//获取结果集中的所有列名
List<String> columnNames=getAllColumnName(rs);
while(rs.next()){
map=new HashMap<String,Object>();
for(String name:columnNames){
map.put(name, rs.getObject(name));
}
list.add(map);
}
} finally {
this.closeAll(conn, pstmt, rs);
}
return list;
}
//查询操作,select * from emp where id=? 只有一条结果
public Map<String,Object> findSingleOBject(String sql,List<Object> params) throws SQLException{
Map<String,Object> map=null;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params);
rs=pstmt.executeQuery();
//获取结果集中的所有列名
List<String> columnNames=getAllColumnName(rs);
if(rs.next()){
map=new HashMap<String,Object>();
for(String name:columnNames){
map.put(name, rs.getObject(name));
}
}
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, rs);
}
return map;
}
//单条sql语句 更新操作:增 删 改
public int doUpdate(String sql,List<Object> params) throws SQLException{
int result=0;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
//设置参数
this.setparams(pstmt, params);
result =pstmt.executeUpdate();
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, null);
}
return result;
}
/**
* 多条语句的更新操作 批处理 注意:这些sql语句执行的结果要么一起成功要么一起失败
* @param sqls
* @param params 对应每一条sql语句所需要的参数集合
* @return
* @throws SQLException
*/
public int doUpdate(List<String> sqls,List<List<Object>> params) throws SQLException{
int result=0;
try {
conn=this.getConn();
//设置事物提交方式为手动提交
conn.setAutoCommit(false);
if(null!=sqls&&sqls.size()>0){
//对sql语句进行循环
for(int i=0;i<sqls.size();i++){
String sql=sqls.get(i);
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params.get(i));//第几条sql语句对应list集合中的第一个list
result=pstmt.executeUpdate();
}
}
conn.commit();//手动提交事物
} catch (Exception e) {
// TODO: handle exception
conn.rollback();//事物回滚
}finally{
conn.setAutoCommit(true);//回复事物
this.closeAll(conn, pstmt, rs);
}
return result;
}
//聚合函数
public double getCount(String sql,List<Object>params) throws SQLException{
double result=0;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
setparams(pstmt,params);
rs=pstmt.executeQuery();
if(rs.next()){
result=rs.getDouble(1); //获取第一列的值
}
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, rs);
}
return result;
}
}
第一步,导入sql包;
第二步,将Oracle中的Java驱动包添加到项目下,并生成路径,Java驱动包存放在路径:F:\oracle\product\10.2.0\db_1\jdbc\lib之下;
第三步,加载驱动;
第四步,使用驱动管理器获取数据库连接对象;
第五步,编写sql语句(事先在数据库中编译通过的正确的sql语句);
第六步,创建语句对象;
第七步,执行sql语句,返回ResultSet结果集对象;
第八步,关闭对象,Connection,PreparedStatement,ResultSet。
代码如下:
package jdbcDemo1;
/**
* jdbc
* @author 阿达
*
*/
//第一步 导入SQL包
import java.sql.*;
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//第二步:将驱动包放到项目下
//第三步:加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//第四步 :驱动管理器获取数据库连接对象
//url:数据库服务器地址:jdbc:oracle:thin:@主机IP:数据库端口:数据库实例
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "a");
//测试:是否获取到连接对象
System.out.println(conn.getClass().getName());
//第五步:编写SQL语句
String sql="select * from emp";
//第六步:创建语句对象(将 SQL 语句发送到数据库)
Statement stmt=conn.createStatement();
//第七步:执行sql语句,返回ResultSet结果集对象
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){//判断下一行是否有数据
System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t");
//如果SQL语句中的字段顺序发生改变,则需要对结果集进行重新编号
}
//第七步:关闭流对象,释放内存
//关闭对象
//关闭结果集对象
rs.close();
//关闭语句对象
stmt.close();
//关闭连接对象;
conn.close();
}
}
常见异常有:
1.java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection
原因:Oralce数据库的主服务和监听服务没有开启,在服务中开启OracleServiceORCL和OracleOraDb10g_home1TNSListener服务即可。
2." java.lang.ClassNotFoundException: oracle.jdbc.driver.OarcleDriver
原因:1.没有将驱动包放到项目下 2.Class 类中的 forName 方法出错。
3. java.sql.SQLException: No suitable driver found for jdbc:orale:thin:@127.0.0.1:1521:orcl
原因:驱动管理器获取数据库连接对象出错,正确应为:jdbc:oracle:thin:@127.0.0.1:1521:orcl。
4.ExceptionInInitializerError
原因:forName方法所激发的初始化失败
5.java.sql.SQLException: ORA-00900: 无效 SQL 语句
原因:SQL 语句不正确,建议sql语句先在Oracle中运行无误后再写入代码中。
附:为了便于平时的使用,我们可以对DbHelper进行封装处理.首先创建一个db.properties文件存储的驱动信息和数据库连接对象时所要使用到的信息,
再自定义一个单例模式的MyProperties类继承Properties,调用db.properties中存储的驱动信息和数据库连接对象时所要使用到的信息。最后DbHelper调用MyProperties获取所需信息。
MyProperties.java的代码如下:
package jdbcDemo2;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 自定义MyProperties类继承Properties,当前类拥有Properties公共属性和方法
* @author 阿达
* 整个系统只需要创建一个对象
* 设计成单例模式
*/
public class MyProperties extends Properties{
private static MyProperties myProperties ;
private MyProperties() throws IOException{
InputStream in=MyProperties.class.getClassLoader().getResourceAsStream("jdbcDemo2/db.properties");
this.load(in); //从输入流中读取属性列表(键和元素对)
}
public static MyProperties getInstance() throws IOException {
if(null==myProperties){
myProperties=new MyProperties();
}
return myProperties;
}
}
db.properties的代码如下:
driverName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
user=scott
password=a
DbHelper.java的代码如下:
package jdbcDemo2;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbHelper4 {
private Connection conn=null;
private PreparedStatement pstmt=null;
private ResultSet rs=null;
//加载驱动
static{
try {
Class.forName(MyProperties.getInstance().getProperty("driverName"));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取数据库连接对象
public Connection getConn(){
try {
//getConnection(url,properties)
conn=DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance() );
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
// 关闭对象
public void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(null!=rs){//关闭结果集
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=pstmt){//关闭语句对象
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=conn){//关闭连接对象
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 设置参数
* @param pstmt 预编译对象
* @param params 外部传入的参数值 添加值时顺序一样要和?对应值得顺序一致
*
*/
public void setparams(PreparedStatement pstmt,List<Object> params) throws SQLException{
if(null!=params&¶ms.size()>0){
for(int i=0;i<params.size();i++){
pstmt.setObject(i+1, params.get(i));//设置?值
}
}
}
//获取结果集中的所有列表
private List<String> getAllColumnName(ResultSet rs2) throws SQLException {
// TODO Auto-generated method stub
List<String> columnNames=new ArrayList<String>();
ResultSetMetaData dd=rs.getMetaData();
for(int i=1;i<=dd.getColumnCount();i++){
columnNames.add(dd.getColumnName(i));
}
return columnNames;
}
// 查看操作:sql语句可以查看多条记录
public List<Map<String,Object>> findMultObject(String sql,List<Object>params) throws SQLException{
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
Map<String,Object> map=null;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params);
rs=pstmt.executeQuery();
//获取结果集中的所有列名
List<String> columnNames=getAllColumnName(rs);
while(rs.next()){
map=new HashMap<String,Object>();
for(String name:columnNames){
map.put(name, rs.getObject(name));
}
list.add(map);
}
} finally {
this.closeAll(conn, pstmt, rs);
}
return list;
}
//查询操作,select * from emp where id=? 只有一条结果
public Map<String,Object> findSingleOBject(String sql,List<Object> params) throws SQLException{
Map<String,Object> map=null;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params);
rs=pstmt.executeQuery();
//获取结果集中的所有列名
List<String> columnNames=getAllColumnName(rs);
if(rs.next()){
map=new HashMap<String,Object>();
for(String name:columnNames){
map.put(name, rs.getObject(name));
}
}
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, rs);
}
return map;
}
//单条sql语句 更新操作:增 删 改
public int doUpdate(String sql,List<Object> params) throws SQLException{
int result=0;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
//设置参数
this.setparams(pstmt, params);
result =pstmt.executeUpdate();
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, null);
}
return result;
}
/**
* 多条语句的更新操作 批处理 注意:这些sql语句执行的结果要么一起成功要么一起失败
* @param sqls
* @param params 对应每一条sql语句所需要的参数集合
* @return
* @throws SQLException
*/
public int doUpdate(List<String> sqls,List<List<Object>> params) throws SQLException{
int result=0;
try {
conn=this.getConn();
//设置事物提交方式为手动提交
conn.setAutoCommit(false);
if(null!=sqls&&sqls.size()>0){
//对sql语句进行循环
for(int i=0;i<sqls.size();i++){
String sql=sqls.get(i);
pstmt=conn.prepareStatement(sql);
this.setparams(pstmt, params.get(i));//第几条sql语句对应list集合中的第一个list
result=pstmt.executeUpdate();
}
}
conn.commit();//手动提交事物
} catch (Exception e) {
// TODO: handle exception
conn.rollback();//事物回滚
}finally{
conn.setAutoCommit(true);//回复事物
this.closeAll(conn, pstmt, rs);
}
return result;
}
//聚合函数
public double getCount(String sql,List<Object>params) throws SQLException{
double result=0;
try {
conn=this.getConn();
pstmt=conn.prepareStatement(sql);
setparams(pstmt,params);
rs=pstmt.executeQuery();
if(rs.next()){
result=rs.getDouble(1); //获取第一列的值
}
} finally {
// TODO: handle finally clause
this.closeAll(conn, pstmt, rs);
}
return result;
}
}