admin管理员组

文章数量:819701

【JDBC

文章目录

    • jdbc编程步骤
      • 1.注册驱动
      • 2.获取数据库的连接
      • 3.获取数据库操作对象
      • 4.执行sql语句
      • 5.处理查询结果集
      • 6.释放资源

jdbc编程步骤

jdbc编程6步:1.注册驱动2.获取连接3.获取数据库操作对象4.执行sql5.处理查询结果集6.释放资源

1.注册驱动

注册驱动的作用:告诉jdbc程序,我们即将连接的是哪一种数据库

package ghh1.jdbc编程6步;import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;/*** 第一步:注册驱动* 注册驱动的作用:告诉jdbc程序,我们即将连接的是哪一种数据库*/
public class JDBCTest01 {public static void main(String[] args) {try {//1.注册驱动/*左边的是jdbc接口Driver右边是Mysql数据库中jar包中的实现类(对java.sql.Driver接口的实现)利用了向上转型*///1.1注册驱动对象//java.sql.Driver driver = new com.mysql.jdbc.Driver();//可以将左边的java.sql.Driver包导进来Driver driver = new com.mysql.jdbc.Driver();//1.2创建驱动对象DriverManager.registerDriver(driver);} catch (SQLException e) {e.printStackTrace();}}
}

2.获取数据库的连接

package ghh1.jdbc编程6步;import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;/*** 第二步:获取数据库连接对象* 程序执行到此步表JVM已经和3366接口服务建立连接,通道打开*/
public class JDBCTest02 {public static void main(String[] args){try {//1.注册驱动//1.1注册驱动对象Driver driver = new com.mysql.jdbc.Driver();//1.2创建驱动对象DriverManager.registerDriver(driver);//2.获取数据库连接String url = "jdbc:mysql://localhost:3366/bjpowernode";String user= "root";String password = "123";/*什么是url:统一资源定位符URL代表网络中的某个资源的绝对路径通过URL可以定位网络中的资源比如::协议,IP,端口号,资源名称jdbc:mysql://localhost:3366/bjpowernodejdbc:mysql://  协议localhost      IP地址3366           端口号bjpowernode    数据库实例名协议的作用:协议是通讯数据格式,提前制定好的规范,按照这个中特定的格式发送数据包对方接收到数据包之后按照这种规范解析数据包,获取有价值的数据IP地址的作用:定位计算机端口号的作用:定位服务*/Connection conn = DriverManager.getConnection(url,user,password);System.out.println(conn);/** 打印的结果:com.mysql.jdbc.JDBC4Connection@25f38edc* 打印的是Mysql驱动对java.sql.Connection接口的实现类的完整类名* 相当于Connection conn =com.mysql.jdbc.JDBC4Connection();* 左边是jdbc接口Connection即java.sql.Connection接口* 右边是Mysql驱动对java.sql.Connection接口的实现类的完整类名* 这里利用了向上转型** 但是jdbc程序员不需要关系Mysql具体的连接实现类* 只需要关心面向java.sql.Connection接口中的方法*//** 重点:* Connection对象是一个重量级的对象* 连接对象不能随便创建,最后使用完毕,必须手动关闭资源* Mysql支持的最多连接数量是100个*/} catch (SQLException e) {e.printStackTrace();}}
}

3.获取数据库操作对象

package ghh1.jdbc编程6步;import java.sql.*;public class JDBCTest03 {public static void main(String[] args) {try {//1.注册驱动Driver driver = new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver);//2.获取连接String url = "jdbc:mysql://localhost:3366/bjpowernode";String user = "root";String password= "123";Connection conn = DriverManager.getConnection(url,user,password);//3.获取数据库操作对象Statement stmt = conn.createStatement();System.out.println(stmt);//一个连接对象可创建多个数据库操作对象Statement stmt2 = conn.createStatement();System.out.println(stmt2);/*** 打印的结果是Mysql驱动对java.sql.Statement接口的实现类的完整类名* com.mysql.jdbc.StatementImpl@506c589e* com.mysql.jdbc.StatementImpl@69d0a921* 相当于* Statement stmt1 = new com.mysql.jdbc.StatementImpl();* Statement stmt2 = new com.mysql.jdbc.StatementImpl();* 左边的是java.sql.Statement接口* 右边的是Mysql驱动对java.sql.Statement接口的实现类的完整类名* 这里利用了向上转型** 但是程序员只需要关心java.sql.Statement接口中的方法即可* 不需要关心具体实现类*/} catch (SQLException e) {e.printStackTrace();}}
}

4.执行sql语句

下面程序主要执行DML语句:insert update delete

package ghh1.jdbc编程6步;
import java.sql.*;public class JDBCTest04 {public static void main(String[] args) {try {//1.注册驱动Driver driver = new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver);//2.获取连接String url = "jdbc:mysql://localhost:3366/bjpowernode";String user = "root";String password="123";Connection conn = DriverManager.getConnection(url,user,password);//3.获取数据库执行对象Statement stmt = conn.createStatement();//执行sql语句String sql = "insert into dept_bak(deptno,dname,loc) values(50,'销售部','北京')";//程序执行到此处,发送sql语句给数据库管理系统//数据库管理系统会将这条sql语句编译并且执行//该方法的返回值类型是int类型,表示影响底层数据库表中的记录总数int count = stmt.executeUpdate(sql);System.out.println(count);} catch (SQLException e) {e.printStackTrace();}}
}


将sql语句改为:

String sql = "update dept_bak set dname='市场部',loc='天津' where deptno=50";

 String sql = "delete from dept_bak where deptno=50";


以上的增删改DML比较简单,比较复杂的是查询语句,因为查询需要处理结果集

5.处理查询结果集

如果第四步执行的SQL语句是DQL语句,那么第五步需要处理查询结果集
如果不是的话,可以直接释放资源

根据查询结果集中字段的下标获取:

package ghh1.jdbc编程6步;
import java.sql.*;
public class JDBCTest05 {public static void main(String[] args) {try {//1.注册驱动Driver driver = new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver);//2.获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3366/bjpowernode","root","123");//3.获取数据库操作对象Statement stmt = conn.createStatement();//执行sql语句String sql  = "select empno,ename,sal from emp";//程序执行到此处,发送SQL语句给数据库管理系统//数据库管理系统执行DQL语句//将执行之后的查询结果放到ResultSet这个结果集对象中了ResultSet rs = stmt.executeQuery(sql);//5.处理查询查询结果集/*** rs查询结果集中就封装了以下信息:+-------+--------+---------+| empno | ename  | sal     |+-------+--------+---------+|  7369 | SIMITH |  800.00 ||  7499 | ALLEN  | 1600.00 ||  7521 | WARD   | 1250.00 ||  7566 | JONES  | 2975.00 ||  7654 | MARTIN | 1250.00 ||  7698 | BLAKE  | 2850.00 ||  7782 | CLARK  | 2450.00 ||  7788 | SCOTT  | 3000.00 ||  7839 | KING   | 5000.00 ||  7844 | TURNER | 1500.00 ||  7876 | ADAMS  | 1100.00 ||  7900 | JAMES  |  950.00 ||  7902 | FORD   | 3000.00 ||  7934 | MILLER | 1300.00 |+-------+--------+---------+*//*** boolean hasMore = re.next();* next()方法的作用:*  1.将光标向前移动一行*  2.指向的当前行有记录,返回true*  3.指向的当前行没有记录,返回false*/while(rs.next()){//取当前光标指向的行中的数据//无论数据库表中字段的数据类型是什么,都以字符串的形式取出//以下根据查询结果集中字段的下标获取String empno =  rs.getString(1);//jdbc中所有的下标都是从1开始的String ename = rs.getString(2);String sal = rs.getString(3);System.out.println(empno+"..."+ename+"..."+sal);}} catch (SQLException e) {e.printStackTrace();}}
}


根据查询结果集中字段的名称获取:

	//以下是根据查询结果集中的字段名称获取String empno = rs.getString("empno");String ename = rs.getString("ename");String sal = rs.getString("sal");System.out.println(empno+"..."+ename+"..."+sal);


注意:是查询结果集中字段的下标,比如对查询结果集中字段重命名

package ghh1.jdbc编程6步;import java.sql.*;public class JDBCTest07 {public static void main(String[] args) {try {//1.注册驱动Driver driver = new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver);//2.获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3366/bjpowernode","root","123");//3.获取数据库操作对象Statement stmt = conn.createStatement();//执行sql语句,将字段重命名String sql  = "select empno a,ename b,sal c from emp";//将执行之后的查询结果放到ResultSet这个结果集对象中了ResultSet rs = stmt.executeQuery(sql);//5.处理查询查询结果集while(rs.next()){String empno = rs.getString("a");String ename = rs.getString("b");String sal = rs.getString("c");System.out.println(empno+"..."+ename+"..."+sal);}} catch (SQLException e) {e.printStackTrace();}}
}

以字段特定的类型获取查询结果集:

    //以特定的数据类型取出数据//empno是int类型//ename是String类型//sal是double类型int empno = rs.getInt("a");String ename = rs.getString("b");double sal = rs.getDouble("c");System.out.println((empno+1)+"..."+ename+"..."+sal);

6.释放资源

释放资源的注意事项:

  1. 为了保证资源的释放,将释放资源的代码写到finally语句块中
  2. 需要关闭ResultSet,Statement,Connection
  3. 一个Connection可以创建多个Statement,一个Statement可以得出多个ResultSet,所以关闭的时候先关闭ResultSet,再关闭Statement,最后关闭Connection
package ghh1.jdbc编程6步;import javax.swing.plaf.nimbus.State;
import java.sql.*;public class JDBCTest09 {public static void main(String[] args) {Connection conn=null;Statement stmt=null;ResultSet rs = null;try {//1.注册驱动Driver driver = new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver);//2.获取连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3366/bjpowernode","root","123");//3.获取数据库操作对象stmt = conn.createStatement();//执行sql语句String sql = "selelct * from dept";rs = stmt.executeQuery(sql);//处理查询结果集while(rs.next()){String deptno =  rs.getString("deptno");String dname =  rs.getString("dname");String loc =  rs.getString("loc");System.out.println(deptno+"..."+dname+"..."+"loc");}} catch (SQLException e) {e.printStackTrace();}finally{if (rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

本文标签: JDBC