JAVA学习记录—JDBC
一、JDBC简介
JDBC(java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
java具有坚固、安全、易于使用、易于理解和可以从网络上主动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是ava应用程序与各种不同数据库之间进行对话的方法。
JDBC可以在各种平台上使用java,如Windows,Mac OS和各种版本的UNIX。
JDBC库包括通常与数据库使用相关的下面提到的每个任务的API。
连接数据库。
创建SQL或MySQL语句。
在数据库中执行SQL或MySQL查询。
查看和修改生成的记录。
二、JDBC体系结构
JDBC API支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层组成;
JDBC API:这提供了应用程序到JDBC管理器的连接。
JDBC驱动程序API:这支持JDBC管理器到驱动程序连接。
JDBC API使用驱动程序管理器和特定与数据库的驱动程序来提供与异构数据库的透明连接。
三、JDBC核心组件
DriverManager:此类管理数据库驱动程序列表,使用通信子协议将来自Java应用程序的连接请求与适当的数据库驱动程序匹配。
Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互,而是使用DriverManager对象来管理这种类型的对象。
Connection:该界面具有用于联系数据库的所有方法。连接对象表示通信上下文,即与数据库的所有通信仅通过连接对象。
Statement:使用从此接口创建的对象将SQL语句提交到数据库。执行存储过程之外,一些派生接口还接收参数。
ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。
SQLException:此类处理数据库应用程序中发生的的任何错误
四、使用步骤
构建JDBC应用程序涉及以下六个步骤:
导入包:需要包含数据库编程所需的JDBC类的包。大多数情况下,使用import java.sql.*就足够了。
注册JDBC驱动程序:要求初始化驱动程序,以便可以打开与数据库的通信通道。
打开链接:需要使用DriverManager.gerConnection()方法创建一个Connection对象,该对象表示与数据库的物理连接。
执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库。
从结果集中提取数据:需要使用相应的ResultSet.getxxx()方法从结果集中检索数据。
释放资源:需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集。
五、JDBC连接步骤
建立JDBC连接需要四个步骤
导入JDBC包:将java语言的import语句添加到java代码中导入所需的类
注册JDBC驱动程序:此步骤将使JVM将所需的驱动程序实现加载到内存中,以便它可以满足您的JDBC请求
数据库URL配置:这是为了创建一个格式正确的地址,指向要连接到的数据库
创建连接对象:最后,调用DriverManager对象的getConnection()方法来建立实际的数据库连接
Class.forName();
注册驱动程序最常见的方法是使用Java的Class.forName()方法,将驱动程序的类文件动态加载到内存中,并将其自动注册
六、Druid(德鲁伊)连接池
阿里出品,淘宝和支付宝专用数据路连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver(代理驱动),一系列内置的JDBC组件库,一个SQL Parser(SQL解析器),支持所有JDBC兼容的数据库,包括Oracle, MySql, Derby, Postgresql, SQL server, H2等等.
Druid针对Oracle和MySql做了特别优化,比如Oracle的PSCache内存占用优化,MySql的ping检测优化。
Druid提供了MySqlOracle、PostgresqlSQL-92的SQL的完整支持,这是一个手写的高性能SQLParser,支持 Visitor模式,使得分析SQL的抽象语法树很方便。
简单SQL语句用时10微秒以内,复杂SQL用时30微秒。
通过Druid提供的SQLParser 以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQLParser分析语义实现的。
Druid是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
一.亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
四.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据 统中注入数据,包括hadoop, spark,kafka,storm和samza等
德鲁伊案例代码:
Jdbcutil.java
package util;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.*;
import java.util.List;
import java.util.ResourceBundle;
public class Jdbcutil {
//1.定义变量
private Connection connection;
private ResultSet resultSet;
private PreparedStatement pps;
private int count;
private static String userName;
private static String passWord ;
private static String url;
private static String driverName;
//德鲁伊
private static DruidDataSource druidDataSource = new DruidDataSource();
//2.加载驱动
static{
//德鲁伊
ResourceBundle bundle = ResourceBundle.getBundle( "db" );
driverName = bundle.getString( "driverclass" );
url = bundle.getString( "url" );
userName = bundle.getString( "userName" );
passWord = bundle.getString( "passWord" );
druidDataSource.setUsername( userName );
druidDataSource.setPassword( passWord );
druidDataSource.setUrl( url );
druidDataSource.setDriverClassName( driverName );
}
//3.获得链接
protected Connection getConnection(){
try {
connection = druidDataSource.getConnection();
// connection = DriverManager.getConnection(url,userName,passWord);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
//4.得到预状态通道
protected PreparedStatement getPps(String sql){
try {
pps = getConnection().prepareStatement(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return pps;
}
//5.绑定参数
protected void param(List list){
if(list!=null&&list.size()>0){
for(int i=0;i<list.size();i++){
try {
pps.setObject(i+1,list.get( i ));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
//6.执行操作(增删改+查询)
protected int update(String sql, List list){
getPps( sql );
param(list);
try {
count = pps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return count;
}
//7.查询
protected ResultSet query(String sql,List list){
getPps( sql );
param(list);
try {
resultSet = pps.executeQuery();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return resultSet;
}
//8.关闭资源
protected void closeAll(){
if(connection!=null&&resultSet!=null&&pps!=null){
try {
connection.close();
resultSet.close();
pps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
db.properties配置文件
driverclass= com.mysql.cj.jdbc.Driver
userName = root
passWord = root
url = jdbc:mysql://localhost:3306/myframe?serverTimezone=UTC
StudentDaoImpl.java
package dao.impl;
import bean.Student;
import util.Jdbcutil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class StudentDaoImpl extends Jdbcutil implements StudentDao{
@Override
public Student getByid(int id) {
Student student = new Student();
try {
String sql = "select * from student where id = ?";
List list = new ArrayList<>();
list.add( id );
ResultSet resultSet = query( sql, list );
while (resultSet.next()) {
student.setId( resultSet.getInt( "id" ) );
student.setName( resultSet.getString( "name" ) );
student.setSex( resultSet.getString( "sex" ) );
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
closeAll();
}
return student;
}
}
StudentDao.java接口
package dao.impl;
import bean.Student;
import java.sql.SQLException;
public interface StudentDao {
public Student getByid(int id) throws SQLException;
}
Demo测试类:
package test;
import bean.Student;
import dao.impl.StudentDao;
import dao.impl.StudentDaoImpl;
import java.sql.SQLException;
public class Demo3 {
public static void main(String[] args) throws SQLException {
StudentDao dao = new StudentDaoImpl();
Student student = dao.getByid( 1 );
System.out.println("id:"+student.getId()+" 姓名:"+student.getName()+" 性别:"+student.getSex());
}
}
运行结果
<--------------------------------------------------------------------------------------------------------------------------------------->