zoukankan      html  css  js  c++  java
  • java:Oracle(事务,分页,jdbc)Mysql(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查询:

      Oracle数据库端口号1521,Sqlserver端口号1433

    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:

      端口3306,(关系型数据管理系统)目前属于Oracle旗下;

      mysql优点:可以跨平台

      但是,开源,导致各种修改版本过多,不利于学习;内部空间比Oracle小,内部语言不严谨

    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 (test是指数据库的名字)
        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();
                    }
                }
            }
        }
    
    }
  • 相关阅读:
    [转载红鱼儿]delphi 实现微信开发(1)
    Devexpress VCL Build v2013 vol 14.1.3 发布
    [翻译]LSP程序的分类
    睡眠不好
    LuaStudio 9.27 去10分钟退出暗桩板
    vs2012 提示 未能正确加载 "Visual C++ Language Manager Package" 包 的解决办法
    岁月蹉跎
    重新安装系统之前备份
    运动会
    乱思
  • 原文地址:https://www.cnblogs.com/kuangzhisen/p/7112859.html
Copyright © 2011-2022 走看看