package text;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Date;
public class OracleConnection{
/***************JDBC常用接口和类******************
* DriverManager:驱动管理器获得数据库连接
* Connection:数据库连接接口
* Statement: 语句接口,用来静态操作SQL语句
* PreparedStatement,优先考虑使用的接口,是Statement的子接口,采用预处理方式
* CallableStatement: 可以调用存储过程的预定义语句
* ResultSet: 结果集,保存数据记录的结果集合
* ReseltSetMetaData: 结果集 元数据,如列名称、列类型等
* DatebaseMetaData: 数据元数据,如数据库名称、版本等。
*
* ******操作流程*********
* 1:加载数据库驱动程序
* 2:依靠DriverManager类链接数据库
* 3:进行数据库的CRUD操作(Statement、PreparedStatement、ResultSet)
* 4:关闭数据库连接
* */
public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
//第一个参数:指的是数据库的连接地址。标准格式:jdbc:oracle:thin:@IP地址:端口号:数据库的SID名称
public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl";
public static final String DBUSER = "scott";//连接用户名
public static final String PASSWORD = "tiger";//连接密码
public static void main(String[] args) throws Exception {
//第一步:加载数据库驱动程序
Class.forName(DBDRIVER);//向容器中加载驱动连接类
//第二步:取得数据库连接对象
Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD);//Connection只负责数据库的连接使用
//第三步:进行数据库的数据操作
System.out.println(conn);
Statement stmt = conn.createStatement();//创建数据库的操作
String sql_1 = " update member set name='李四',birthday=sysdate where mid in(1,3,5,7,9)";
String sql_2 = "insert into member(mid,name,age,birthday,note)values(myseq.nextval,'张三',10,TO_DATE('1989-10-10','yyyy-mm-dd'),'是个人')";
String sql_3 = "delete from member where mid = 3";
// int len_1 = stmt.executeUpdate(sql_1);//执行更新,返回更新行数
// int len_2 = stmt.executeUpdate(sql_2);//执行插入操作,返回插入行数
// int len_3 = stmt.executeUpdate(sql_3);//执行删除操作,返回删除行数
// System.out.println("影响的数据行数:"+len_3);
// System.out.println("-------------------------------------------------");
//查询全部
//以后不准写*
String sql_4 = "select mid,name,age,birthday,note from member";
// ResultSet rs = stmt.executeQuery(sql_4);//数据查询操作
//知道循环结束条件,但是不知道循环次数,用while循环遍历结果集
// while(rs.next()){//移动指针判断是否还有数据行
// int mid = rs.getInt("mid");
// String name = rs.getString("name");
// int age = rs.getInt("age");
// Date birthday = rs.getDate("birthday");
// String note = rs.getString("note");
// System.out.println("mid="+mid+" name="+name+" age="+age+" birthday="+birthday+" note="+note);
// }
// System.out.println("-------------------------------------------------");
//以上的代码明确写出了要查询的列名称,所以在使用getXXX()方法读取的数据可以不写列名称,直接写序号
//查询全部
// while(rs.next()){//移动指针判断是否还有数据行
// String note = rs.getString(5);//取数据的顺序可以改变,不一定按照顺序来
// int mid = rs.getInt(1);
// String name = rs.getString(2);
// int age = rs.getInt(3);
// Date birthday = rs.getDate(4);
// System.out.println("mid="+mid+" name="+name+" age="+age+" birthday="+birthday+" note="+note);
// }
System.out.println("-------------------------------------------------");
//*******利用PreparedStatement接口***********
String name = "Mr'Smith";
int age = 30;
Date birthday = new Date();//这是java.util.Date
String note = "是个能活动的人";
String sql_5 = "insert into member(mid,name,age,birthday,note) values (myseq.nextval,?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql_5);//已经预处理了sql
//用setXXX()方法设置问号内容,没有问号则不用设置内容
pstmt.setString(1, name);
pstmt.setInt(2, age);
pstmt.setDate(3,new java.sql.Date(birthday.getTime()));//该方法使用的是java.sql.Date
pstmt.setString(4, note);
System.out.println(pstmt.executeUpdate());//执行更新
//查询全部
pstmt = conn.prepareStatement(sql_4);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){//移动指针判断是否还有数据行
String note1 = rs.getString(5);//取数据的顺序可以改变,不一定按照顺序来
int mid1 = rs.getInt(1);
String name1 = rs.getString(2);
int age1 = rs.getInt(3);
Date birthday1 = rs.getDate(4);
System.out.println("mid="+mid1+" name="+name1+" age="+age1+" birthday="+birthday1+" note="+note1);
}
System.out.println("----------------------------------");
//限定查询:
String sql_6 = "select mid,name,age,birthday,note from member where mid=?";
pstmt = conn.prepareStatement(sql_6);
pstmt.setInt(1, 100);
//由于只返回一行,可用if-else代替while循环
rs = pstmt.executeQuery();
if(rs.next()){//移动指针判断是否还有数据行
String note1 = rs.getString(5);//取数据的顺序可以改变,不一定按照顺序来
int mid1 = rs.getInt(1);
String name1 = rs.getString(2);
int age1 = rs.getInt(3);
Date birthday1 = rs.getDate(4);
System.out.println("mid="+mid1+" name="+name1+" age="+age1+" birthday="+birthday1+" note="+note1);
}
else{
System.out.println("此数据不存在");
}
System.out.println("------------------------------");
//模糊查询:
String keyWord = "三";//若keyWord = "";表示未设置查询的条件,则为查询全部
String sql_7 = "select mid,name,age,birthday,note from member where name like ?";//字段不能使用占位符,不能把name这个字段用?来占位
pstmt = conn.prepareStatement(sql_7);
pstmt.setString(1, "%"+keyWord+"%");//设置匹配符
rs = pstmt.executeQuery();
while(rs.next()){//移动指针判断是否还有数据行
String note1 = rs.getString(5);//取数据的顺序可以改变,不一定按照顺序来
int mid1 = rs.getInt(1);
String name1 = rs.getString(2);
int age1 = rs.getInt(3);
Date birthday1 = rs.getDate(4);
System.out.println("mid="+mid1+" name="+name1+" age="+age1+" birthday="+birthday1+" note="+note1);
}
System.out.println("------------------------------");
//包含 统计函数的查询:
String sql_8 = "select count(*) from member";
pstmt = conn.prepareStatement(sql_8);
rs = pstmt.executeQuery();
if(rs.next()){
int count = rs.getInt(1);
System.out.println(count);
}
System.out.println("-----------------------------------");
//分页查询:
int currentPage = 3;//这是第几页
int lineSize = 5;//每一页显示多少行
String sql_9 = "select * from ( "
+" select mid,name,age,birthday,note,rownum rn "
+" from member "
+" where name like ? and rownum<=?) temp "
+" where temp.rn>?";
pstmt = conn.prepareStatement(sql_9);
pstmt.setString(1, "%"+keyWord+"%");//设置匹配符
pstmt.setInt(2, currentPage*lineSize);
pstmt.setInt(3, (currentPage-1)*lineSize);
rs = pstmt.executeQuery();
while(rs.next()){//移动指针判断是否还有数据行
String note1 = rs.getString(5);//取数据的顺序可以改变,不一定按照顺序来
int mid1 = rs.getInt(1);
String name1 = rs.getString(2);
int age1 = rs.getInt(3);
Date birthday1 = rs.getDate(4);
System.out.println(" mid= "+mid1+" name= "+name1+" age= "+age1+" birthday= "+birthday1+" note= "+note1);
}
System.out.println("--------------------");
//批处理与事务处理
//批处理指的是多条语句一起执行
/*自动提交控制:public void setAutoCommit(boolean autoCommit) throws SQLException
*提交:public void commit() throws SQLException
*回滚:public void rowback() throws SQLException
*/
//例子:增加事物控制:
conn.setAutoCommit(false);//取消事务的自动提交,因为jdbc中事业会自动提交
try{//这是一整个事物,将可能发生错误的语句放入try语句块中
stmt.addBatch(sql_1);
stmt.addBatch(sql_2);
stmt.addBatch(sql_3);
stmt.addBatch(sql_2);
stmt.addBatch(sql_3);
int result[] = stmt.executeBatch();//执行批处理
System.out.println(Arrays.toString(result));
conn.commit();//没有错误则提交整个事务
System.out.println("事务提成功!");
}catch(Exception e){
e.printStackTrace();//打印错误信息
conn.rollback();
}
//最后一步:关闭数据库连接
conn.close();
}
}
java连接oracle数据库
最新推荐文章于 2020-06-18 10:36:59 发布