目录
导入ojdbc的jar包
1.将jar包复制到eclipse的src下
2.右键jar包——Build Path——Add to Build Path
创建连接
新建JDBCTest.java文件
1.加载驱动
// 数据库连接的方法
public void getConn() throws Exception{
// 1.加载驱动 包名+类名的形式(可以直接复制路径)
Class.forName("oracle.jdbc.driver.OracleDriver");
}
复制方法:
- src包下的Referenced Libraries
- ojdbc5.jar——oracle——jdbc——driver——OracleDriver.class——OracledDriver
- 右键Copy Qualified Name
2.创建连接
// 2.创建连接
// 通过驱动,来创建一个连接
// 创建这个连接,需要三个参数
// 第一个url:数据库的地址和jdbc所连接的数据库类型和数据库的名字
// 第二个user:数据库的用户名
// 第三个password:数据库的密码
// DriverManager.getConnection(url,user,password)
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","123456");
URL信息:
- jdbc:oracle:thin:数据库连接方式。thin方式是纯java驱动连接方式
- localhost:服务器地址。可以是IP地址、机器名、localhost(本机)
- 1521:服务器端口(Oracle默认端口:1521)
- orcl:Oracle数据库实例,就是登陆plsqldev时,第三行的Database
现在我们可以创建一个main方法测试一下连接成不成功
public static void main(String[] args) throws Exception{
JDBCTest jdbc = new JDBCTest();
// 调用
jdbc.getConn();
}
执行如果控制台没有什么反应,没提示错误,很大几率是写对了!
也可以在JDBCTest.java的创建连接语句下面加上输出语句来测试对不对
创建连接总览
public class JDBCTest{
public void getConn() throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","123456");
}
}
public static void main(String[] args) throws Exception{
JDBCTest jdbc = new JDBCTest();
jdbc.getConn();
}
可以把加载驱动和连接的代码粘下来存起来,下次写的时候可以直接用~
增删改查操作
对上面创建连接的语句进行修改
// 这一步需要进行导包 java.sql.Connection
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","123456");
3.创建一个可执行sql的对象
// 3.通过连接 创建一个可执行sql的对象
Statement stmt = conn.createStatement();
4.执行sql语句
增删改
增删改都可以用executeUpdate方法
// 4.通过 可执行语句的对象,执行sql语句
// 增删改都可以用这个语句
// 执行之后,会返回一个数字,这个数字表示 执行了几条数据
stmt.executeUpdate("insert into dept values(55,'花钱部','北京')");
执行之后,会返回一个数字,这个数字表示 执行了几条数据
所以,我们可以来小改一下来判断它有没有成功
int number = stmt.executeUpdate("insert into dept values(55,'花钱部','北京')");
// 验证成功失败
if(num>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
查询
executeQuery方法用来写查询语句,会返回一个结果集
// 查询
// 是通过executeQuery方法来进行查询的
// 并且返回一个ResultSet(结果集)类型的数据
ResultSet rs = stmt.executeQuery("select * from dept");
获取结果集中的信息
// 可以通过循环,来获取结果集中的信息
while(rs.next()){
// 如果有内容
// rs结果集中的一行数据
// getInt 表示获取的是一个int类型的数据
// 括号中是列的名字
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
System.out.println(deptno + "----" + dname + "----" + loc);
}
这里有个问题,如果列的名字记不住或懒得写怎么办??—— 还可以通过列来获取信息
while(rs.next()){
int deptno = rs.getInt(1);
String dname = rs.getString(2);
String loc = rs.getString(3);
System.out.println(deptno + "----" + dname + "----" + loc);
}
整理成方法文件
新建一个DataBase.java文件
1.创建一个属性
Connection conn; // 创建属性
2.创建数据库的连接方法
// 数据库的连接
public void getConn(){
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","123456");
System.out.println("连接成功");
}
出现异常的修改方法
- 可以按照上面之前写过的方法一样抛出异常
- 也可以用try-catch
public void getConn(){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","123456");
System.out.println("连接成功");
} catch (Exception e) {
e.printStackTrace();
}
}
3.创建增删改的方法
// 增删改的一个共通
public int DoExe(String sql){
// 1.调用数据库连接的方法
getConn();
try{
// 2.创建可执行对象
Statement stmt = conn.createStatement();
// 执行sql语句
return stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
可以在main方法里进行测试
public static void main(String[] args) throws Exception {
// 想删除 部门表中的56
String sql = "delete from dept where deptno=56";
DataBase db = new DataBase();
int num = db.DoExe(sql);
if(num>0) {
System.out.println("处理成功");
}else{
System.out.println("处理失败");
}
}
改进一下!
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(System.in);
System.out.println("请输入要删除的部门编号:");
int deptno = input.nextInt();
String sql = "delete from dept where deptno=" + deptno;
DataBase db = new DataBase();
int num = db.DoExe(sql);
if(num>0) {
System.out.println("处理成功");
}else{
System.out.println("处理失败");
}
}
4.创建查询的方法
返回的是ResultSet结果集
public ResultSet Query(String sql){
// 1.调用数据库连接的方法
getConn();
try {
// 2.创建可执行的对象
Statement stmt = conn.createStatement();
// 执行
return stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
调用方法
String sql1 = "select * from dept";
// 执行
ResultSet rs = db.Query(sql1);
while(rs.next()){
System.out.println(rs.getInt(1) + "----" + rs.getString(2) + "----" + rs.getString(3));
}
改进
我们在写类似插入语句的时候会用到单引号,打出来太麻烦了怎么办?
String sql = "insert into dept values (" + deptno + ",'" + dname + "'," + "'" + loc + "')";
把信息改成“?”
? 表示占位符
String sql = "insert into dept values (?,?,?)";
方法改成下面这样
Object... obj 表示可变参数,这个方法的参数 可以是1个,可以是2个,也可以是3个,或多个
public int DoExe(String sql,Object... obj){
getConn();
try {
// 预处理 解决"?"
// 先获取sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
// 为了循环括号里面的参数,替换"?"
for(int i = 0;i < obj.length;i++) {
pstmt.setObject(i+1, obj[i]);
}
// 执行,后面的括号不需要参数
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
全代码
DataBase.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DataBase {
Connection conn; // 属性
// 数据库的连接
public void getConn() throws Exception {
// 1.加载驱动 包名+类名的形式
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.创建连接
// 通过驱动来创建一个连接
// 创建这个连接,需要三个参数
// 第一个url:数据库的地址和jdbc所连接的数据库类型和数据库的名字
// 第二个user:数据库的用户名
// 第三个password:数据库的密码
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "123456");
}
/*
// 增删改的一个共通
public int DoExe(String sql) throws Exception {
// 1.调用数据库连接的方法
getConn();
// 2.创建可执行对象
try {
Statement stmt = conn.createStatement();
// 执行sql语句
return stmt.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}*/
// 增删改的一个共通
// Object... obj 表示可变参数,这个方法的参数可以是1个,可以是2个,也可以是三个,或多个
public int DoExe(String sql,Object... obj) throws Exception {
// 1.调用数据库连接的方法
getConn();
try {
// 预处理 解决"?"
// 先获取sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
// 为了循环括号里面的参数,替换"?"
// "?"是没有下标概念的,所以从1开始;但数组从0开始
for(int i = 0;i < obj.length;i++) {
pstmt.setObject(i+1, obj[i]);
}
// 执行,后面的括号不需要参数
return pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
public ResultSet Query(String sql,Object... obj) throws Exception{
getConn();
try {
/*
Statement stmt = conn.createStatement();
return stmt.executeQuery(sql);
*/
// 预处理
PreparedStatement pstmt = conn.prepareStatement(sql);
// 把占位符,用实际的值给替换掉
for(int i = 0;i < obj.length;i++){
pstmt.setObject(i+1, obj[i]);
}
// 执行并返回
return pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
测试文件Test.java
import java.sql.ResultSet;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception {
DataBase db = new DataBase();
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("1.增加");
System.out.println("2.删除");
System.out.println("3.修改");
System.out.println("4.查找");
System.out.println("5.退出");
System.out.print("输入功能:");
int no = input.nextInt();
if(no == 5){
System.out.println("退出成功");
break;
}
switch(no){
case 1:
System.out.print("请输入部门号:");
int deptno = input.nextInt();
System.out.print("请输入部门名称:");
String dname = input.next();
System.out.print("请输入地点:");
String loc = input.next();
// "?"表示占位符
String sql = "insert into dept values (?,?,?)";
int num = db.DoExe(sql,deptno,dname,loc);
if(num>0) {
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
break;
case 2:
System.out.print("请输入要删除的部门编号:");
int deptno1 = input.nextInt();
String sql1 = "delete from dept where deptno=" + deptno1;
int num1 = db.DoExe(sql1);
if(num1>0) {
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
break;
case 3:
System.out.print("请输入修改的部门编号:");
int deptno2 = input.nextInt();
System.out.print("输入修改的列名:");
String col = input.next();
System.out.print("输入修改后的信息:");
String recol = input.next();
String sql2 = "update dept set " + col + "='" + recol + "' where deptno=" + deptno2;
int num2 = db.DoExe(sql2);
if(num2>0) {
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
break;
case 4:
/*
String sql3 = "select * from dept";
ResultSet qu = db.Query(sql3);
while(qu.next()) {
System.out.println(qu.getInt(1) + "----" + qu.getString(2) + "----" + qu.getString(3));
}*/
// 输入部门编号或者部门名称,查找有没有
System.out.print("输入部门编号");
int deptno4 = input.nextInt();
System.out.print("输入部门名称");
String dname4 = input.next();
String sql4 = "select * from dept where deptno=? and dname=?";
ResultSet qu1 = db.Query(sql4,deptno4,dname4);
if(!qu1.next()){
System.out.println("没有该用户");
}else{
System.out.println("有该用户");
System.out.println(qu1.getInt(1) + "----" + qu1.getString(2) + "----" + qu1.getString(3));
}
break;
}
}
}
}
链接:https://pan.baidu.com/s/1xTPh75P5EWyUli30FWJuiA
提取码:n3oc