在IDEA中如何用JDBC连接Java程序和MySQL数据库

一、工具

工具:IDEA(创建Java项目)、MySQL(存储数据)、驱动包(下载网址:https://dev.mysql.com/downloads/connector/j/5.1.html)

1.1、MySQL(存储数据)

数据库、表都已经创建,且存在数据,如下所示:
数据表candidate

1.2、驱动包导入

导入 MySQL 驱动包(下载网址:https://dev.mysql.com/downloads/connector/j/5.1.html )

导包1

导包2

导包3

1.3、Java项目结构

Java项目结构

这里没建其他包区分类,因为只是一个小测试。如果要优化,可以将 Candidate.java 放在实体包(如bean)中,JDBCUtils.java 放在工具包(如utils)中。

二、代码

2.1、(重点)工具类JDBCUtils.java

连接数据库,关闭资源

package com;

import java.sql.*;

/*
* 工具类:获取连接、关闭资源①②
* */
public class JDBCUtils {
    
    
    /*
    * 获取连接
    * 返回连接的结果
    * */
    public static Connection getConnResult() throws Exception{
    
    
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        //1.数据库连接的4个基本要素:
        String url = "jdbc:mysql://localhost:3306/test";//test是数据库名
        String user = "root";//这里是登录MySQL数据库的用户名
        String password = "root";//这里是登录登录MySQL数据库的密码
        String driverName = "com.mysql.jdbc.Driver";//这个是驱动名字,不是前面导入的包名。
        // MySQL的驱动【com.mysql.jdbc.Drive】,Oracle的驱动【oracle.jdbc.driver.OracleDriver】

        //2.加载驱动
        Class.forName(driverName);

        //3.获取连接
        conn = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, user, password);

        //4.返回值
        return conn;
    }

    /*
    * 关闭资源①
    * 关闭Connection、PreparedStatement和ResultSet对象
    * */
    public static void Close(Connection conn, PreparedStatement ps, ResultSet rs) throws SQLException {
    
    
        if (rs!=null){
    
    
            rs.close();
        }
        if (ps!=null){
    
    
            ps.close();
        }
        if (conn!=null){
    
    
            conn.close();
        }
    }

    /*
    * 关闭资源②
     * 关闭Connection、PreparedStatement对象
    * */
    public static void Close(Connection conn, PreparedStatement ps) throws SQLException {
    
    
        if (ps!=null){
    
    
            ps.close();
        }
        if (conn!=null){
    
    
            conn.close();
        }
    }
}

2.2、实体类Candidate.java

实体类中属性的拼写跟 SQL 语句中的查询字段一样,不跟着数据表中的列名走

package com;

public class Candidate {
    
    
    private int id;
    private String name;

    public Candidate() {
    
    
    }

    public Candidate(int id, String name) {
    
    
        this.id = id;
        this.name = name;
    }

    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;
    }

    @Override
    public String toString() {
    
    
        return id + "\t" + name;
    }
}

2.3、Main.java

package com;

import com.mysql.jdbc.Connection;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        //1、查询表【candidate】的所有数据,并打印在控制台
        String sqlQ = "select * from candidate";
        ArrayList<Candidate> queryRs = Query(Candidate.class, sqlQ, null);
        queryRs.forEach(System.out::println);
        //2、添加一行数据
        int id = 6;
        String name = "ABC";
        String sqlA = "insert into candidate values(?,?)";
        Object[] paramA = new Object[2];
        paramA[0] = id;
        paramA[1] = name;
        Add(sqlA, paramA);
    }
}

2.4、查询表【candidate】中的所有数据

代码如下

public static <T> ArrayList<T> Query(Class<T> tCalss, String sql, Object param[]) {
    
    
    ArrayList<T> arrayList = new ArrayList<T>();
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
    
    
        //获取Connection对象conn
        conn = (Connection) JDBCUtils.getConnResult();
        //获取PreparedStatement对象ps
        ps = conn.prepareStatement(sql);
        //填充占位符
        if (param != null) {
    
    
            for (int i = 0; i < param.length; i++) {
    
    
                ps.setObject(i + 1, param[i]);
            }
        }
        //执行查询语句,获取结果集rs。如果是增删改,则用execute()方法
        rs = ps.executeQuery();
        //获取结果集rs中列的类型和属性信息
        ResultSetMetaData metaData = rs.getMetaData();
        //获取列的个数columnCount
        int columnCount = metaData.getColumnCount();
        System.out.println("表【candidate】共有" + columnCount + "列");
        //结果集rs指针不为false,即指针指向的一行存在数据
        while (rs.next()) {
    
    
            T t = tCalss.newInstance();//新建实体类对象
            for (int i = 0; i < columnCount; i++) {
    
    
                //获取列名
                String columnLabel = metaData.getColumnLabel(i + 1);
                //通过列名获取包括private权限的成员变量
                Field field = tCalss.getDeclaredField(columnLabel);
                //获取列值
                Object columnValue = rs.getObject(i + 1);
                //取消Java语言访问检查
                field.setAccessible(true);
                //给成员变量赋值
                field.set(t, columnValue);
            }
            arrayList.add(t);
            //在控制台打印第一列和第二列的数据(注意索引从1开始)
            //System.out.println(rs.getInt(1) + "\t" + rs.getString(2));
        }
    } catch (Exception e) {
    
    
        e.printStackTrace();
    } finally {
    
    
        //关闭资源。资源是要即是关闭的,而且最好还是将数据放在数组中去访问,防止程序卡顿等问题
        try {
    
    
            JDBCUtils.Close(conn, ps, rs);
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
    }
    return arrayList;
}

执行查询操作结果:
查询操作结果

2.5、添加一行数据

删、改同理。

public static void Add(String sql, Object param[]){
    
    
    Connection conn = null;
    PreparedStatement ps = null;
    try {
    
    
        //获取Connection对象conn
        conn = (Connection) JDBCUtils.getConnResult();
        //获取PreparedStatement对象ps
        ps = conn.prepareStatement(sql);
        //填充占位符
        if (param != null) {
    
    
            for (int i = 0; i < param.length; i++) {
    
    
                ps.setObject(i + 1, param[i]);
            }
        }
        //执行操作:增/删/改
        int i = ps.executeUpdate();
        //执行结果是一个更新计数i。这里只添加了一行,所以返回的计数i是1
        if (i>0){
    
    
            System.out.println("操作成功!");
        } else {
    
    
            System.out.println("操作失败!");
        }
    } catch (Exception e) {
    
    
        e.printStackTrace();
    } finally {
    
    
        //关闭资源。资源是要即是关闭的,而且最好还是将数据放在数组中去访问,防止程序卡顿等问题
        try {
    
    
            JDBCUtils.Close(conn, ps);
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
    }
}

执行添加操作结果:
添加操作结果

三、总结

  1. 连接需要的只有两步:导入包,加载驱动
  2. 获取连接后执行操作:查,增/删/改
  3. 重要的是要关闭资源,推荐将结果集放在数组中使用。资源不关闭,会使进程就会一直占用资源,导致系统宕机。

猜你喜欢

转载自blog.csdn.net/weixin_60808029/article/details/122337500

相关文章