当前位置: 首页 > article >正文

JDBC编程基础

JDBC编程基础

    • JDBC介绍
    • 创建JDBC项目的步骤
      • 1.引入依赖
      • 2.注册驱动
      • 3.获取数据库连接
      • 4.获取sql执行对象
    • JDBC 常用 API 详解
      • sql执行对象
        • PreparedStatement作用
      • 事务管理
      • 结果集对象
    • JDBC项目demo
      • 测试

JDBC介绍

每个数据库都会提供一组API来支持程序员实现自己客户端,自己根据需求来完成一些具体的增删查改的功能。但数据库也有很多种,例如 Oracle、MySQL、SQL Server 等。显然,这些不同的数据库是出自不同的厂商之手,而对于数据库 API 的约定,并没有一个业界统一的标准。 Java 这种跨平台的语言就弄了一个大统一的方案,就叫JDBC。也就是说,Java约定了一组API,称为 JDBC,这组 API 里面就包含了一些类和一些方法,通过这些类和方法来实现数据库的基本操作。再由各个厂商提供各自的数据驱动包,来和 JDBC 的 API 对接。程序员只需要掌握这一套 JDBC API 就可以操作各种各样的数据库了。

创建JDBC项目的步骤

1.引入依赖

依赖仓库

选择和自己数据库版本相同的连接依赖。

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

2.注册驱动

不是必须的,在较新的 JDBC 版本中,使用Class.forName("com.mysql.cj.jdbc.Driver");注册驱动已经不是必需的步骤。在较旧的 JDBC 版本(例如 JDBC 3.0 及之前的版本)中,手动加载驱动是必须的,因为在那些版本中,驱动的加载不是由DriverManager自动完成的。

在 JDBC 4.0 及更高版本中,Java引入了服务提供者机制(Service Provider Mechanism),其中DriverManagerregisterDriver方法能够自动识别和加载可用的 JDBC 驱动。因此,对于新的 MySQL Connector/J 驱动,不再需要显式地调用Class.forName("com.mysql.cj.jdbc.Driver");

Class.forName("com.mysql.cj.jdbc.Driver");//mysql8.0
Class.forName("com.mysql.jdbc.Driver");//mysql8.0以前

3.获取数据库连接

String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "120125hzy.";
Connection conn = DriverManager.getConnection(url, user, password);

4.获取sql执行对象

//获取执行sql对象 Statement
Statement stmt = conn.createStatement();

//处理结果集
ResultSet rs = null;

rs=stmt.executeQuery(sql);//executeQuery 执行select语句
rs=stmt.executeUpdate(sql);//executeUpdate 执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
rs=stmt.execute(sql);//方法execute:可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。

JDBC 常用 API 详解

sql执行对象

  • Statement createStatement():普通执行sql对象。
  • PreparedStatement prepareStatement(sql):预编译sql的执行sql对象防止sql注入,可以多次执行,只需变更参数值。
  • CallableStatement prepareCall(sql):执行存储过程的对象。

执行sql语句:

  • int executeUpdate(sql):执行DML,DDL语句,返回DML语句影响的行数,DDL语句执行后,成功也可能返回0。

  • ResultSet executeQuery(sql):执行DQL语句返回值,ResultSet 结果集对象。

PreparedStatement作用

预编译sql语句并执行,预防sql注入

// 获取 PreparedStatement 对象
// sql语句中的参数值,使用?占位符替代
String sql = "select * from user where uesrname = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql); 
/* 设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
	Xxx:数据类型:如setInt(参数1,参数2);
		参数:
			参数1:?的位置编号,从1开始
			参数2:?的值
			*/
pstmt.setString(1, "zs");
pstmt.setInt(2,123);
                            
// 执行sql
pstmt.executeQuery(); // 不需要传递sql

事务管理

  • setAutoCommit(boolean autoCommit):开启事务,true为自动提交事务,false为手动。
  • commit():提交事务。
  • rollback():回滚事务。

结果集对象

ResultSet:封装了DQL查询语句的结果。

获取查询结果:

  • boolean next():将光标向后移动一行,判断当前行是否为有效行
  • xxx getXxx(参数):获取数据
    • xxx:数据类型;如 Int getInt(参数) String getString(参数)。
    • 参数: int:列的编号,从1开始;String :列名。

JDBC项目demo

JDBC连接类

public class JDBC {
    static Connection connection = null;

    /*static { 高版本不是必须的,为了兼容性可以写
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }*/
    
    private JDBC() {

    }

    public static Connection getConnection() {
        try {
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "120125hzy.";
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            System.out.println("数据库连接失败");
            e.printStackTrace();
        }
        System.out.println("数据库连接成功");
        return connection;
    }

    public static void close() {
        try {
            if (connection != null && !connection.isClosed()) {
                connection.close();
                System.out.println("数据库关闭成功");
            }
        } catch (SQLException e) {
            System.out.println("数据库关闭失败");
            e.printStackTrace();
        }
    }
}

实体类 User

public class User {
    private int id;
    private String name;
    private Double balance;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getBalance() {
        return balance;
    }

    public void setBalance(Double balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", balance=" + balance +
                '}';
    }
}

Dao 层

public class UserDao {
    public static List<User> select() {
        Connection conn = JDBC.getConnection();
        try {
            PreparedStatement ps = conn.prepareStatement("select * from user2");
            ResultSet resultSet = ps.executeQuery();
            List<User> ans = new ArrayList<>();
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setName(resultSet.getString("name"));
                user.setBalance(resultSet.getDouble("balance"));
                ans.add(user);
            }
            return ans;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBC.close();
        }
    }

    public static User selectByID(Integer id) {
        Connection conn = JDBC.getConnection();
        try {
            PreparedStatement ps = conn.prepareStatement("select * from user2 where id = ?");
            ps.setInt(1, id);
            ResultSet resultSet = ps.executeQuery();
            User user = new User();
            while (resultSet.next()) {
                user.setId(resultSet.getInt("id"));
                user.setName(resultSet.getString("name"));
                user.setBalance(resultSet.getDouble("balance"));
            }
            return user;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBC.close();
        }
    }

    public static String updateByID(User user) {
        Connection conn = JDBC.getConnection();
        try {
            PreparedStatement ps =
                    conn.prepareStatement("update user2 set name = ?, balance = ? where id = ?");
            ps.setString(1, user.getName());
            ps.setDouble(2, user.getBalance());
            ps.setInt(3, user.getId());
            int i = ps.executeUpdate();
            return i > 0 ? "成功" : "失败";

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JDBC.close();
        }
    }
}

测试

查询所有

    @Test
    public void test01(){
       // 查询所有
        List<User> users = UserDao.select();
        for (User user : users){
            System.out.println(user);
        }
    }

在这里插入图片描述

根据id查询

    @Test
    public void test02() {
        // 根据id查询
        User user = UserDao.selectByID(1);
        System.out.println(user);

    }

在这里插入图片描述

根据id修改

    @Test
    public void test03() {
        // 根据id修改

        User user = new User();
        user.setId(1);
        user.setName("李逍遥");
        user.setBalance(2000.00);
        System.out.println(UserDao.updateByID(user));
        // 根据id查询
        user = UserDao.selectByID(1);
        System.out.println(user);
    }

在这里插入图片描述


http://www.kler.cn/a/147760.html

相关文章:

  • 【数据结构】AVL树
  • Towards Reasoning in Large Language Models: A Survey
  • MySQL:数据库的约束
  • docker更改数据目录
  • 基于 Python Django 的二手房间可视化系统分析
  • Llama微调测试记录
  • 动态网页从数据库取信息,然后展示。
  • 【Unity入门】LayerMask小结
  • UniApp 组件 u-tabs 详细讲解
  • pandas教程:Introduction to scikit-learn scikit-learn简介
  • SparkSession介绍
  • Docker入门教程
  • java:/comp/env/jdbc/testDbJndi通过JAVA代码读取JNDI获取数据源
  • C++之哈希
  • 软件设计先进性之虚拟化技术的应用
  • 计算机网络(超详解!) 第一节计算机网络的性能指标
  • DELPHI开发APP回忆录二安卓与pc端路径的选择
  • C语言--根据成绩判断等级
  • String类讲解(1)
  • 一文例说嵌入式 C 程序的内聚和耦合
  • Git学习笔记01
  • 基于单片机体温心率脉搏检测仪系统设计
  • 利用ogr2ogr从PostGIS中导出/导入Tab/Dxf/Geojson等格式数据
  • 十八数藏的文化数字革新:传统之美的数字转变
  • C#简化工作之实现网页爬虫获取数据
  • 软件工程 课后题 acmakb 总结