java:Oracle(事务,分页,jdbc)

Posted 咫尺天涯是路人丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java:Oracle(事务,分页,jdbc)相关的知识,希望对你有一定的参考价值。

1.事务:transaction
  -- 事务开启的唯一条件就是:对数据库进行增,删,改的时候
  -- 换句话说,对数据进行增删改以后,必须要执行提交或者回滚
  -- 事务就是把数据库中的数据从一致状态转换为另一种一致状态

  delete from teacher where id = 7;-- 现在把teacher给锁住了
  -- 自动执行提交
  commit;
  -- 自动回滚
  rollback;

  update teacher set name=‘hehehehehehehe‘,age=30 where id=7; -- PL/SQL只会验证你的语法,不会验证你的数据正确性

  select * from teacher;

 

  -- 事务有四大特性:
    -- 原子性:当事务对数据库中的数据进行操作的时候,只有两种状态,要么全部成功,要么全部失败
    update teacher set name=‘hehehe2‘,age=20 where id=5;
    -- 一致性:需要把数据从一种一致的状态转换为另一种一致的状态
    -- 隔离性:只有当一个事务提交或回滚后,第二个事务才会提交或回滚,执行顺序就是谁先开始谁先执行
    -- 永久性:事务一旦提交,将会永久保存到数据库中,无法恢复

  -- 事务有两个状态:
    -- 提交/确认
    -- 回滚/撤销/Ctrl+z--->必须要在提交前进行回滚操作

 

 

2.分页 :rownum

  -- 一般情况下,分页的形式有两种:

  -- 普通的分页(能看到页码的分页)
  -- 瀑布流(看不到页码的,而且很难感觉出来被分页了)

 

  -- 当进行查询语句的时候select *,rownum不可以一起用
  -- rownum:每行数据的编号
  select t.*, rownum from teacher t where id < 3;
  -- 子查询
  -- 使用oralce原生sql写分页的时候,一定从里往外写
  -- 分页查询中,首先要固定每一页的条数

    rownum内层必须起一个别名,不然不会查,因为不确定是查哪个

   内层<=起,如果>=得用1,不然会有BUG
  select * from teacher;
  select tt.*, rownum from
  (select t.*, rownum as rm from   teacher t-->select * from teacher where rownum <= 9)-- 查询出数据编号小于等于3的所有数据
  tt where tt.rm >= 7;
  
  

  

  创建分页的视图必须先给分页起个名字,不然会报错:
  create or replace view test_views_test as (select t.*,rownum as rm2 from teacher t where rownum >= 11);

 

  --第一页:rownum<=3 >=1;
  --第二页:rownum<=6 >= 4;
  --第三页:rownum<=9 >= 7;
  --第四页 : rownum <=12 >= 10;

  --n:页码数,3:每一页显示的条数
  --每一页的起始条数:3n-2;
  --每一页的最后一条:3n
  -- 每页显示3条为例:
  -- 第一层:查出来表中的总条数--select * from teacher;
  -- 第二层:查询出每一页的最后一条 select t.*,rownum from (select * from teacher) t where rownum <= 3n;
  -- 第三层:查询出每一页的第一条数据 select tt.*, rownum as rm2 from (select t.*,rownum as rm from (select * from teacher) t where               rownum >= 11) tt where tt.rm <= 20;
        select tt.*, rownum from
        (select t.*, rownum as rm from
        (select * from teacher where hire_date > 2017/4/1 and hire_date < 2017/6/30) t-- teacher
         where rownum <= 3) -- 查询出数据编号小于等于3的所有数据
         tt where tt.rm >= 2;



         -- mysql的分页:
     

   -- mysql的分页
        select * from users limit 6,3;
         -- limit:有两个参数:(第一参数:每一页第一条数据的下标(下标是从0开始的),第二个参数:代表每页显示的条数)

 

 

3.JDBC(java date base connectivity)使用java代码操作数据库

 

/**
 * @description 教师的实体类
 * @author Seven Lee
 * @date 2017年7月3日下午2:52:19
 *
 */
public class Teacher {

    private int id;
    private String name;
    private int age;
    private String description;
    private String hireDate;

    public Teacher() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getHireDate() {
        return hireDate;
    }

    public void setHireDate(String hireDate) {
        this.hireDate = hireDate;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((description == null) ? 0 : description.hashCode());
        result = prime * result + ((hireDate == null) ? 0 : hireDate.hashCode());
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Teacher other = (Teacher) obj;
        if (age != other.age)
            return false;
        if (description == null) {
            if (other.description != null)
                return false;
        } else if (!description.equals(other.description))
            return false;
        if (hireDate == null) {
            if (other.hireDate != null)
                return false;
        } else if (!hireDate.equals(other.hireDate))
            return false;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Teacher [id=" + id + ", name=" + name + ", age=" + age + ", description=" + description + ", hireDate="
                + hireDate + "]";
    }

}

Oracle的静态JDBC查询:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @description Java data base connectivity(JDBC)--->使用Java代码操作数据库
 * @author Seven Lee
 * @date 2017年7月3日下午2:13:04
 *
 */
public class JdbcQuery {

    public static void main(String[] args) {
        ResultSet rs = null;
        Statement st = null;
        Connection conn = null;
        try {
            // 导入oracle所需要的驱动jar
            // 使用反射进行加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
            // 获取oracle的连接驱动
            // getConnection有三个参数:1.url:数据库的地址(固定写死的);2.user:数据库的用户名;3.password:数据库用户名的密码
            conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "scott");
            // 创建一个statement对象:执行静态的sql语句
            st = conn.createStatement();
            // 如果是查询,在executeQuery需要编写的sql语句一定不允许带分号
            // 这里的rs就是咱们查询出来的最终结果,也就是表中的数据(以行为单位)
            rs = st.executeQuery("select * from teacher");// sql会在这里编译并执行
            // ResultSet返回查询出的数据结果集
            // 把数据库中的数据进行转换
            List<Teacher> list = new ArrayList<Teacher>();
            while (rs.next()) {
                Teacher teacher = new Teacher();
                // rs.getXXX("");字符串参数一定要和oracle中的列名相同,不区分大小写
                // 从结果中获取到查询出的数据,并转换为Java的类型
                // 在oracle中number类型如果为正数对应Java中的int,如果为小数对应Java中double
                // 在实际开发中,公司一般不允许用第二种方式,这样会造成表达不清晰
                // 第一种获取数据的形式
                int id1 = rs.getInt("id");
                // 第二种获取数据的形式
                // rs.getXXX(int xx);int类型的参数时,一定要从1开始, 不能从0开始
                int id2 = rs.getInt(1);
                System.out.println(id2);
                teacher.setId(rs.getInt("id"));
                // 在oracle中vachar2对应Java中的String类型
                rs.getString("name");
                rs.getString(2);
                teacher.setName(rs.getString("name"));

                rs.getInt("age");
                rs.getInt(3);
                teacher.setAge(rs.getInt("age"));

                rs.getString("description");
                rs.getString(4);
                teacher.setDescription(rs.getString("description"));

                rs.getString("HIRE_DATE");
                rs.getString(5);
                teacher.setHireDate(rs.getString("HIRE_DATE"));
                list.add(teacher);
            }
            System.out.println(list);
            System.out.println(list.size());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源,这里不叫关闭连接
            // oracle中,可以设置数据库的最大连接数
            // 比如设置的最大连接数为6,只能有6个人同时连接数据库
            // 释放资源:当对数据库操作完成后,需要归还连接,这一个动作就叫做释放资源
            // 在释放资源有一个顺序:首先要释放结果集,然后释放statement,最后释放connection
            if (rs != null) {
                try {
                    rs.close();// 这里close叫做释放,不叫关闭
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

Oracle的动态JDBC查询:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcQueryDongTai {

    static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
    static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
    static final String USERNAME = "scott";
    static final String PASSWORD = "scott";

    public static void getConnection(Teacher teacher) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 导入oracle的jar包
            // 加载驱动(反射技术)
            Class.forName(DRIVER);
            // 获取oracle的连接
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            // 获取PreparedStatement:预编译的statement,预编译的意思:在sql传入值之前-->提前编译
            // 还是一个静态的sql
            //String sql = "select * from teacher where id = " + teacher.getId();
            // 动态的sql
            String sql = "select * from teacher where id = ?";
            // String sql = "inset into teacher (id, name, age, description, hire_date) values(?,?,?,?,?)";
            ps = conn.prepareStatement(sql);// 首先会把sql提前编译好-->select * from teacher where id = ?;这里的问号就是一个占位符
            // 把占位符替换为需要的数据
            // ps.setInt("sql语句中第几个问号", "需要把问号替换的值"); 第一个参数一定要从1开始,不能从0开始
            // ps.setInt(1, 3);
            // ps.setString(2, "lisi");
            ps.setInt(1, 5);
            /**
             * 为什么要使用preparedstatement而不用statement
             *     1.statement会编译后直接执行,把传的参数一起编译进sql,但是preparedstatement会先把sql编译好,然后再把参数替换问号
             *  sql恶意注入:通过网络进行恶意攻击你的网站--->修改你的sql
             *      在statement中会把参数编译进sql语句中:
             *          String sql2 = "select * from teacher where name = ‘"+teacher.getName()+"‘ and age="+teacher.getAge();
                        sql2 = "select * from teacher where name = ‘"+teacher.getName()+"‘ and age="+teacher.getAge()+";drop table teacher";
             *          
             *      使用preparedstatement:
             *          String sql2 = "select * from teacher where name = ‘"+teacher.getName()+"‘ and age="+teacher.getAge();
                        "select * from teacher where name = teacher.getName() and age = teacher.getAge;"
             *          
             *     2.执行的是同一条sql,如果经过10次查询,就会创建10个statement,但是经过10次查询只会创建一个preparedstatement对象,单例的思想
             *     但是statement可以批量执行in,但是preparedstatement在sql1992不能,在sql1999就可以了
             */
            
            // 如果是查询,调用executeQuery()
            rs = ps.executeQuery();// sql在这里执行
            while (rs.next()) {
                // 和以前的代码是一样的
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            if(rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Oracle的动态JDBC增删改:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcCUD {

    static final String DRIVER = "oracle.jdbc.driver.OracleDriver";// 驱动连接
    static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";// 连接的URL
    static final String USERNAME = "scott";// 数据库用户名
    static final String PASSWORD = "scott";// 用户名的密码

    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        try {
            // 导入oracle的jar包
            // 加载驱动(反射技术)
            Class.forName(DRIVER);
            // 获取连接
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            // 获取statement
            st = conn.createStatement();
            // 如果是增删改,就一定要是用executeUpdate,返回的是一个int类型的数字,使用executeUpdate可以自动提交事务
            // executeUpdate返回的int类型数字就是代表受影响的行数
            String sql = "delete from teacher where id=3";
            int result = st.executeUpdate(sql);
            if (result > 0) {
                System.out.println("您的操作成功!请查看数据库!");
            } else {
                System.out.println("操作失败,请重新操作!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

Mysql的JDBC:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcMySQL {

    static final String DRIVER = "com.mysql.jdbc.Driver";// 驱动连接
    static final String URL = "jdbc:mysql://localhost:3306/test";// 连接的URL
    static final String USERNAME = "root";// 数据库用户名
    static final String PASSWORD = "root";// 用户名的密码

    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        try {
            // 导入oracle的jar包
            // 加载驱动(反射技术)
            Class.forName(DRIVER);
            // 获取连接
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            // 获取statement
            st = conn.createStatement();
            // 如果是增删改,就一定要是用executeUpdate,返回的是一个int类型的数字,使用executeUpdate可以自动提交事务
            // executeUpdate返回的int类型数字就是代表受影响的行数
            String sql = "delete from test_table where id=1";
            int result = st.executeUpdate(sql);
            if (result > 0) {
                System.out.println("您的操作成功!请查看数据库!");
            } else {
                System.out.println("操作失败,请重新操作!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

 



























































以上是关于java:Oracle(事务,分页,jdbc)的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库对查询后的结果分页如何实现和jsp分页

JDBC preparedStatement分页和统计,批处理和事务

数据库 JDBC基础

一起学Java——JDBC

JAVA基础:JDBC的使用 附详细代码

关于oracle数据库死锁,请大神进。为啥用java synchronized 关键字解决不了?怎么解决死锁问题?