JDBC_02JDBC编程六步

JDBC_02JDBC编程六步

1.JDBC编程六步

  1. 注册驱动:告诉Java程序,即将要连接的是哪个品牌的数据库。
  2. 获取连接:表示JVM的进程和数据库的进程之间的通道打开了,这属于进程之间的通信,是重量级的。使用完后一定要关闭。
  3. 获取数据库操作对象:专门执行sql语句的对象。
  4. 执行SQL语句:主要是DQL、DML。
  5. 处理查询结果集:当第4步执行的是DQL语句时才有第5步处理查询结果集。
  6. 释放资源:使用完资源后一定要关闭资源。Java和数据库属于进程之间的通信,开启后一定要关闭。

2.java连接数据库全过程

2.1注册驱动

调用DriverManager类中的静态方法registerDriver来完成注册驱动,需要传入一个Driver对象。

前面的是java.sql包下的Driver接口,后面的是mysql驱动里的Driver实现类。

注意:后面创建的Driver对象必须写全名,以区分接口和驱动。

Driver driver = new com.mysql.jdbc.Driver();//多态,父类型引用指向子类型对象
DriverManager.registerDriver(driver);

2.2获取连接

2.2.1url

获取连接时需要知道url、数据库名和数据库密码,那么什么是url呢?

url:统一资源定位符(网络中某个资源的绝对路径)
url包括哪几部分?

  • 协议
  • IP
  • port(端口号)
  • 资源名

比如力扣的url:

http://121.43.113.44:80/index.html
  • http://—>通信协议
  • 121.43.113.44—>服务器ip地址
  • 80—>服务器上软件的端口号
  • index.html—>是服务器上某个资源名

再比如mysql数据库的url:

jdbc:mysql://localhost:3306/tsccg
  • jdbc:mysql://—>通信协议
  • localhost或者127.0.0.1—>本机ip地址
  • 3306 —>mysql数据库端口号
  • tsccg—>具体的数据库实例名
2.2.2什么是通信协议?有什么用?

通信协议是通信前就提前定好的数据传送格式。
数据包具体怎么传数据,格式提前定好。
就好比张三给李四发送一条信息,李四在看之前不知道这条信息是什么内容,但李四知道张三发送的一定是中文。
中文在这里就相当于是一个提前定好的协议,张三只有遵照这个协议,才能让李四理解自己发送的信息。

2.2.3代码实现获取连接
//jdbc:mysql://ip:port/数据库名
String url = "jdbc:mysql://localhost:3306/tsccg";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,user,password);

2.3获取数据库操作对象

//3.获取数据库操作对象
Statement stmt = conn.createStatement();

2.4执行sql语句

executeUpdate()方法专门负责DML语句(insert delete update)。

使用数据库操作对象调用该方法后,返回一个值,该返回值是该语句影响数据库中的记录条数,用来判断是否操作成功。

String sql = "insert into t_vip(id,name) values(3306,'阿珍')";
//String sql = "delete from t_vip where id = 3306";
int results = stmt.executeUpdate(sql);
System.out.println(results > 0 ? "插入成功" : "插入失败");

executeQuery是专门处理DQL语句(select)的,返回一个ResultSet对象。

String sql = "select empno a,ename,sal from emp";
ResultSet rs = stmt.executeQuery(sql);

2.5处理查询结果集

执行DQL语句后得到一个查询结果集ResultSet,数据如下图所示:

ResultSet类有一个next()方法,可以将光标从当前位置向前移一行,并返回一个boolean值,

如果下一行中有数据则返回一个true,反之返回一个false。

可以用它作为while循环条件来遍历查询结果集。

每当光标移动到有数据的行,则通过ResultSet对象调用getString(“列名”)、getInt(“列名”)…方法来取出数据。

完整代码:

import java.sql.*;
/**
 查询结果集
*/
public class JDBCTest06 {
    public static void main(String[] args) {
    	Connection conn = null;
        Statement stmt = null;
        //查询结果集
        ResultSet rs = null;
        try {
            //1.注册驱动
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/tsccg","root","123456");
            //3.获取数据库操作对象
            stmt = conn.createStatement();
            //4.执行SQL语句
            String sql = "select empno a,ename,sal from emp";
            //executeQuery是专门处理DQL语句的,返回一个ResultSet对象
            rs = stmt.executeQuery(sql);
            //5.处理查询结果集
            while(rs.next()) {
                //String empno = rs.getString(1);
                //String ename = rs.getString(2);
                //String sal = rs.getString(3);
                
                //String empno = rs.getString("empno");
                //String ename = rs.getString("ename");
                //String sal = rs.getString("sal");
                
                int empno = rs.getInt("a");//这里拿的是查询结果集里的数据
                String ename = rs.getString("ename");
                double sal = rs.getDouble("sal");
                System.out.println(empno + "," + ename + "," + (sal + 100));
            }
            
        } catch(SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭rs
            try {
            	if(rs != null) {
                    rs.close();
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }
            //关闭stmt
            try {
            	if(stmt != null) {
                    stmt.close();
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }
            //关闭conn
            try {
            	if(conn != null) {
                    conn.close();
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

结果:

D:\code\JDBC\JDBC_02JDBC编程六步\src>javac JDBCTest06.java

D:\code\JDBC\JDBC_02JDBC编程六步\src>java JDBCTest06
7369,SMITH,900.0
7499,ALLEN,1700.0
7521,WARD,1350.0
7566,JONES,3075.0
7654,MARTIN,1350.0
7698,BLAKE,2950.0
7782,CLARK,100.0
7788,SCOTT,3100.0
7839,KING,100.0
7844,TURNER,1600.0
7876,ADAMS,1200.0
7900,JAMES,1050.0
7902,FORD,3100.0
7934,MILLER,100.0

2.6关闭资源

关闭资源一般都放在finally里。
资源从小到大依次释放,先关闭数据库操作对象,再关闭数据库连接对象。

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
    //1~5
    ...
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    //如果是DQL语句,那么会用到ResultSet查询结果集,ResultSet对象是用数据库操作对象调用executeQuery方法获取的,故需要最先关闭ResultSet对象。
    try {
        if(rs != null) {
            rs.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    //先关数据库操作对象
    try {
        if(stmt != null) {
            stmt.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    //再关闭数据库连接对象
    try {
        if(conn != null) {
            conn.close();
        }
    } catch(SQLException e) {
        e.printStackTrace();
    }

}

2.7完整代码

import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
/**
 java连接数据库
*/
public class JDBCTest01 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            //1.注册驱动
            Driver driver = new com.mysql.jdbc.Driver();//多态,父类型引用指向子类型对象
            DriverManager.registerDriver(driver);

            //2.获取连接
            //jdbc:mysql://ip:port/数据库名
            String url = "jdbc:mysql://localhost:3306/tsccg";
            String user = "root";
            String password = "123456";
            conn = DriverManager.getConnection(url,user,password);
            //打印数据库连接对象
            System.out.println("数据库连接对象 = " + conn);//com.mysql.jdbc.JDBC4Connection@21b8d17c

            //3.获取数据库操作对象
            stmt = conn.createStatement();

            //4.执行sql语句
            String sql = "insert into t_vip(id,name) values(3306,'阿珍')";
            //String sql = "delete from t_vip where id = 3306";
            //executeUpdate专门负责DML语句(insert delete update)
            int results = stmt.executeUpdate(sql);//返回值是该语句影响数据库中的记录条数
            System.out.println(results > 0 ? "插入成功" : "插入失败");
            //5.处理查询结果集(这里没有用到查询语句,故第五步跳过)
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //6.释放资源
            //从小到大依次释放
            //先关数据库操作对象
            try {
                if(stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            //再关闭数据库连接对象
            try {
                if(conn != null) {
                    conn.close();
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }

        }
    }
}

编译运行:

数据库连接对象 = com.mysql.jdbc.JDBC4Connection@21b8d17c
插入成功

3.注册驱动的第二种方式

驱动的Driver类里有一个静态代码块,只要加载该代码块就可以完成注册驱动。

public class Driver extends NonRegisteringDriver implements java.sql.Driver
{
    public Driver()
        throws SQLException
    {
    }
	//静态代码块
    static 
    {
        try{
            DriverManager.registerDriver(new Driver());
        }
        catch(SQLException E)
        {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

使用反射机制,调用Class.forName()就可以加载该类的构造方法,从而加载静态代码块。

注册驱动:

//第二种方式注册驱动
//使用反射机制,加载Driver类,调用其构造方法,加载静态代码块
Class.forName("com.mysql.jdbc.Driver");

4.将数据都放进配置文件里

4.1未放进配置文件前

import java.sql.*;
/**
  未放前
*/
public class JDBCTest04 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //1.注册驱动
            String classname = "com.mysql.jdbc.Driver";
            Class.forName(classname);
            //2.获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/tsccg";
            String user = "root";
            String password = "123456";
            conn = DriverManager.getConnection(url,user,password);
            //3.获取数据库操作对象
            stmt = conn.createStatement();
            String sql = "insert into t_vip(id,name) values(8848,'李华')";
            int count = stmt.executeUpdate(sql);
            System.out.println(count > 0 ? "插入成功" : "插入失败");
        }catch(SQLException e) {
            e.printStackTrace();
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            try {
                if(stmt != null) {
                    stmt.close();
                }
            }catch(SQLException e) {
                e.printStackTrace();
            }
            try {
                if(conn != null) {
                    conn.close();
                }
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

4.2放进配置文件后

创建一个配置文件:jdbc.properties

/**
  将所有数据都放到配置文件里,用资源绑定器获取信息
*/
import java.sql.*;
import java.util.*;
public class JDBCTest04 {
    public static void main(String[] args) {
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        String drivername = bundle.getString("drivername");
        String url = bundle.getString("url");
        String user = bundle.getString("user");
        String password = bundle.getString("password");
        Connection conn = null;
        Statement stmt = null;
        try {
            //1.注册驱动
            // String drivername = "com.mysql.jdbc.Driver";
            Class.forName(drivername);
            //2.获取连接
            // String url = "jdbc:mysql://127.0.0.1:3306/tsccg";
            // String user = "root";
            // String password = "123456";
            conn = DriverManager.getConnection(url,user,password);
            //3.获取数据库操作对象
            stmt = conn.createStatement();
            String sql = "insert into t_vip(id,name) values(8849,'李四')";
            int count = stmt.executeUpdate(sql);
            System.out.println(count > 0 ? "插入成功" : "插入失败");
        }catch(SQLException e) {
            e.printStackTrace();
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            try {
                if(stmt != null) {
                    stmt.close();
                }
            }catch(SQLException e) {
                e.printStackTrace();
            }
            try {
                if(conn != null) {
                    conn.close();
                }
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

运行:

插入成功

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TSCCG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值