使用JDBC连接数据库(包含封装JDBC)

时间:2024-10-30 07:53:06

一、JDBC的基本使用:

JDBC是数据库连接技术

它们位于java.sql包以及javax.sql包中

JDBC的作用:

1.建立与数据库之间的访问连接

2.将编写好的SQL语句发送到数据库执行

3.对数据库返回的结果进行处理

四个重要类和接口:

1.DriverManager类:管理JDBC驱动

2.Connection接口:负责连接数据库,并担任传送数据的任务

3.Statement接口:由Connection产生,负责SQL语句

4.ResultSet接口:负责保存Statement执行后所产生的执行结果

运行代码需要准备的:

我创建的是web项目

需要引一下mysql的包

然后右键lib包

Add as library

二、JDBC访问数据库步骤(查询):

1.加载驱动:Class.forName():加载驱动,如果系统中不存在给定的类,则会引发异常,异常类型为"ClassNotFoundException"

2. 通过DriverManager创建Connection对象;DriverManeger类跟踪已注册的驱动程序,当调用getConnection时,它会搜索驱动程序列表,直到找到一个能够连接至字符串指定数据库驱动程序,加载此驱动程序后,将使用DriverManager的getConnection()建立连接,此方法接收三个参数

3.通过Connection获得Statement对象,用于执行sql

4.准备sql语句

5.使用Statemennt执行SQL语句,并返回结果。使用ResultSet对象的next()方法判断结果集是否包含数据。在next()方法返回true时,使用ResultSet的getxxx()方法得到对应字段的值。

6.处理rs遍历集合

7.关闭结果集

注意:
  1. rs.getInt("customer_id");中可以放字段名称,也可以放字段列数(第几列)rs.getInt(1);,数字是几,返回的内容就是第几列的
  2. 一次rs.next( ) 返回的是一行数据,所以如果是返回多行数据,还需要在while(){}里面来一个for循环
  3. stmt.executeQuery(sql);和stmt.execute(sql);第一个会返回影响行数,第二个会返回boolean(false是成功了,true是失败了),推荐使用executeQuery(sql)。

查询JDBC代码:

public static void main(String[] args)  {
        Connection connection = null;
        Statement stmt = null;
        ResultSet rs = null;
        //1.加载驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        //2.通过DriverManager创建Connection对象
             connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool02", "root", "root");
        //3.通过Connection获得Statement对象,用于执行sql
             stmt = connection.createStatement();
        //4.准备sql语句
            String sql = "select * from orders";
        //5.使用Statemennt执行SQL语句,并返回结果
             rs = stmt.executeQuery(sql);
        //6.处理rs遍历集合
            while (rs.next()){
                int id = rs.getInt("order_id");
                int customerId = rs.getInt("customer_id");
                String orderDate = rs.getString("order_date");
                String status = rs.getString("status");
                System.out.println("id:"+'\t'+id+"customerId"+'\t'+customerId+"orderDate"+'\t'+orderDate+"status"+'\t'+status);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7.关闭结果集
            if(rs!=null){
                 rs.close();
            }
            if(stmt!=null){
                 stmt.close();
            }
            if(connection!=null){
                 connection.close();
            }
          
        }
}

三、PrepareStatement实现增删改:

PrepareStatement继承Statement接口,PrepareStatement包含已编译的SQL语句,这些输入参数的值在SQL创建时未被指定,而是为每一个输入参数保留一个?作为占位符。

在执行PrepareStatement之前,必须设置每个输入参数的值,可以通过调用setXxx()方法

PrepareStatement对语句进行了预编译,所以速度比statement快

增删改返回的数据是影响行数

增删改步骤:前两条都一样
  1. Class.forName():加载驱动,如果系统中不存在给定的类,则会引发异常,异常类型为"ClassNotFoundException"
  2. DriverManeger类跟踪已注册的驱动程序,当调用getConnection时,它会搜索驱动程序列表,直到找到一个能够连接至字符串指定数据库驱动程序,加载此驱动程序后,将使用DriverManager的getConnection()建立连接,此方法接收三个参数
  3. 编写SQL语句,创建PrepareStatement对象,
  4. 设置参数值,用pstmt.setXxx(第几行,值(可以用变量))
  5. 使用pstmt的executeUpdate()方法返回影响行数。

增删改代码:
public class jdbc02 {
    public static void main(String[] args) {
    
        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        //1.加载驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        //2.通过DriverManager创建Connection对象
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool02", "root", "root");
        //3.prepareStatement对象
            String sql = "update orders set customer_id=? where order_id = ?";
            pstmt = connection.prepareStatement(sql);

            //4设置参数值
            int customerId = 111;
            int orderId = 2;
            pstmt.setInt(1,customerId);
            pstmt.setInt(2,orderId);

            //5.执行操作
            int rowsAffected = pstmt.executeUpdate();

            //6. 检查是否有行受到影响
            if (rowsAffected > 0) {
                System.out.println("成功更新了" + rowsAffected + "条记录!");
            } else {
                System.out.println("没有找到指定的员工记录。");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7.关闭
            try {
                if (pstmt != null) {
                    pstmt.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
               e.printStackTrace();
            }
        }
    }
}

PrepareStatement和Statement区别:
  1. Statement由方法createStatement()创建,该对象用于发送简单的SQL语句
  2. PreparedStatement由方法prepareStatement()创建,该对象用于发送带有一个或者多个输入参数的SQL语句,SQL语句使用“?”作为数据占位符使用setXxx()方法设置数据

四、对实体类数据封装查询的三种方式:

在表中,一张表是一个类,每一行数据是一个对象

实体类是SmbmsUser

封装方法到Userserver里

返回值

方法名

返回值类型

单行多列

根据id查询

findUserById( )

User

多行多列

直接select*查询

findUserList( )

List<User>

单行单列

count(1)

findUserCount( )

int

注意:
  1. 在单行多利中创建实体类对象,只需要一个对象就可以装的下。在遍历值的时候,需要先用getXxx方法获取值,然后把它放到SetXxx()方法中。
  2. 查找多行多列里面,需要 用集合List<SmbmsUser>,这里面有多个对象,需要在while循环中创建SmbmsUser对象,然后在循环末尾使用add()方法。在遍历值的时候,需要先用getXxx方法获取值,然后把它放到SetXxx()方法中。
  3. 在单行单列中,不需要遍历,直接用int接收SQL语句中的count()值。

1.查找单行多列:

我传入了一个id

public SmbmsUser findUserById(int id){
        Connection connection = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url="jdbc:mysql://localhost:3306/javaweb_test";
            String username = "root";
            String pwd = "root";
            Connection conn =  DriverManager.getConnection(url,username,pwd);
            String sql = "select * from smbms_user where id = "+id;
             stmt = conn.createStatement();
             rs = stmt.executeQuery(sql);
             SmbmsUser smbmsUser = null;
             while (rs.next()){
                 smbmsUser = new SmbmsUser();
                 rs.getString("userPassword");
                 smbmsUser.setId( rs.getInt("id"));
                 smbmsUser.setUserCode(rs.getString("userCode"));

                 smbmsUser.setUserName(rs.getString("userName"));
                 smbmsUser.setUserPassword( rs.getString("userPassword"));
             }
            return smbmsUser;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }

2.查找多行多列

public List<SmbmsUser> findUserList(){
        Connection connection = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url="jdbc:mysql://localhost:3306/javaweb_test";
            String username = "root";
            String pwd = "root";
            Connection conn =  DriverManager.getConnection(url,username,pwd);
            String sql = "select * from smbms_user where userRole is not null" ;
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            List<SmbmsUser> smbmsUserList = new ArrayList<>();
            while (rs.next()){
                //这个是在里面创建对象
                SmbmsUser smbmsUser = new SmbmsUser();
                smbmsUser = new SmbmsUser();
                smbmsUser.setId( rs.getInt("id"));
                smbmsUser.setUserCode(rs.getString("userCode"));
                smbmsUser.setUserName(rs.getString("userName"));
                smbmsUser.setUserPassword( rs.getString("userPassword"));
                smbmsUserList.add(smbmsUser);
            }
            return smbmsUserList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }

3.查找单行单列

 public int findUserCount( ) {
        Connection connection = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url="jdbc:mysql://localhost:3306/javaweb_test";
            String username = "root";
            String pwd = "root";
            Connection conn =  DriverManager.getConnection(url,username,pwd);
            String sql = "select count(*) countuser from smbms_user";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            int count = 0;
            //6.处理resultSet遍历集合
            while(rs.next()){
                count = rs.getInt("countuser");
            }
            return count;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return  0;
    }