小白入门基础 - 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');

小白入门基础 - JDBC连接池实现增删改查_第1张图片

二:案例实现

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

小白入门基础 - JDBC连接池实现增删改查_第2张图片

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 依赖,直接加入下列代码即可。 


    mysql
    mysql-connector-java
    8.0.31

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 findAll() {
        ArrayList 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连接池实现增删改查_第3张图片

三:结尾

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

你可能感兴趣的:(java,数据库,mysql,JDBC,java)