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();
                }
            }
        }
    }

}
时间: 2024-10-18 00:02:51

java:Oracle(事务,分页,jdbc)的相关文章

JDBC:JAVA &amp; Oracle

JDBC:JAVA & Oracle 本文中未加标注的资源均来自于PolyU数据库课程的实验材料.仅作为学习使用,如有侵权,请联系删除 JDBC是什么 我之前写过一篇关于数据库和JAVA的博文,这里直接贴上相关的内容: Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法. JDBC也是Sun Microsystems的商标. JDBC是面向关系型数据库的

[java][db]JAVA分布式事务原理及应用

JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序的JTA支持极大地增强了数据访问能力. 本文的目的是要提供一个关于的Java事务处理API(JTA)的高级的概述,以及与分布式事务相关的内容.一个事务处理定义了一个工作逻辑单元,要么彻底成功要么不产生任何结果. 一个分布式事务处理只是一个在两个或更多网络资源上访问和更新数据的事务处理,因此它在那些资源之间必然是等价的.在本文中,我们主要关心的是如何处理

Java基础教程:JDBC编程

Java基础教程:JDBC编程 快速开始 什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC API 库包含下面提到的每个任务,都是与数据库相关的常用用法. 制作到数据库的连接. 创建 SQL 或 MySQL 语句. 执行 SQL 或 MySQL 查询数据库. 查看和修改所产生的记录. 从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,因此可以用 J

java oracle thin 和 oci 连接方式实现多数据库的故障切换

一.thin方式 该种方式简便易用非经常见. 当中URL为 jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on) (ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=10.132.111.14)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=busi_db))) 当中LOAD_BALANCE=on表示负载开启,

Java应用程序连接数据库--JDBC基础

Java应用程序连接数据库--JDBC基础 Java应用程序连接数据库–JDBC基础 <!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> &

Java之十五 JDBC编程

有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事.换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBCAPI写一个程序就够了,它可向相应数据库发送SQL调用.同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言"编写一次,处处运行"的优势. Java数

Java学习之分页查询

Java学习之分页查询 一先做数据库的实体类 Userinfo.java <span style="font-size:14px;">package com.zhu.books.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class Pagation extends DBCon

在Maven仓库中添加Oracle数据库的JDBC驱动依赖

今天在使用IDEA构建Maven项目时,发现Oracle数据库JDBC驱动依赖使用不了,就在网上搜索了一下,下面是不能使用的原因. 由于Oracle授权问题,Maven3不提供oracle JDBC driver,我们也可以在Maven的中心搜索ojdbc驱动包,但是可以看到版本过于陈旧,即使有坐标,也下载不了. 为了可以在使用Maven构建的项目中使用Oracle JDBC driver,我们就必须手动添加Oracle的JDBC驱动依赖到本地仓库中. 既然要手动添加Maven依赖到本地仓库中,

Java中事务总结详解(精华)

1.什么是JAVA事务? 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (isolation)和持久性(durability)的缩写. 事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效. 事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态. 事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可

oracle事务和锁

数据库事务概括 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数据库,执行DML.DCL.DDL语句 结束事务: 1. 执行DDL(例如CREATE TABLE),DCL(例如GRANT),系统自动执行COMMIT语句 2. 执行COMMIT/ROLLBACK 3. 退出/断开数据库的连接自动执行COMMIT语句 4. 进程意外终止,事务自动rollback 5