Java DataBase Connectivity :可以为多种关系型数据库DBMS 提供统一的访问方式,用Java来操作数据库
一.JDBC访问数据库的具体步骤(以MySQL为例):
1.导入驱动,加载具体的驱动类1)导入驱动:
eclipse:
将E:\XunLei\Mysql\mysql-connector-java-8.0.19.jar加入项目的JER System Libray\src,
再右击文件,增加到类路径里面,Build Path->Add to Build Path
idea:
File->Project Structure->Libraies->点击加号>找到文件mysql-connector-java-8.0.19.jar->ok
运行
出现问题:Java程序运行时出现时提示配置Edit Configurations
解决方法:
在run里打开Edit Configurations,点击加号新建Application,选中自己的项目,填写Name、Main class名称,JER位置等(如图所示),其他的基本都是默认,点击OK。
2)加载具体的驱动类:
Class.forName(“com.mysql.jdbc.Driver”);
2.与数据库建立连接
3.发送sql,执行语句
4.返回处理条数(增删改)/处理结果集 (查询)
5.JDBC模板:
try{
Class.forName("具体驱动类"); //导入驱动包、加载具体驱动类
connection = DriverManager.getConnection(...); //与数据库建立连接
stmt = connection.createStatement(); //获取操作数据库的对象
rs = pstmt.executeQuery(); //返回处理条数(增删改)/处理结果集 (查询)
while(rs.next()){ rs.getXxx(..) ;}
}catch(ClassNotFoundException e )
{ ...}
catch(SQLException e)
{...
}
catch(Exception e)
{...
}
finally
{
//打开顺序,与关闭顺序相反,最先打开的最后关闭
if(rs!=null)rs.close()
if(stmt!=null) stmt.close();
if(connection!=null)connection.close();
}
6.示例程序见:
https://gitee.com/ma_meng_jiao/JDemo/blob/master/src/demo.java
二、数据库驱动
*使用jdbc操作数据库时,如果对数据库进行了更换,只需要替换:驱动、具体驱动类、连接字符串、用户名、密码
三、JDBC API的主要功能:
1.DriverManager : 管理jdbc驱动
2.
Connection: 连接
eg:
Connection connection =DriverManager.getConnection(URL,USERNAME,PWD);
3.
1)Statement(PreparedStatement) :增删改查
eg:
Statement stmt = connection.createStatement();
对数据库的操作:
增删改:executeUpdate();
查询:executeQuery();
2)还有几种衍生的语句:
PreparedStatement、CallableStatement Connection
产生的方法:prepareStatement()、prepareCall();
3)ResultSet :返回的结果集
**rs默认指向第0行,和迭代器运行相似*
eg:
ResultSet rs = stmt.executeQuery(sql);
4)PreparedStatement的预编译优点:
sql语句可能存在占位符?,在创建PreparedStatement 对象时,将sql预编译 prepareStatement(sql),然后获取值setXxx(),替换占位符?,在执行executeUpdate()
eg:
Scanner input= new Scanner(System.in); System.out.println("请输入id:");
int id = input.nextInt() ;
String sql ="select count(*) from 13
where id
= ? ";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
四、处理数据类型
1.稍大型数据:通过JDBC存储文件路径,然后根据IO操作处理
2. CLOB:大文本数据 (小说)
BLOB:二进制文本 (音乐、视频)
1)clob:
大文本数据(超过4000字节),字符流 Reader Writer
存储:
1.prepareStatement pstmt 的? 代替小说内容 (占位符)
2.pstmt.setCharacterStream(2, reader, (int)file.length()); 将上一步的?替换为 小说
*注意第三个参数需要是 Int类型
eg:
String sql = "insert into mynovel values(?,?)";
// c.发送sql,执行(增删改、查)
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 1);
File file = new File("E:\\all.txt");
InputStream in = new FileInputStream( file) ;
Reader reader = new InputStreamReader( in ,"UTF-8") ;//转换流 可以设置编码
pstmt.setCharacterStream(2, reader, (int)file.length());
int count =pstmt.executeUpdate() ;
// d.处理结果
if (count > 0) {
System.out.println("操作成功!");
}
reader.close();
取走:
1.通过Reader reader = rs.getCharacterStream(“NOVEL”) ; 将cloc类型的数据 保存到Reader对象中
2. 将Reader通过Writer输出即可。
eg:
String sql = "select NOVEL from mynovel where id = ? ";
// c.发送sql,执行(查)
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 1);
rs = pstmt.executeQuery() ;
//setXxxx getXxxx setInt getInt
if(rs.next())
{
Reader reader = rs.getCharacterStream("NOVEL") ;
Writer writer = new FileWriter("src/小说.txt");
//将小说从内存->缓存->硬盘,chs就是缓存
//reader->chs->writer
char[] chs = new char[100] ;
int len = -1;
while( (len = reader.read(chs)) !=-1 ) {
writer.write( chs,0,len );
}
writer.close();
reader.close();
}
2)
blob:二进制 字节流 InputStream OutputStream
与CLOB步骤基本一致,区别:setBinaryStream(…) getBinaryStream(…)
eg:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class JDBCBlob {
private static final String URL = "jdbc:oracle:thin:@localhost:1521:ORCL";
private static final String USERNAME = "scott";
private static final String PWD = "tiger";
//通过jdbc存储二进制类型 (mp3)
//设置BLOB类型:
public static void blobDemo() {
Connection connection = null;
PreparedStatement pstmt = null;
try {
// a.导入驱动,加载具体的驱动类
Class.forName("oracle.jdbc.OracleDriver");// 加载具体的驱动类
// b.与数据库建立连接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
String sql = "insert into mymusic values(?,?)";
// c.发送sql,执行(增删改、查)
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 1);
File file = new File("d:\\luna.mp3");
InputStream in = new FileInputStream(file );
pstmt.setBinaryStream(2,in ,(int)file.length() );
int count =pstmt.executeUpdate() ;
// d.处理结果
if (count > 0) {
System.out.println("操作成功!");
}
in.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
finally {
try {
if(pstmt!=null) pstmt.close();// 对象.方法
if(connection!=null)connection.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
//读取二进制文件
public static void blobReaderDemo() {
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null ;
try {
// a.导入驱动,加载具体的驱动类
Class.forName("oracle.jdbc.OracleDriver");// 加载具体的驱动类
// b.与数据库建立连接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
String sql = "select music from mymusic where id = ? ";
// c.发送sql,执行(查)
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 1);
rs = pstmt.executeQuery() ;
if(rs.next())
{
InputStream in = rs.getBinaryStream("music") ;
OutputStream out = new FileOutputStream("src/music.mp3") ;
byte[] chs = new byte[100] ;
int len = -1;
while( (len = in.read(chs)) !=-1 ) {
out.write( chs,0,len );
}
out.close();
in.close();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
finally {
try {
if(pstmt!=null) pstmt.close();// 对象.方法
if(connection!=null)connection.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// blobDemo() ;
blobReaderDemo();
}
}