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