使用Java语言开发工具idea连接MySQL数据库的基本步骤及操作实例

Java连接MySQL数据库并进行一些基本操作以及导入jar包的两种方式

其实,任何开发工具连接数据库无非就是三步:1.安装驱动。2.加载驱动,创建连接对象。3.创建对象操作游标。4.游标调用函数完成执行SQL语句。 但是在各种语言开发工具进行连接过程中,这些过程操作又有一定的差异。接下来我们来了解Java语言开发工具idea连接数据库的基本操作。

首先进行了解,什么是JDBCJDBC是一套用于执行SQL语句的Java API,应用程序可通过这套API连接到关系数据库。并使用SQL语句完成对数据库中数据的查询、新增、更新、删除等操作。应用程序使用JDBC访问特定的数据库时,只需要通过不同的数据库驱动与其对应的数据库进行连接,再进行相应的操作即可。

  1. JDBC常用的API,主要位于java.sql包中,该包定义了一系列访问数据库的接口和类。
  2. Driver接口:Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用,即将所使用的数据库驱动程序加载到项目classpath中。也就是导入jar包:
    导包的具体过程为:1.File-->Project Setting-->Moudles-->dependencies-->点击12 version ……-->+ 然后选择完之后勾选,最后Apply即可。
    或者
    2.在src文件夹下-->右击-->Open Moudles Settings dependencies-->点击12 version ……-->+ 然后选择完之后勾选,最后Apply即可。
    具体位置如图所示

在这里插入图片描述

  1. DriverManager接口:DriverManager类用于加载数据库驱动并创建与数据库的连接。通过DriverManager类中的静态方法getConnection(String url,String user,String pwd)来建立和数据库的连接,并返回表述连接的Connection对象。
  1. Connection接口:Connection接口代表Java程序与数据库的连接对象。只有获得该连接对象之后,才能访问数据库,操作数据表。相当于游标对象。
    • Statement crestStatement()方法:
      通过Connection接口调用crestStatement方法。返回一个向数据库发送语句的Statement对象,即创建游标对象。
    • PreparedStatement preparedStatement(String sql)方法:
      该方法用于返回一个PreparedStatement对象,该对象用于向数据库发送参数化的SQL语句。
    • CallableStatement prepareCall(String sql)方法:
      该方法用于返回一个CallableStatement对象,该对象用于调用数据库中的存储过程。
  1. Statement接口:Statement接口是执行Java数据库操作的一个重要接口,它用于执行静态的SQL语句,并返回一个结果对象,(通过Connection接口调用crestStatement方法获得)。
    执行SQL语句的常用方法:
    • Boolean execute(String sql)方法:用于执行各种SQL语句,返回一个Boolean类型的值,如果为true,表示执行的SQL语句有查询结果,可通过Statement的getResult()方法获得查询结果。
    • int executeUpdate(String sql)方法:用于执行SQL中的insert、update、delete语句,该方法返回一个int类型的值,表示数据库中should该SQL语句影响的记录条数。
    • ResultSet executeQuery(String sql)方法:用于执行SQL中的select语句,该方法返回一个表示查询结果的ResultSet对象。
  1. PrepareStatement接口:Statement接口封装了JDBC执行SQL语句的办法,可执行SQL语句,但是在实际开发过程中常用程序中的变量作为查询条件,此时使用Statement接口代码SQL语句过于繁琐;而PreparedStatement接口是Statement接口的子接口,扩展了带有参数的SQL语句的操作,应用接口中的SQL语句可以使用占位符"?"来代替参数,通过setXxx()方法为SQL语句参数赋值。
    • int executeUPdate()方法:
      在此PreparedStatement对象中执行SQL语句,该语句必须是一个DML语句(数据库操作语句增删改查)或者是无返回值的SQL语句,如DDL语句(create建表语句、drop删表语句、alter(修改字段类型语句)等。
    • ResultSet executeUpdate()方法:
      在此PreparedStatement对象中执行SQL查询,该方法返回的是ResultSet对象。
    • void setInt(int parameterIndex,int x)方法:将指定参数设置为给定的int值。
    • void setFloat(int parameterIndex,float x)方法:
      将指定参数设置为给定的float值。
    • void setString(int parameterIndex,String x)方法:
      将指定参数设置为给定的String值。
    • void setDate(int parameterIndex,Date x)方法:
      将指定参数设置为给定的Date值。
    • void addBatch()方法:
      将一组参数添加到此PreparedStatement对象的批处理命令中。
    • void setCharacterStream(int parameterIndex,java.io.Reader reader,int length)方法:
      将指定的输入流写入数据库的文本字段。
    • void setBinaryStream(int parameterIndex,java.io.InputStream x,int length)方法:
      将二进制的输入流数据写入到二进制字段中。
  1. ResultSet接口:用于保存JDBC执行查询语句时返回的结果集,该结果集封装在一个逻辑表格中。在ResultSet接口内部有一个指向表格数据行的游标。ResultSet对象初始化时,游标在表格的第一行之前,调用next()方法可将游标移动到下一行。如果下一行没有数据,则返回false。
    • String getString(int columnIndex)方法:
      用于获取指定字段的String类型的值,参数columnIndex代表字段的索引。
    • String getString(int columnIndex)方法:
      用于获取指定字段的String类型的值,参数columnIndex代表字段的索引。
    • String getString(String columnName)方法:
      用于获取指定字段的String类型的值,参数columnName代表字段的名称。
    • int getInt(int columnIndex)方法:
      用于获取指定字段的int类型的值,参数columnIndex代表字段的索引。
    • String getInt(String columnName)方法:
      用于获取指定字段的int类型的值,参数columnName代表字段的名称。
    • Date getDate(int columnIndex)方法:
      用于获取指定字段的Date类型的值,参数columnIndex代表字段的索引。
    • Date getDate(int columnName)方法:
      用于获取指定字段的Date类型的值,参数columnName代表字段的名称。
    • boolean next()方法:
      将游标从当前位置指向下移一行
    • boolean absolute(int row)方法:
      将游标移动到此ResultSet对象的指定行。
    • void afterLast()方法:
      将游标移动到此ResultSet对象的末尾,即最后一行之后。
    • void beforeFirst()方法:
      将游标移动到此ResultSet对象的开头,即第一行之前。
    • boolean previous()方法:
      将游标移动到此ResultSet对象的上一行。
    • boolean last()方法:
      将游标移动到此ResultSet对象的最后一行。

在了解了这些之后,接下来看代了解连接步骤:
1.导入数据库驱动jar包:(加载数据库驱动通常使用Class类的静态方法forName()方法来实现,具体实现方式见下图代码。)

在这里插入图片描述
2.通过DriverManager类获取数据库连接,创建数据库对象。
3.通过数据库对象调用createStatement()方法创建游标对象。通过游标对象执行SQL语句。
4.通过ResultSet对象获得执行SQL语句返回的结果集。
5.关闭连接,释放资源。通过try……catch……finally代码块统一关闭资源。(依次关闭ResultSet结果集资源、游标对象、数据库连接对象)。

package Other;

import java.sql.*;

import static java.lang.Class.forName;

public class JDBC_Connector {
    public static void main(String[] args) throws SQLException{
        //创建java程序与数据库的连接对象
        Connection connection = null;
        //创建执行静态SQL语句的接口对象
        Statement statement = null;
        //创建游标对象,返回查询结果集
        ResultSet resultSet = null;
        //将MySQL数据库驱动名称封装在字符串中
        String driver = "com.mysql.cj.jdbc.Driver";
        //指定使用数据库的路径、编码格式、时区,并以字符串进行封装
        String url = "jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
        //指定登录账户
        String user = "root";
        //指定账户密码
        String psw = "hcy5120184";
        //加载数据库驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //连接数据库
        connection = DriverManager.getConnection(url,user,psw);
        //通过Connection对象获取Statement对象
        statement = connection.createStatement();
        String sql = "select * from tb_admin";
        resultSet = statement.executeQuery(sql);
        System.out.println("id\t|\tuserName\t|\tuserPsw");
        while(resultSet.next()){
            int id = resultSet.getInt("id");
            String userName = resultSet.getString("userName");
            String userPsw = resultSet.getString("userPsw");
            System.out.println(id+"\t|\t\t"+userName+"\t\t|\t"+userPsw);
        }
        if (resultSet!=null)resultSet.close();
        if (statement!=null)statement.close();
        if (connection!=null)connection.close();

    }
}

运行结果为:
在这里插入图片描述

上述有很多方法我并没有进行使用。

这一套连接操作体系,可统一封装在一个类中,但需要使用时,直接通过创建类对象调用相关方法即可。下图为我经常使用的方法封装在了一个类中,代码附上:

package com.other;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.models.TbAdmin;
import org.apache.commons.beanutils.ConvertUtils;

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

//改进的DBUtils:1.所有的数据库操作都使用了连接池技术 2.查询记录返回值中,不再需要强制转换
public class DBUtils1 {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    String driver = "com.mysql.cj.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
    String user = "root";
    String psw = "Sa123456";

    public void close() {
        try {
            if (resultSet != null && !resultSet.isClosed())
                resultSet.close();
            if (statement != null && !statement.isClosed())
                statement.close();
            if (connection != null && !connection.isClosed())
                connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //通过连接池获取connection对象
    public Connection getConnection() {
        Connection connection = null;
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        try {
            cpds.setDriverClass(driver);
            cpds.setJdbcUrl(url);
            cpds.setUser(user);
            cpds.setPassword(psw);
            //最大线程池中连接对象10
            cpds.setMaxPoolSize(10);
            cpds.setMinPoolSize(1);
            connection = cpds.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    public int executeUpdate(String sql) {
        int result = 0;
        try {
            Class.forName(driver);//加载驱动
            connection = DriverManager.getConnection(url, user, psw);//打开数据库,返回连接数据库对象
            statement = connection.createStatement();//获取执行sql命令的对象
            result = statement.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return result;
    }

    public ResultSet executeQueryResultSet(String sql) {
        try {
            Class.forName(driver);//加载驱动
            connection = DriverManager.getConnection(url, user, psw);//打开数据库,返回连接数据库对象
            statement = connection.createStatement();//获取执行sql命令的对象
            resultSet = statement.executeQuery(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultSet;
    }

    //查找单条记录,封装在对象中
    public <T> T executeQueryBean(String sql, Class<T> clzss) {
        T object = null;
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(url, user, psw);
//            connection = getConnection();
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            if (resultSet.next()) {
                object = clzss.newInstance();
                for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
                    String methodName = resultSetMetaData.getColumnName(i);
                    Field field = clzss.getDeclaredField(methodName);
                    methodName = "set" + methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
                    Method method = clzss.getMethod(methodName, field.getType());
                    method.invoke(object, ConvertUtils.convert(resultSet.getString(i), field.getType()));//将数据库中的值的类型转换成类方法中的形参类型
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return object;
    }

    //查找多条记录,封装在列表中
    public <T> List<T> executeQueryBeans(String sql, Class<T> clzss) {
        List<T> list = new ArrayList<>();
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(url, user, psw);
//            connection=getConnection();
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            while (resultSet.next()) {
                T object = clzss.newInstance();
                for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
                    String methodName = resultSetMetaData.getColumnName(i);
                    Field field = clzss.getDeclaredField(methodName);
                    methodName = "set" + methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
                    Method method = clzss.getMethod(methodName, field.getType());
                    method.invoke(object, ConvertUtils.convert(resultSet.getString(i), field.getType()));//将数据库中的值的类型转换成类方法中的形参类型
                }
                list.add(object);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (list.size() == 0)
            list = null;
        return list;
    }

}

需要导入的jar包为:
在这里插入图片描述

如有疑问,欢迎在评论区下方留言交流。若觉得内容稍可,请留下你们的

在这里插入图片描述

  • 11
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值