数据库的驱动
- JDBC规范定义接口,具体的实现有各大数据库厂商来实现
- 具体实现的类叫 数据库驱动(由数据库厂商提供)
- 使用JDBC开发所使用到的包:
- java.sql所有与JDBC访问数据库相关的接口和类
- javax.sql 数据库扩展包,提供数据库额外的功能:如连接池
JDBC的核心API
- DriverManager类 管理和注册数据库驱动 得到数据库连接对象
- Connection接口 一个连接对象,可用于创建Statement和PrepareStatement对象
- Statement接口 一个SQL语句对象 用于将SQL语句发送给数据库服务器
- PreparedStatement接口 一个 SQL 语句对象,是 Statement 的子接口
- ResultSet 接口 结果集接口
加载和注册驱动的方法:
- Class.forName(数据库驱动实现类) 加载和注册数据库驱动,数据库驱动由 mysql 厂商 “com.mysql.cj.jdbc.Driver”(mysql 8.0)
- 如果数据库出现乱码,则URL为:jdbc:mysql:
//localhost:3306/userdata?characterEncoding=utf-8;
DriverManager类
- 管理和注册数据库驱动 得到数据库连接对象
- 类的方法有:
- Connection getConnection(URL , username , password)
- Connection getConnection(URL,ProPerties(username,password))
- URL=协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值 (注意数据库名和数据库服务器名是不同的)
Connection接口
- 一个连接对象,可用于创建Statement和PrepareStatement对象
- Connection方法:
- Statement createStatement() 创建一条SQL语句对象
Statement接口
- 一个SQL语句对象 用于将SQL语句发送给数据库服务器
public static final String url = "jdbc:mysql://localhost:3306/mim?&useSSL=false&serverTimezone=UTC";
public static final String user = "mysql数据库的用户名(默认为 root)";
public static final String password = "密码";
public static final String driver="com.mysql.cj.jdbc.Driver";
private static Connection connection=null;
private Statement sm=null;
private ResultSet rs=null;
use_JDBC(){
try {
Class.forName(driver);
//System.out.println("将驱动类加载到内存中!!!");
connection = DriverManager.getConnection(url, user, password);
//System.out.println("使用DriverManager类获得连接对象!!!");
sm=connection.createStatement();
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("驱动类加载到内存失败???");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("使用DriverManager类获得连接对象失败???");
}
}
JDBC 访问数据库的步骤
- 注册和加载驱动(可以省略)
- 获取连接
- Connection 获取 Statement 对象
- 使用 Statement 对象执行 SQL 语句
- 返回结果集
- 释放资源
释放资源
- 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
- 释放原则:先开的后关,后开的先关。ResultSet Statement Connection
- 放在哪个代码块中:finally 块
private static Connection connection=null;
private Statement sm=null;
private ResultSet rs=null;
protected void finalize() {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(sm!=null) {
try {
sm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null) {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Statement 中的方法:
int executeUpdate(String sql)
用于发送 DML 语句,增删改的操作,insert、update delete
参数:SQL 语句
返回值:返回对数据库影响的行数
ResultSet executeQuery(String sql)
用于发送 DQL 语句,执行查询的操作。select
参数:SQL 语句
返回值:查询的结果集
PreparedStatement接口 一个 SQL 语句对象,是 Statement 的子接口
SQL语句
相关知识,以后再写.
向数据库导入信息
public void insert(String name,String pwd,int age,String email) throws SQLException {
String sql="insert into userdata values(?,?,?,?)";
Psm=connection.prepareStatement(sql);
Psm.setString(1, name);
Psm.setString(2, pwd);
Psm.setInt(3, age);
Psm.setString(4,email);
Psm.executeUpdate();
}
从读取数据库信息
public void select(String name,userdata a_user)throws SQLException {
String sql="select * from userdata where name='"+name+"'";
rs=sm.executeQuery(sql);
if(rs.next()) {
a_user.setAll(rs.getString(1),rs.getString(2),rs.getInt(3),rs.getString(4));
a_user.setAlive(true);
}
}
注意
使用 Eclipse(javaEE) 做 Web项目,需要运行数据库时,首先与数据库相应的驱动类(mysql-connector-java-8.0.21.jar)复制到项目下./WebContent/WEB-INF/lib文件下,再将要将数据库服务启动,然后就可在Tomcat的服务下访问到数据库了.
数据库的使用用例
用户信息类
import java.sql.SQLException;
public class userdata {
private String name=null;
private String pwd=null;
private Integer age;
private String email=null;
private boolean alive=false; //存在属性,false表示无该用户,true表示有该用户.
/**Integer 能区分出 未赋值和值为0
* int 无法表达未赋值的情况
*/
void showAll() {
System.out.println(name+" "+pwd+" "+age+" "+email);
}
void setAll(String n,String p,int a,String e) {
this.name=n;
this.pwd=p;
this.age=a;
this.email=e;
}
public void save_sql()throws SQLException{
use_JDBC a1=new use_JDBC();
a1.insert(this);
a1.finalize();
}
public void load_sql()throws SQLException{
use_JDBC a=new use_JDBC();
a.select(name, this);
a.finalize();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public boolean getAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
}
数据库使用类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
//import com.mysql.cj.xdevapi.PreparableStatement;
//import com.mysql.cj.xdevapi.Result;
import java.sql.SQLException;
public class use_JDBC {
/**JDBC规范定义接口,具体的实现有各大数据库厂商来实现
* 具体实现的类叫 数据库驱动(由数据库厂商提供)
* 使用JDBC开发所使用到的包:
* java.sql 所有与JDBC访问数据库相关的接口和类
* javax.sql 数据库扩展包,提供数据库额外的功能:如连接池
* 数据库的驱动
* JDBC的核心API
* DriverManager类 管理和注册数据库驱动 得到数据库连接对象
* Connection接口 一个连接对象,可用于创建Statement和PrepareStatement对象
* Statement接口 一个SQL语句对象 用于将SQL语句发送给数据库服务器
* PreparedStatement接口 一个 SQL 语句对象,是 Statement 的子接口
* ResultSet 接口 结果集接口
*
* 加载和注册驱动的方法:
* Class.forName(数据库驱动实现类) 加载和注册数据库驱动,数据库驱动由 mysql 厂商 "com.mysql.cj.jdbc.Driver"
* 数据库出现乱码:jdbc:mysql://localhost:3306/userdata?characterEncoding=utf-8;
*/
public static final String url = "jdbc:mysql://localhost:3306/mim?&useSSL=false&serverTimezone=UTC";
public static final String user = "root";
public static final String password = "18872001579";
public static final String driver="com.mysql.cj.jdbc.Driver";
/**
* JDBC 访问数据库的步骤
* 1) 注册和加载驱动(可以省略)
2) 获取连接
3) Connection 获取 Statement 对象
4) 使用 Statement 对象执行 SQL 语句
5) 返回结果集
6) 释放资源
* DriverManager类 管理和注册数据库驱动 得到数据库连接对象
* 类的方法有:
* Connection getConnection(URL , username , password)
* Connection getConnection(URL , ProPerties(username,password))
* URL=协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值
*
* Connection接口 一个连接对象,可用于创建Statement和PrepareStatement对象
* Connection方法:Statement createStatement() 创建一条SQL语句对象
*
* Statement接口 一个SQL语句对象 用于将SQL语句发送给数据库服务器
* Statement 中的方法:
*int executeUpdate(String sql)
用于发送 DML 语句,增删改的操作,insert、update delete
参数:SQL 语句
返回值:返回对数据库影响的行数
*ResultSet executeQuery(String sql)
用于发送 DQL 语句,执行查询的操作。select
参数:SQL 语句
返回值:查询的结果集
*
*释放资源
1) 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
2) 释放原则:先开的后关,后开的先关。ResultSet Statement Connection
3) 放在哪个代码块中:finally 块
*
* DDL操作 建表
* */
private static Connection connection=null;
private Statement sm=null;
private ResultSet rs=null;
private PreparedStatement Psm=null;
use_JDBC(){
try {
Class.forName(driver);
//System.out.println("将驱动类加载到内存中!!!");
connection = DriverManager.getConnection(url, user, password);
//System.out.println("使用DriverManager类获得连接对象!!!");
sm=connection.createStatement();
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("驱动类加载到内存失败???");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("使用DriverManager类获得连接对象失败???");
}
}
use_JDBC(String URL,String USER,String PASSWORD){
try {
Class.forName(driver);
//System.out.println("将驱动类加载到内存中!!!");
connection = DriverManager.getConnection(URL,USER,PASSWORD);
//System.out.println("使用DriverManager类获得连接对象!!!");
sm=connection.createStatement();
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("驱动类加载到内存失败???");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("使用DriverManager类获得连接对象失败???");
}
}
protected void finalize() {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(sm!=null) {
try {
sm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null) {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void insert(String name,String pwd,int age,String email) throws SQLException {
String sql="insert into userdata values(?,?,?,?)";
Psm=connection.prepareStatement(sql);
Psm.setString(1, name);
Psm.setString(2, pwd);
Psm.setInt(3, age);
Psm.setString(4,email);
Psm.executeUpdate();
}
public void insert(userdata a_user) throws SQLException {
//a_user中的数据不为空
String sql="insert into userdata values(?,?,?,?)";
Psm=connection.prepareStatement(sql);
Psm.setString(1, a_user.getName());
Psm.setString(2, a_user.getPwd());
Psm.setInt(3, a_user.getAge());
Psm.setString(4,a_user.getEmail());
Psm.executeUpdate();
}
public void select(String name,userdata a_user)throws SQLException {
String sql="select * from userdata where name='"+name+"'";
rs=sm.executeQuery(sql);
if(rs.next()) {
a_user.setAll(rs.getString(1),rs.getString(2),rs.getInt(3),rs.getString(4));
a_user.setAlive(true);
}
}
public void select()throws SQLException {
String sql="select * from userdata";
rs=sm.executeQuery(sql);
while(rs.next())
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getInt(3)+" "+rs.getString(4));
}
public void delete(String name) {
String sql="delete from userdata where name=?";
try {
Psm=connection.prepareStatement(sql);
Psm.setString(1,name);
Psm.executeUpdate();
} catch (SQLException e) {
System.out.println("delete 操作执行失败???");
e.printStackTrace();
}
}
}
写于2020-10-18