Java连接Sql数据库经常用到的操作

作者:茶饮月 时间:2024-01-17 09:26:28 

废话不多说了,直接给大家分享java操作sql数据库常见的连接问题。

1.连接,查询,更新,关闭

这几个数据基础操作,所以放到一起,写成一个工具类的模式,也就是model2模式的sql工具.这里本想把其他操作都加进去,比如事务处理,但是目前还没想到比较完美的方法,具体看代码吧,注释很详细


import java.sql.*;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Created by nl101 on 2016/1/29.
*/
public class SQLBean {
//初始化操作都写在前面
Connection conn = null;
PreparedStatement ps =null;
ResultSet rs = null;
String driverName = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String userName = "SCOTT";
String passWord = "123456";
/**
* 初始化连接,获得conn
*/
public SQLBean(){
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url,userName,passWord);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.err.println("数据库链接异常");
} catch (SQLException e) {
e.printStackTrace();
System.err.println("数据库链接异常");
}
}
/*
处理事务的函数欠缺
*/
/**
* 创建数据库更新函数
* @param sql 对应的更新sql语句
* @param params 需要附加的参数
* @return true更新成功 false更新失败
*/
public boolean update(String sql,String[] params){
int k = 0;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
//这里是从1开始设置参数的
ps.setString(i+1,params[i]);
}
k = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.err.println("数据库更新异常");
}
return k>0?true:false;
}
/**
* 数据库查询函数
* @param sql 要查询的qsl语句
* @param params 附加参数
* @return 查询结果集
*/
public ResultSet query(String sql,String[] params){
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ps.setString(i+1,params[i]);
}
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
System.err.println("数据库查询异常");
}
return rs;
}
/**
* 关闭数据库语句
*/
public void close(){
try {
if (rs!=null) rs.close(); rs = null;
if (ps!=null) ps.close(); ps = null;
if (conn!=null) conn.close(); conn = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}

写成这样,其他类调用的话可以按照下面方法.


SQLBean sqlBean = new SQLBean();
String[] params={};//如果有参数则写进去
ResultSet rs = sqlBean.query("select ename from emp",params);//sql语句
//循环取出
try {
while(rs.next()){
System.out.println(rs.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
sqlBean.close();//异常则关闭连接
}
sqlBean.close();//关闭数据库连接

2.事务的处理

事务的处理,总是先取消自动提交,然后执行命令,最后提交,然后发生异常则回滚,至于怎么写成一个方法,暂时还没想到好办法


import bean.SQLBean;
import java.sql.*;
/**
* Created by nl101 on 2016/1/29.
*/
public class test {
public static void main(String[] args) {
Connection conn = null;
Statement ps =null;
String driverName = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String userName = "SCOTT";
String passWord = "7946521";
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url,userName,passWord);
conn.setAutoCommit(false);//首先取消自动提交
ps = conn.createStatement();
ps.addBatch("需要操作的语句1");
ps.addBatch("需要操作的语句2");
ps.addBatch("需要操作的语句3");
ps.addBatch("需要操作的语句4");
ps.executeBatch();//提交上面的命令
conn.commit();//提交事务
conn.setAutoCommit(true);//开启自动提交
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.err.println("数据库链接异常");
} catch (SQLException e) {
e.printStackTrace();
System.err.println("事务处理异常");
try {
if (conn!=null){
conn.rollback();//回滚操作
conn.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {//最后关闭数据库
try {
if (rs != null) rs.close();
rs = null;
if (ps != null) ps.close();
ps = null;
if (conn != null) conn.close();
conn = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

3.调用存储过程


call = ct.prepareCall("{call sp_pro4(?,?,?,?,?,?)}");
//设置输入参数
call.setString(1, "emp");
call.setInt(2, 4);
call.setInt(3, 1);
//设置输出参数
call.registerOutParameter(4, OracleTypes.NUMBER);
call.registerOutParameter(5, OracleTypes.NUMBER);
call.registerOutParameter(6, OracleTypes.CURSOR);
//执行
call.execute();
//输出总数和总页数
System.out.println("总记录数"+call.getInt(4)
+"--总页数"+call.getInt(5));
//循环取出表
ResultSet rs = (ResultSet) call.getObject(6);
while(rs.next()){
for (int i = 0; i < 7; i++) {
System.out.print(rs.getString(i+1)+" ");
}
System.out.println();
}

4.可移动的结果集

sun只是提供了接口.具体能不能操作,这个要看你引用的JDBC驱动是否支持


import java.sql.*;
public class TestScroll {
public static void main(String args[]) {
try {
new oracle.jdbc.driver.OracleDriver();
String url = "jdbc:oracle:thin:@192.168.0.1:1521:SXT";
Connection conn = DriverManager
.getConnection(url, "scott", "tiger");
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,//设置该rs可以滚动
ResultSet.CONCUR_READ_ONLY);//设置该rs为只读
ResultSet rs = stmt
.executeQuery("select * from emp order by sal");
rs.next();//正常下移一行
System.out.println(rs.getInt(1));
rs.last();//指向最后一行
System.out.println(rs.getString(1));
System.out.println(rs.isLast());
System.out.println(rs.isAfterLast());
System.out.println(rs.getRow());
rs.previous();//上移一行
System.out.println(rs.getString(1));
rs.absolute(6);//该方法直接定位到行号
System.out.println(rs.getString(1));
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

5.可更新的结果集


import java.sql.*;
public class TestUpdataRs {
public static void main(String args[]){
try{
new oracle.jdbc.driver.OracleDriver();
String url="jdbc:oracle:thin:@192.168.0.1:1521:SXT";
Connection conn=DriverManager.getConnection(url,"scott","tiger");
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=stmt.executeQuery("select * from emp2");
rs.next();
//更新一行数据
rs.updateString("ename","AAAA");
rs.updateRow();
//插入新行
rs.moveToInsertRow();
rs.updateInt(1, 9999);
rs.updateString("ename","AAAA");
rs.updateInt("mgr", 7839);
rs.updateDouble("sal", 99.99);
rs.insertRow();
//将光标移动到新建的行
rs.moveToCurrentRow();
//删除行
rs.absolute(5);
rs.deleteRow();
//取消更新
//rs.cancelRowUpdates();
}catch(SQLException e){
e.printStackTrace();
}
}
}

以上所述是小编给大家分享的Java连接Sql数据库经常用到的操作,希望对大家有所帮助。

标签:java,连接,sql
0
投稿

猜你喜欢

  • python3.9之你应该知道的新特性详解

    2021-09-01 12:13:42
  • MySQL 请选择合适的列

    2024-01-23 05:33:31
  • Python测试Kafka集群(pykafka)实例

    2023-05-05 20:57:56
  • Python语音识别API实现文字转语音的几种方法

    2023-02-17 01:17:00
  • python日期相关操作实例小结

    2021-07-14 18:39:13
  • Python使用正则表达式分割字符串的实现方法

    2023-03-12 07:13:49
  • python uuid生成唯一id或str的最简单案例

    2021-06-07 00:40:45
  • python装饰器代码深入讲解

    2023-08-17 20:59:19
  • Python Web编程之WSGI协议简介

    2022-08-30 10:39:03
  • Python实现base64编码的图片保存到本地功能示例

    2024-01-01 22:58:03
  • PHP fprintf()函数用法讲解

    2023-06-01 20:09:20
  • Python区块链块的添加教程

    2021-01-12 13:20:00
  • python Flask框架之HTTP请求详解

    2023-10-02 01:52:55
  • 如何利用Matplotlib库绘制动画及保存GIF图片

    2021-06-08 17:15:40
  • 深入理解PyTorch中的nn.Embedding的使用

    2023-01-25 11:54:02
  • 如何使用ASP实现网站的“目录树”管理

    2008-06-13 06:39:00
  • python报错TypeError: Input z must be 2D, not 3D的解决方法

    2023-09-14 09:02:23
  • Scratch3.0二次开发之windows环境下打包成exe的流程

    2022-12-31 03:27:34
  • Python基于datetime或time模块分别获取当前时间戳的方法实例

    2021-01-19 22:53:18
  • django传值给模板, 再用JS接收并进行操作的实例

    2021-08-23 08:03:46
  • asp之家 网络编程 m.aspxhome.com