Java连接所有数据库的性能都很高,除了SQL Server
关于JDBC(Java DataBase Connection):
一.JDBC-ODBC桥接技术(几乎不用)
二.JDBC直接连接
三.JDBC网络连接(应用最多,以此为例)
四.模拟指定数据库通信协议,编写自己的数据库操作
java中的所有数据库的类和接口都在java.sql包中
一个类:DriverManager
四个接口:Connection,Statement,ResultSet,PreparedStatement。
连接数据库依靠DriverManager类完成
每一个数据库的连接都要使用Connection对象进行封装,所以,每使用一次Connection就表示要连接一次数据库
Connection提供的close()方法:public void close()throws SQLException。
执行模式不适合处理敏感字符
不要在sql语句后加” ; “
否则报错:
Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Demo {
private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
private static final String USER="scott";
private static final String PASSWORD="tiger";
public static void main(String[] srgs)throws Exception{
//第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
Class.forName(DBDRIVER);
//第二步,连接数据库
Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
//System.out.println(conn);
//第三部进行数据库的操作
Statement stmt = conn.createStatement();
String sql=" INSERT INTO member(mid,name,birthday,age,note) VALUES(myseq.nextval,'老大',TO_DATE('1996-01-01','yyyy-mm-dd'),22,'没什么好说的') ";
int len=stmt.executeUpdate(sql); //执行sql返回更新的数据行
System.out.println("影响数据行数:"+len); //有输出则表示连接成功
//第四步,关闭数据库
conn.close();
}
}
习惯:按顺序提取,且每个数据仅取一次
package com.test;
import java.sql.*;
public class Demo {
private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
private static final String USER="scott";
private static final String PASSWORD="tiger";
public static void main(String[] srgs)throws Exception{
//第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
Class.forName(DBDRIVER);
//第二步,连接数据库
Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
//System.out.println(conn);
//第三部进行数据库的操作
Statement stmt = conn.createStatement();
String sql=" select mid,name,birthday,age,note from member "; //在jdbc中的sql语句中不适用*
ResultSet rs =stmt.executeQuery(sql);
while (rs.next()){ //循环取出每一行数据
//int mid=rs.getInt(1); //也可按序号提取
// String name=rs.getString(2);
//Date birthday=rs.getDate(3);
//int age=rs.getInt(4);
//String note=rs.getString(5);
int mid=rs.getInt("mid");
String name=rs.getString("name");
Date birthday=rs.getDate("birthday");
int age=rs.getInt("age");
String note=rs.getString("note");
System.out.println(mid+","+name+","+birthday+","+age+","+note);
}
//int len=stmt.executeUpdate(sql); //执行sql返回更新的数据行
//System.out.println("影响数据行数:"+len); //有输出则表示连接成功
//第四步,关闭数据库
conn.close(); //非必要
stmt.close(); //非必要
conn.close();
}
}
与Statement不同:
执行的是完整的具备特殊占位标记的SQL语句,动态设置我们所需要的数据。
在日常开发中常用
更新操作:public int executeUpdate()throws SQLException
查询操作:public ResultSet executeQuery()throws SQLException
在java.unit.date 中的三个类在java.sql.date包中
更新操作几乎是固定的模式,
import java.sql.*;
import java.util.Date;
public class Demo {
private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
private static final String USER="scott";
private static final String PASSWORD="tiger";
public static void main(String[] srgs)throws Exception{
String name="Smith";
Date birthday = new Date();
int age=23;
String note="wohat";
//第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
Class.forName(DBDRIVER);
//第二步,连接数据库
Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
//第三部进行数据库的操作
String sql=" INSERT INTO member(mid,name,birthday,age,note) VALUES(myseq.nextval,?,?,?,?) ";
PreparedStatement stmt=conn.prepareStatement(sql);
stmt.setString(1,name);
stmt.setDate(2,new java.sql.Date(birthday.getTime()));
stmt.setInt(3,age);
stmt.setString(4,note);
int len=stmt.executeUpdate(); //执行sql返回更新的数据行
System.out.println("影响数据行数:"+len); //有输出则表示连接成功
//第四步,关闭数据库
conn.close();
}
}
import java.sql.*;
public class Demo {
private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
private static final String USER="scott";
private static final String PASSWORD="tiger";
public static void main(String[] srgs)throws Exception{
//第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
Class.forName(DBDRIVER);
//第二步,连接数据库
Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
//第三部进行数据库的操作
String sql=" select mid,name ,birthday,age,note from member order by mid ";
PreparedStatement stmt=conn.prepareStatement(sql);
ResultSet rs=stmt.executeQuery();
while(rs.next()){
int mid=rs.getInt(1);
String name=rs.getString(2);
Date birthday =rs.getDate(3);
int age=rs.getInt(4);
String note=rs.getString(5);
System.out.println(mid+","+name+","+birthday+","+age+","+note);
}
//第四步,关闭数据库
conn.close();
}
}
一次性向数据库发出多条操作指令一起一起执行。
import java.sql.*;
import java.util.Arrays;
public class Demo {
private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:midn";
private static final String USER="scott";
private static final String PASSWORD="tiger";
public static void main(String[] srgs)throws Exception{
//第一步,加载数据库驱动程序,不需要实例化,由容器负责管理
Class.forName(DBDRIVER);
//第二步,连接数据库
Connection conn=DriverManager.getConnection(DBURL,USER,PASSWORD);
//第三部进行数据库的操作`
Statement stmt=conn.createStatement();
conn.setAutoCommit(false); //设置不自动提交
try{
stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'a')");
stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'b')");
stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'c')");
stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'d')");
stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'e')");
stmt.addBatch(" insert into member(mid,name) values(myseq.nextval,'f')");
int result []=stmt.executeBatch(); //批量处理
System.out.println(Arrays.toString(result));
conn.commit();
}catch(Exception e){
e.printStackTrace();
}
conn.close();
//第四步,关闭数据库
conn.close();
}
}