您的位置:首页 > 编程语言 > Java开发

java学习之JDBC

2016-02-18 22:15 316 查看
  之前学习了数据库原理,上学期也学了oracle数据库,我的学习视频上是讲的mysql数据库,其实都差不多,复习了下sql知识,数据库的学习就没有写下来了,就从Java怎么操作数据库开始吧。

  因为这年过完了,开始新的学习,有时间边学边写了。其实JDBC网上教程挺多的,我看视频学习的笔记都尽量写在代码里了。就直接上代码吧。

package com.gh;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* PreparedStatement的setDate类是java.sql包里的Date
* ResultSet 的getDate还回一个java.sql.Date
* sql.Date是util.Date的子类 可以直接转util.Date
* util.Date转sql.Date可以 new sql.Date(new util.Date().getTime());
* @author ganhang
*
*/
public class JdbcDemo {
//驱动类
public static String Driver="oracle.jdbc.OracleDriver";
//数据库地址
public static String url="jdbc:oracle:thin:@localhost:1521:orcl";
//数据库用户名
public static String user="scott";
//数据库密码
public static String password=".";
/**
* 查找
*/
public static void find(){
try {
Class.forName(Driver);
Connection conn=DriverManager.getConnection(url, user, password);
String sql="select * from test";
PreparedStatement ps=conn.prepareStatement(sql);//不要用Stateme ,有sql注入问题,不安全
ResultSet rs=ps.executeQuery();//返回结果集(实际上是引用)
while(rs.next()){
System.out.println(rs.getInt(1));
}
rs.close();
ps.close();
conn.close();
System.out.println("success!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* jdbc事务处理
* 处理多条sql语句(运行sql脚本)
*/
public static void update(){
/**
* 这里我发现如果想用addBatch()方法添加批处理命令只能用Statement接口
* 而且addBatch()方法不能添加查询语句
* 如果用PreparedStatement只能单独执行一句sql
*/
Connection conn=null;
try {
Class.forName(Driver);
conn=DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false);//改为手动commit
Statement ps=conn.createStatement();
String sql1="insert into test values(16)";
//PreparedStatement ps=conn.prepareStatement(sql1);
//ps.addBatch();
ps.addBatch(sql1);
//String sql2="update test set n=17 where n=16";
String sql2="delete from test where n=1";
//ps=conn.prepareStatement(sql2);
ps.addBatch(sql2);
ps.executeBatch();
//懒得数据库去查询。。。直接这边输出
//ps=conn.prepareStatement(sql3);
String sql3="select * from test";
ResultSet rs=ps.executeQuery(sql3);
while(rs.next()){
System.out.println(rs.getInt(1));
}
conn.commit();//提交事务
ps.close();
conn.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}

}
//Statement实现,不安全
public static void insert(){//更新删除只改sql就可以
try {
//加载驱动
Class.forName(Driver);
//获得连接,注意是java.sql的Connection,mysql包也有Connection接口
Connection conn=DriverManager.getConnection(url, user, password);
//sql语句
String sql="insert into test values(100)";
//获得Statement对象
//说明文档有这么一句注释:在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。
//因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。
//如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。
Statement stat=conn.createStatement();
//执行sql(实际上是把sql发送给数据库,数据库去执行类似Scoket通信)
stat.executeUpdate(sql);
//关闭相关连接释放资源
stat.close();
conn.close();
System.out.println("success!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//PreparedStatement实现
public static void insert2(int n){
try {
Class.forName(Driver);
Connection conn=DriverManager.getConnection(url, user, password);
String sql="insert into test values(?)";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1, n);
ps.executeUpdate();
ps.close();
conn.close();
System.out.println("success!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//insert();
//insert2(1);
//find();
update();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: