JdbcInterface:统一规范
package com.hspedu.jdbc.myjdbc;
/**
* @version 1.0
* 我们规定的 jdbc 接口(方法)
*/
public interface JdbcInterface {
//连接
public Object getConnection() ;
//crud
public void crud();
//关闭连接
public void close();
}
MysqlJdbcImpl:mysql厂商的自我实现
package com.hspedu.jdbc.myjdbc;
/**
* @version 1.0
* mysql 数据库实现了 jdbc 接口 [模拟] 【mysql 厂商开发】
*/
public class MysqlJdbcImpl implements JdbcInterface{
@Override
public Object getConnection() {
System.out.println("得到 mysql 的连接");
return null;
}
@Override
public void crud() {
System.out.println("完成 mysql 增删改查");
}
@Override
public void close() {
System.out.println("关闭 mysql 的连接");
}
}
OracleJdbcImpl:Oracle厂商的自我实现
package com.hspedu.jdbc.myjdbc;
/**
* @version 1.0
* 模拟 oracle 数据库实现 jdbc
*/
public class OracleJdbcImpl implements JdbcInterface {
@Override
public Object getConnection() {
System.out.println("得到 oracle 的连接 升级");
return null;
}
@Override
public void crud() {
System.out.println("完成 对 oracle 的增删改查");
}
@Override
public void close() {
System.out.println("关闭 oracle 的连接");
}
}
测试类:
package com.hspedu.jdbc.myjdbc;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import java.util.Scanner;
public class TestJDBC {
public static void main(String[] args) throws Exception {
//完成对 mysql 的操作
JdbcInterface jdbcInterface = new MysqlJdbcImpl();
jdbcInterface.getConnection(); //通过接口来调用实现类[动态绑定]
jdbcInterface.crud();
jdbcInterface.close();
//完成对 oracle 的操作
System.out.println("==============================");
jdbcInterface = new OracleJdbcImpl();
jdbcInterface.getConnection(); //通过接口来调用实现类[动态绑定]
jdbcInterface.crud();
jdbcInterface.close();
}
}
-- 先创建测试表
create table actor
(id int primary key auto_increment,
name varchar(32) not null default '',
sex char(1) not null default '女',
borndate datetime,
phone varchar(12));
package com.hspedu.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 这是第一个 Jdbc 程序,完成简单的操作
*/
public class Jdbc01 {
public static void main(String[] args) throws SQLException {
//前置工作: 在项目下创建一个文件夹比如 libs
// 将 mysql.jar 拷贝到该目录下,点击 add to project ..加入到项目中
//1. 注册驱动
Driver driver = new Driver(); //创建 driver 对象
//2. 得到连接
// 解读
//(1) jdbc:mysql:// 规定好表示协议,通过 jdbc 的方式连接 mysql
//(2) localhost 主机,可以是 ip 地址
//(3) 3306 表示 mysql 监听的端口
//(4) hsp_db02 连接到 mysql dbms 的哪个数据库
//(5) mysql 的连接本质就是前面学过的 socket 连接
String url = "jdbc:mysql://localhost:3306/hsp_db02";
//将 用户名和密码放入到 Properties 对象
Properties properties = new Properties();
//说明 user 和 password 是规定好,后面的值根据实际情况写
properties.setProperty("user", "root");// 用户
properties.setProperty("password", "hsp"); //密码
Connection connect = driver.connect(url, properties);
//3. 执行 sql
//String sql = "insert into actor values(null, '刘德华', '男', '1970-11-11', '110')";
//String sql = "update actor set name='周星驰' where id = 1";
String sql = "delete from actor where id = 1";
//statement 用于执行静态 SQL 语句并返回其生成的结果的对象
Statement statement = connect.createStatement();
int rows = statement.executeUpdate(sql); // 如果是 dml 语句,返回的就是影响行数
System.out.println(rows > 0 ? "成功" : "失败");
//4. 关闭连接资源
//请关闭流,否则将来造成大量连接,而mysql的连接是有上限的
statement.close();
connect.close();
}
}
//方式 1
@Test
public void connect01() throws SQLException {
Driver driver = new Driver(); //创建 driver 对象
String url = "jdbc:mysql://localhost:3306/hsp_db02";
//将 用户名和密码放入到 Properties 对象
Properties properties = new Properties();
//说明 user 和 password 是规定好,后面的值根据实际情况写
properties.setProperty("user", "root");// 用户
properties.setProperty("password", "hsp"); //密码
Connection connect = driver.connect(url, properties);
System.out.println(connect);
}
//方式 2
@Test
public void connect02() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
// 说明:使用反射机制,将来可以将类的信息写入配置文件中,
//不需要更改源代码,灵活!
//使用反射加载 Driver 类 , 动态加载,更加的灵活,减少依赖性
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver)aClass.newInstance();
String url = "jdbc:mysql://localhost:3306/hsp_db02";
//将 用户名和密码放入到 Properties 对象
Properties properties = new Properties();
//说明 user 和 password 是规定好,后面的值根据实际情况写
properties.setProperty("user", "root");// 用户
properties.setProperty("password", "hsp"); //密码
Connection connect = driver.connect(url, properties);
System.out.println("方式 2=" + connect);
}
//方式 3 使用 DriverManager 替代 driver 进行统一管理
// 该方式主要是利用DriverManager提供的getConnection方法
// 该方法可以直接填入String类型的参数,避免了将配置信息写入Properties文件
@Test
public void connect03() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException {
//使用反射加载 Driver
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) aClass.newInstance();
//创建 url 和 user 和 password
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "hsp";
DriverManager.registerDriver(driver);//注册 Driver 驱动
//可以直接填入用户名和密码
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("第三种方式=" + connection);
}
Class.forName可以省略不写,原因如上图,但还是建议写上
//方式 4: 使用 Class.forName 自动完成注册驱动,简化代码
//相比于方式三简化了注册驱动的步骤:
//DriverManager.registerDriver(driver)
//这种方式获取连接是使用的最多,推荐使用
@Test
public void connect04() throws ClassNotFoundException, SQLException {
//使用反射加载了 Driver 类
//在加载 Driver 类时,完成注册
/*
源码:
1. 静态代码块,在类加载时,会执行一次.
2. DriverManager.registerDriver(new Driver());
3. 因此注册 driver 的工作已经完成
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
*/
Class.forName("com.mysql.jdbc.Driver");
//创建 url 和 user 和 password
String url = "jdbc:mysql://localhost:3306/hsp_db02";
String user = "root";
String password = "hsp";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("第 4 种方式~ " + connection);
}
自我理解:
Driver和DriverManager可以理解为节点流和处理流的区别
//方式 5 , 在方式 4 的基础上改进,增加配置文件,让连接 mysql 更加灵活
@Test
public void connect05() throws IOException, ClassNotFoundException, SQLException {
//通过 Properties 对象获取配置文件的信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
Class.forName(driver);//建议写上
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("方式 5 " + connection);
}
Properties properties = new Properties();
File file = new File("./src/com/jdbc_start/jdbc.properties");
if (!file.exists()){
System.out.println("文件不存在!");
System.exit(0);
}
properties.load(new FileInputStream(file));
String url = (String) properties.get("url");
String driver = (String) properties.get("driver");
String user = (String) properties.get("user");
String password = (String) properties.get("password");
Class<?> cls = Class.forName(driver);
Connection connection = DriverManager.getConnection(url, user, password);
Statement statement = connection.createStatement();
// String sql = "create table news(id int primary key auto_increment,content varchar(32) not null default ' ') charset utf8 collate utf8_bin engine innodb";
// String sql = "drop table news";
// String sql = "insert into news (content) values ('佛山新闻'),('江西新闻')";
// String sql = "update news set content = '深圳新闻' where id = 1";
String sql = "delete from news where id = 3";
int rows = statement.executeUpdate(sql);
System.out.println(rows>0?"成功":"失败");