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 = ;
int result = ;
result = prime * result + age;
result = prime * result + ((description == null) ? : description.hashCode());
result = prime * result + ((hireDate == null) ? : hireDate.hashCode());
result = prime * result + id;
result = prime * result + ((name == null) ? : 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();
System.out.println(id2);
teacher.setId(rs.getInt("id"));
// 在oracle中vachar2对应Java中的String类型
rs.getString("name");
rs.getString();
teacher.setName(rs.getString("name")); rs.getInt("age");
rs.getInt();
teacher.setAge(rs.getInt("age")); rs.getString("description");
rs.getString();
teacher.setDescription(rs.getString("description")); rs.getString("HIRE_DATE");
rs.getString();
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(, );
/**
* 为什么要使用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 > ) {
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 > ) {
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)Mysql(jdbc)的更多相关文章
- Type mismatch: cannot convert from java.sql.PreparedStatement to com.mysql.jdbc.PreparedStatement
Connection.prepareStatement()函数出错,提示: Type mismatch: cannot convert from java.sql.PreparedStatement ...
- jdbc:mysql:/// jdbc连接数据url简写方式
正常情况下我们写jdbc连接本地mysql数据库的时候通常是这样写 jdbc:mysql:localhost:3306/数据库名 下面就是要提到的简单的方法 jdbc:mysql:///数据库名
- Oracle的分页和MySQL的分页
Oracle的分页: select * from ( select rownum r,a from tabName where rownum <= 20 ) where r > 10 使用 ...
- java之java.lang.UnsupportedClassVersionError:com/mysql/jdbc/Driver : Unsupported major.minor version 52.0
问题解释:jdk版本和mysql驱动版本不兼容,比如:jdk1.7与mysql-connector-java-5.xxx兼容,但与mysql-connector-java-6.xxx及以上不兼容
- oracle 的分页与 mySQL'的分页转化
oracle 分页: 关键字ROWNUM SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO FROM ( SELECT A.*, ...
- Caused by: java.net.ConnectException: Connection refused/Caused by: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
1.使用sqoop技术将mysql的数据导入到Hive出现的错误如下所示: 第一次使用命令如下所示: [hadoop@slaver1 sqoop--cdh5.3.6]$ bin/sqoop impor ...
- 数据库 MySQL Jdbc JDBC的六个固定步骤
*0 案例: a)在JavaScript中使用正则表达式,在JS中正则表达式的定界符是:// var regexp = /^[0-9]+$/; if(regexp.test(nu ...
- mysql,jdbc、连接池
show processlist; select * from information_schema.processlist; Command: The type of command the thr ...
- 前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est
前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: ...
- 一次org.springframework.jdbc.BadSqlGrammarException ### Error querying database Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException问题排查过程
先说结论: 因为在表设计中有一个商品描述字段被设置为desc,但desc是mysql中的关键字,如select id,name,desc,price from product;这条sql语句在查询时的 ...
随机推荐
- 第三次java测验1
设计思想: 输入一个字符串,然后将字符串倒置,比较字符串第i位上的字符与倒数第i位上的字符是否相同,如果都相同则字符串是回文:否则字符串不是回文. 源代码: package java3; import ...
- Tableau Sheet中的操作
如果想要给数据排名,例如给饼图中的数据排名 1 创建一个Rank 描述为INDEX()的测度 2.将RANK用Label形式显示并且编辑计算方法选择特定的属性. 属性本身也有可以快速计算的一些方式. ...
- MySQL第二次安装随笔
找到之前的MySQL的安装包,重新安装MySQL. 1.设置环境变量,win10的可以右键此电脑-属性,在系统变量Path中添加mysql文件bin的路径 2.修改配置文件mydefault.ini( ...
- 在哪里查看java的jar包版本?
jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 .
- 使用vue写扫雷游戏
上班闲来没事做,,心血来潮.想用刚学的vue,写一个扫雷游戏..好了,直入正题. 第一步,先制作一个10x10的格子图..这个divcss就不说了..大家都会. 第二步,制造一个数组,用来生成随机雷区 ...
- k8sCronJob控制器
CronJob用于管理job控制器资源的运行时间,job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但cronjob可以以类似于linux操作系统的周期性任务作业计划的方式控制其运行时间点 ...
- Win10 搭建IIS服务
IIS服务器,俗称:Web服务器又或者叫做网站服务器. IIS详解: https://baike.baidu.com/item/iis/99720?fr=aladdin 开始搭建: 1. 打开控制面板 ...
- sys.argv的意义及用法
sys.argv的意义 简单来说,sys.argv是一个参数列表,这个列表存放着从外界获取到的参数(可能有多个) 下面以一个例子来详细阐述sys.argv,本次演示在ubuntu环境下运行 新建一个t ...
- Scrapy学习(二)、安装及项目结构
一.安装 1.安装pywin32,下载地址:https://sourceforge.net/projects/pywin32/files/pywin32/ 我选择的是Build 221,点进去,根据自 ...
- postfix -- 发件调试
按照教程(https://www.cnblogs.com/huandada/p/10554603.html)搭建好postfix之后,由于收件的邮件运营商的限制,部分邮件不能正常发送,需要更多其他配置 ...