JDBC的使用

数据库的驱动

  • JDBC规范定义接口,具体的实现有各大数据库厂商来实现
  • 具体实现的类叫 数据库驱动(由数据库厂商提供)
  • 使用JDBC开发所使用到的包:
  1. java.sql所有与JDBC访问数据库相关的接口和类
  2. 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 访问数据库的步骤

  1. 注册和加载驱动(可以省略)
  2. 获取连接
  3. Connection 获取 Statement 对象
  4. 使用 Statement 对象执行 SQL 语句
  5. 返回结果集
  6. 释放资源

释放资源

  1. 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
  2. 释放原则:先开的后关,后开的先关。ResultSet Statement Connection
  3. 放在哪个代码块中: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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值