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语句在查询时的 ...
随机推荐
- hdu2159 二维02bag
设f[i][j]为杀第j只怪时耐久度为i的最大经验值 完全背包类型:有N种物品和一个容量为V 的背包,每种物品都有无限件可用.放入第i种物品的耗费的空间是Ci,得到的价值是Wi. 求解:将哪些物品装入 ...
- chown -R lyd usbsend
chown -R lyd usbsend chown -R lyd usbsend chown -R lyd usbsend 某一个目录下所有文件授权给lyd
- windows下前端开发环境配置
nvm安装 多媒体布局 前端自动化构建工具,gulp nvm管理node的版本,npm是node的包管理工具 下载nvm安装包 https://github.com/coreybutler/nvm-w ...
- DataGridView增加右键取消操作
) { dgvinfo.Rows[e.RowIndex].Selected = true; Point point = dgvinfo.PointToClient(Cursor.Position); ...
- 一种sql优化方案
--select @type3Count=count(1) from TWEB_ALogisticsYD bb -- LEFT JOIN dbo.TWEB_BCompanyJJ as B3 WITH( ...
- python3基础:基本语句
http://www.cnblogs.com/qq21270/p/4591318.html 字符串.文本文件 http://www.cnblogs.com/qq21270/p/7872824.htm ...
- source和resource的区别
idea中,有时新导入的工程会出现 类的标识为红色的J,此时为无效,并且该类不能被编译,这是因为该类所在的文件夹java没有被标记为Sources Root,而放置配置文件的resources文件夹没 ...
- [JZOJ6400]:Game(贪心+线段树+二分)
题目描述 小$A$和小$B$在玩一个游戏,他们两个人每人有$n$张牌,每张牌有一个点数,并且在接下来的$n$个回合中每回合他们两人会分别打出手中的一张牌,点数严格更高的一方得一分,然而现在小$A$通过 ...
- plt.plot() 无法使用参数ax
问题参考 TypeError: inner() got multiple values for keyword argument 'ax' fig, ax=plt.subplots(2,1) plt. ...
- Java中的Unicode与码点
Java中,可以用\uXXXX表示Unicode字符,例如String s = "\u00X1";XXXX必须为4位,因此码点为U+1D546的字符,需要用两个编码单元表示,例如S ...