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,数据库)