JDBC是什么?
JDBC代表Java数据库连接,这对Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API。
JDBC 的实现包括三个部分
1.JDBC 驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql.DriverManager类实现
2.JDBC驱动API:最主要的接口是java.sql.Driver接口
3.JDBC驱动器:他是一种数据驱动由数据库厂商创建,也称jdbc驱动程序
JDBC驱动器实现了JDBC驱动器API,负责与特定的数据库连接以及处理通信细节
JDBC常用API
1.Driver接口
是所有JDBC驱动程序必须实现的接口该接口专门提供给数据库厂商使用,在编写JDBC程序时必须要
把指定数据库驱动程序或类库加载到项目的CLASSPATH中
2.DriverManager类
用于加载JDBC驱动并且创建与数据库的链接。定义了两个重要的静态方法
registerDriver(Driver driver)向DriverManager中注册给定的JDBC驱动程序
getConnection(String url,String user,String pwd)建立与数据库的链接,并返 回表示
连接的Connection对象
3.Connection接口
代表java程序和数据库的链接
getMetaData()返回表示数据库的元数据的DataBaseMetaData对象
createstatement()创建一个statement对象来将SQL语句发送到数据库
prepareStatement(String sql)创建一个prepareStatement对象来讲参数化的
sql语句发送到数据库 。
prepareCall(String sql)创建一个callableStatement对象来调节数据库存储过程
4.statement接口
用于向数据库发送SQL语句
execute(String sql)返回一个Boolean类型的值
executeUpdate(String sql)执行SQL中的insert,update和delete语句,返回一个int类型的值,表示数据库受该SQL语句影响的记录数目;
executeQuery(String sql)执行SQL中select语句返回一个表示查询结果的ResultSet对象
5.preparedStatement接口
是statement的子接口用于执行预编译的SQL语句
executeUpdate()执行SQL中的insert,update和delete语句,返回一个int类型的值,表示数据库受该SQL语句影响的记录数目,SQL操纵DML或者无返回内容,如DDL;
executeQuery()执行SQL中select语句返回一个表示查询结果的ResultSet对象
6.callablestatement接口
是preparedStatement的子接口用于执行SQL的存储过程
7.result的接口
表示select查询语句得到的结果集,接口内部有一个指向表格数据行的游标
实现第一个JDBC程序
1.加载并注册数据库驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
2.通过DriverManager获取数据库连接
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
3.通过Connection对象获取Statement对象
Statement stmt = conn.createStatement();
String sql = "select * from person";
4.使用Statement执行SQL语句
ResultSet rs = stmt.executeQuery(sql);
5.操作ResultSet结果集
while(rs.next()) {
System.out.println(rs.getInt(1)+rs.getString(2)+rs.getString(3)+rs.getString(4)+rs.getString(5)+rs.getFloat(6)+rs.getDate(7)+rs.getString(8));
}
6.回收数据库资源,关闭数据库连接,释放资源
rs.close();
stmt.close();
conn.close();
JDBC 的改进
1.注册驱动
在注册数据库驱动时虽然DriverManager.registerDriver(new com.jdbc.mysql.Driver)方
法可以完成但是驱动会被执行两次,因为Driver类源码中已经在静态代码块中完成了数据库驱动
的注册。所以只需在程序中加载驱动类即可
Class.forName("com.mysql.jdbc.Driver")
2.释放资源
由于数据库资源宝贵,数据库允许的并发访问连接数量有限,所以一定要释放资源,应该将最终必
须要执行的操作放finally代码块中
PreparedStatement对象
statement对象每次执行SQL语句时,都会对其进行编译,当相同的语句执行多次,statement就会
使数据库频繁的编译相同的SQL语句,会降低数据库的访问效率。为解决上述问题Statement提供了
一个子类PreparedStatement。PreparedStatement。可以对SQL语句进行预编译,也就是说当相
同的SQL语句,数据库只需使用缓冲区的数据,而不需对SQL语句进行再次编译
Connection conn = null;
PreparedStatement pstt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "";
conn = DriverManager.getConnection(url, user, password);
String sql = "insert into person values(?,?,?)";
pstt = conn.prepareStatement(sql);
pstt.setString(1, "呵呵");
pstt.setInt(2, 10);
pstt.setString(3,"哈哈");
pstt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {//释放资源
if(pstt!=null){
pstt.close();
}
if(conn!=null) {
conn.close();
}
}
resultset对象
resultSet主要存储结果集,并通过next()方法由前向后逐个获取结果集中的数据,如果想获取任意位置的数据需在创建Statement之前,设置两个Result定义的常量
Connection conn = null;
Statement smtt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url, user, password);
String sql = "select * from person";
smtt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = smtt.executeQuery(sql);
System.out.println("第三条数据name的值为:");
rs.absolute(3); //定位指针
System.out.println(rs.getString("name"));
System.out.println("第一条数据name的值为:");
rs.beforeFirst(); //定位到第一行之前
rs.next(); //指针向后滚动
System.out.println(rs.getString("name"));
System.out.println("最后一条数据name的值为:");
rs.afterLast(); //定位到最后一行之后
rs.previous(); //指针向前滚动
System.out.println(rs.getString("name"));
} catch (SQLException e) {
e.printStackTrace();
}finally {//释放资源
if(rs!=null){
rs.close();
}
if(smtt!=null){
smtt.close();
}
if(conn!=null) {
conn.close();
}
}
JDBC批处理
1.statement 批处理
Statement通过addBatch()方法添加一条SQL语句,通过executeBatch实现批处理
String sql = "";
String sql2 ="insert into ....";
String sql3 = "update person set id=1";
smtt.addBatch(sql);
smtt.addBatch(sql2);
smtt.addBatch(sql3);
smtt.executeBatch();
2.PreparedStatement批处理
String sql = "insert into person values(?,?,?)";
pstt = conn.prepareStatement(sql);
for(int i=0;i<5;i++){
pstt.setString(1," ");
pstt.setString(2," ");
pstt.setString(3," ");
pstt.addBatch();
}
pstt.executeBatch();
JDBCUtils
public static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
public static void release(Statement stmt,Connection conn){
try {
if(stmt!=null){stmt.close();}
if(conn!=null){conn.close();}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
try {
if(rs!=null){rs.close();}
if(stmt!=null){stmt.close();}
if(conn!=null){conn.close();}
} catch (SQLException e) {
e.printStackTrace();
}
}
//在properties文件中
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day15
user=root
password=sorry
-----------------------------------------------------------------------
private static String driverClass;
private static String url;
private static String user;
private static String password;
static{//代码块随着类而加载一次
try {
ClassLoader cl = JdbcUtil.class.getClassLoader();//类加载器
InputStream in = cl.getResourceAsStream("dbcfg.properties");
Properties props = new Properties();
props.load(in);
driverClass = props.getProperty("driverClass");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
Class.forName(driverClass);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws Exception{
Connection conn = DriverManager.getConnection(url,user, password);
return conn;
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
封装JDBC的连接及增删改查的方法
private Connection conn = null;
private PreparedStatement pstt = null;
private ResultSet rs = null;
public static final String url = "jdbc:mysql://localhost:3306/test?useUnicode=ture&characterEncoding=utf-8";
public static final String user = "root";
public static final String password = "root";
public static final String driverclass = "com.mysql.jdbc.Driver";
public Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public int executeUpdate(String sql, Object... para) {//可变数组
getConnection();
int a = 0;
try {
pstt = conn.prepareStatement(sql);
for (int i = 0; i < para.length; i++) {
pstt.setObject((i + 1), para[i]);
}
a = pstt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return a;
}
public ResultSet executeQuery(String sql,Object ...para){//可变数组
getConnection();
try {
pstt = conn.prepareStatement(sql);
for (int i = 0; i < para.length; i++) {
pstt.setObject((i + 1), para[i]);
}
rs = pstt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class jdbcUtil {
private static Connection conn = null;
private static PreparedStatement pstt = null;
private static ResultSet rs = null;
private static String driverClass;
private static String url;
private static String user;
private static String password;
static {
try {
ClassLoader cl = jdbcUtil.class.getClassLoader();
InputStream in = cl.getResourceAsStream("a.properties");
Properties pro = new Properties();
pro.load(in);
driverClass = pro.getProperty("driverClass");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
Class.forName(driverClass);
} catch (Exception e) {
e.printStackTrace();
}
}
public static int executeUpdate(String sql, Object... para) {
int a = 0;
try {
conn = DriverManager.getConnection(url,user, password);
pstt = conn.prepareStatement(sql);
for (int i = 0; i < para.length; i++) {
pstt.setObject((i + 1), para[i]);
}
a = pstt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return a;
}
public static ResultSet executeQuer(String sql, Object... para) {// 可变数组
try {
conn = DriverManager.getConnection(url,user, password);
pstt = conn.prepareStatement(sql);
for (int i = 0; i < para.length; i++) {
pstt.setObject((i + 1), para[i]);
}
rs = pstt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public static void close() {
try {
if (rs != null) {
rs.close();
}
if (pstt != null) {
pstt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
大数据处理
大数据处理主要指的是对CLOB和BLOB类型数据的操作
在应用操作中这两个数据类型必须使用PreparedStatement完成,并且操作形式都要以IO流的形式进行存放和读取
1.处理CLOB数据
写入大文本
读取