小白入门基础 - JDBC连接池实现增删改查

一:介绍

       JDBC ( Java DataBaseConnectivity java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。

        在 java 中配置 JDBC 请见我的另一篇文章:小白入门基础 - JDBC连接MySQL数据库

JDBC功能详解


1、DriverManager驱动管理对象

(1)注册驱动:(mysql5以后可直接省略驱动)
1.注册给定的驱动程序: staticvoid registerDriver(Driver driver);

2.写代码使用:Class.forName(“com.mysql.jdbc.Driver”);

3.在com.mysql.jdbc.Driver类中存在静态代码块

(2)获取数据库连接:
1.获取数据库连接对象: static ConnectiongetConnection(Stringurl, String user,String password);

2.返回值:Connection数据库连接对象

3.参数
url:指定连接的路径。语法: jdbc:mysql://ip地址(域名):端口号/数据库名称

​ user:用户名

​ password:密码

2、Connection数据库连接对象

1.获取执行者对象:
获取普通执行者对象: Statement createStatement0;
获取预编译执行者对象:PreparedStatement prepareStatement(String sql);

2.管理事务
开启事务 : setAutoCommit(boolean autoCommit);参数为false,则开启事务

​ 提交事务:commit();

​ 回滚事务: rollback();

3.释放资源
立即将数据库连接对象释放:void close();

3、Statement执行sql语句的对象

(1)执行DML语句: int executeUpdate(String sql);

返回值int :返回影响的行数。

参数sql:可以执行insert、update、delete语句。

(2) 执行DQL语句:ResultSet executeQuery(String sql);

返回值ResultSet:封装查询的结果。

参数sql:可以执行select语句。

(3)释放资源
立即将数据库连接对象释放:void close();

4、ResultSet结果集对象

1.判断结果集中是否还有数据: boolean next();

有数据返回true,并将索引向下移动一行。没有数据返回false。

2.获取结果集中的数据:XXX getXxx(“列名”);XXX代表数据类型(要获取某列数据,这一列的数据类型)。

例如: String getString(“name”);int getInt(" age");

3.释放资源

立即将结果集对象释放:void close();

数据库文件准备

1、创建数据库

create DATABASE demo;

2、使用数据库

use db14

3、创建 student 表

CREATE TABLE student ( id int PRIMARY KEY, sname VARCHAR(20), age int, brithday date );

4、添加数据

INSERT into student VALUES(1,'张飞',23,'1999-08-11'),(2,'李四',23,'1998-08-11'),(3,'王五',23,'1997-08-11'),(4,'关羽',23,'1995-08-11');

二:案例实现

        以下是本次案例中所用到的目录文件,其中 Control2 是我们的主文件,运行逻辑都写在了里面, JDBCUtils 是连接池文件,Student 文件是根据数据库来实现的一个实体类。Config.preperties 是我们的配置文件,pom.xml 是Spring 导入依赖文件。文件内具体代码见下文。

1、Student 实体类

        这个类很简单,就是把数据库的每一个属性拿出来变为私有,并且提供 get 与 set 即可。

package JDBC;

import jdk.nashorn.internal.objects.annotations.Constructor;

import java.util.Date;

@SuppressWarnings("all")
public class Student {
  private Integer id;
  private String sname;
  private Integer age;
  private Date birthday;


  public Student(Integer id, String sname, Integer age, Date birthday) {
    this.id = id;
    this.sname = sname;
    this.age = age;
    this.birthday = birthday;
  }

  public Integer getId() {
    return id;
  }

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

  public String getSname() {
    return sname;
  }

  public void setSname(String sname) {
    this.sname = sname;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public Date getBirthday() {
    return birthday;
  }

  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }

  @Override
  public String toString() {
    return "Student{" +
        "id=" + id +
        ", sname='" + sname + '\'' +
        ", age=" + age +
        ", birthday=" + birthday +
        '}';
  }

}

2、pom.xml 配置文件

        在配置文件中导入 mysql 依赖,直接加入下列代码即可。 

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

3、config.properties 配置文件

        该文件是一个配置文件,相当于定义了一个全局变量,给后面的连接池使用

driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo
username=root
password=123456

4、JDBCUtils 连接池

        这里是配置JDBC的连接池,可以使后面不必每次都重复链接和关闭数据库。减少性能上的消耗,在后面的具体实现中,新增修改删除,这三个都是使用的连接池,另外两个查找不是使用的连接池,可以对比俩看,查找是更麻烦的。

package JDBC.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/*
 * JDBC工具类
 * */
public class JDBCUtils {
    //    1、构造方法私有
    private JDBCUtils(){}
    //    2、声明所需要的配置变量
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;
    private static Connection con;

    //    3、提供静态代码块,读取配置文件信息为变量赋值,注册驱动
    static {
        try {
//            赋值
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("config.properties");
            Properties pro=new Properties();
            pro.load(is);
            driverClass=pro.getProperty("driverClass");
            url=pro.getProperty("url");
            username=pro.getProperty("username");
            password=pro.getProperty("password");
//            注册驱动
            Class.forName(driverClass);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //        获取数据库连接
    public static Connection getConnect(){
        try {
            con= DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }
    //    关闭连接
    public static void close(Connection con, Statement state, ResultSet rs){
        if (con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (state!=null){
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close(Connection con, Statement state){
        if (con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (state!=null){
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

5、Control2 实现类

        在该类中,我们封装了增删改查一共五个方法,并且定义了类变量等,并且对每次操作的结果进行了判断与输出,具体实现看下面代码逻辑。

package JDBC.Control;

import JDBC.Student;
import JDBC.utils.JDBCUtils;

import java.sql.*;
import java.text.*;
import java.util.ArrayList;

public class Control2 {

    static final String conName = "jdbc:mysql://localhost:3306/demo?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    static final String name = "root";
    static final String password = "123456";
    public static void main(String[] args) {
        Control2 obj = new Control2();

//        obj.findAll();
//        obj.findById(2);

        /** 下面这些是连接池实现的 */
        obj.insert(5,"张三",20,"1998-09-11");
//        obj.update("张飞",100);
//        obj.delete(1);


    }

    /** 查询数据库内全部的数据 */
    public ArrayList<Student> findAll() {
        ArrayList<Student> list=new ArrayList<>();
        Connection con=null;
        try {
            con= DriverManager.getConnection(conName,name,password);
            Statement statement = con.createStatement();
            String sql="select * from student";
            ResultSet resultSet = statement.executeQuery(sql);
            while (resultSet.next()){
                Integer id=resultSet.getInt("id");
                String sname=resultSet.getString("sname");
                Integer age=resultSet.getInt("age");
                Date birthday=resultSet.getDate("brithday");
                Student s=new Student(id,sname,age,birthday);
                list.add(s);
                System.out.println(s);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return list;
    }


    /** 根据ID查找学生信息 */
    public Student findById(Integer id) {
        Connection con=null;
        Student s = null;
        try{
            con=DriverManager.getConnection(conName,name,password);
            String sql="select * from student where id=?";
            PreparedStatement pstate = con.prepareStatement(sql);
            pstate.setInt(1,id);
            ResultSet resultSet = pstate.executeQuery();
            while (resultSet.next()){
                s=new Student(id,resultSet.getString("sname"),resultSet.getInt("age"),resultSet.getDate("brithday"));
                System.out.println(s);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return s;
    }


    /** 插入学生数据 */
    public int insert(Integer id, String sname, Integer age, String  birthday) {
        /**
         // 创建一个java.util.Date对象
         Date utilDate = new Date();

         // 将java.util.Date转换为java.sql.Date
         java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

         System.out.println("Java Util Date: " + utilDate);
         System.out.println("SQL Date: " + sqlDate);
         * */
        Connection con=null;
        int re=0;
//        Date date=new Date();//不能直接用这个写法,因为上面导包,所以默认是java.sql.Date类型,所以要下面这种强制指定
        java.util.Date date = new java.util.Date();//需要new一个Date对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); //设置日期格式  yyyy-MM-dd-HH-mm-ss这个是完整的
        try {
            date = dateFormat.parse(birthday);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        try {
            con= JDBCUtils.getConnect();
            String sql="insert into student values(?,?,?,?)";
            PreparedStatement p=con.prepareStatement(sql);
            p.setInt(1,id);
            p.setString(2,sname);
            p.setInt(3,age);
            p.setDate(4, new java.sql.Date(date.getTime()));
            re = p.executeUpdate();
            System.out.println(re);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return re;
    }




    /** 修改学生信息 */
    public int update(String name1,Integer age) {
        Connection con=null;
        int result=0;
        String sql="update student " +
                "set age=? " +
                "where sname=?";
        try {
            con= JDBCUtils.getConnect();
            PreparedStatement p = con.prepareStatement(sql);
            p.setInt(1,age);
            p.setString(2,name1);
            result = p.executeUpdate();
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }


    /** 删除学生信息 */
    public int delete(Integer id) {
        Connection con=null;
        int result=0;
        try {
            con= JDBCUtils.getConnect();
            String sql="delete from student where id=?";
            PreparedStatement p = con.prepareStatement(sql);
            p.setInt(1,id);
            result = p.executeUpdate();
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }


}

6、运行效果图

三:结尾

        JDBC在现在的正规项目中已经不使用了,但是初学者仍然要了解一些,另外JDBC可以在普通项目中作为临时连接数据库的方法使用,切换方便,非常灵活。好啦,本文就到此为止啦,希望能够对各位小伙伴有所帮助哦!

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以通过 JDBC 连接 MySQL 数据库,并实现增删改查操作。以下是一个简单的示例代码: ```java import java.sql.*; public class JdbcExample { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/test"; static final String USER = "root"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // 注册 JDBC 驱动器 Class.forName(JDBC_DRIVER); // 打开连接 System.out.println("连接数据库..."); conn = DriverManager.getConnection(DB_URL, USER, PASS); // 执行查询 System.out.println("创建查询..."); stmt = conn.createStatement(); String sql = "SELECT id, name, age FROM student"; ResultSet rs = stmt.executeQuery(sql); // 处理结果集 while (rs.next()) { // 获取数据 int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); // 显示数据 System.out.print("ID: " + id); System.out.print(", Name: " + name); System.out.println(", Age: " + age); } // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (SQLException se) { // 处理 JDBC 错误 se.printStackTrace(); } catch (Exception e) { // 处理 Class.forName 错误 e.printStackTrace(); } finally { // 关闭资源 try { if (stmt != null) { stmt.close(); } } catch (SQLException se) { } try { if (conn != null) { conn.close(); } } catch (SQLException se) { se.printStackTrace(); } } } } ``` 上述代码实现了查询操作,如果要实现增删改操作可以使用 PreparedStatement 来执行 SQL 语句。例如,插入数据的示例代码如下: ```java // 创建 PreparedStatement 对象 String sql = "INSERT INTO student (name, age) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); // 设置参数 pstmt.setString(1, "Tom"); pstmt.setInt(2, 20); // 执行更新 int rows = pstmt.executeUpdate(); // 关闭资源 pstmt.close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暴怒的代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值