Java结合连接数据库进行查询操作

本文介绍了如何在IDEA中连接MySQL数据库,包括添加JDBC-MySQL连接器、创建连接以及设置serverTimezone参数。接着讲解了SQL查询操作,如创建Statement对象,处理查询结果,以及使用ResultSet的方法进行游标控制。还讨论了条件与排序查询,包括where子语句、固定值比较、范围查询、模式匹配和order by子句。最后,提供了一个将数据库连接代码封装到静态方法中的示例,以及随机获取表中记录的代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IDEA连接MySQL数据库

将MySQL数据库连接器添加到项目中

mysql-connector-java-8.0.15.jar为例子,将jar文件添加到项目中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时JDBC-MySQL连接器就添加成功了

创建相应的连接

连接jar文件中相应的类

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");	//假如没有添加jar是会出错的
        } catch (Exception e) {
            e.printStackTrace();
        }

连接数据库

java.sql包中的DriverManager类中有两个用于建立连接的类方法
注意两个方法都可能抛出异常

Connection getConnection(java.lang.String,java.lang.Stiring,java.lang.String)

就例如

对于MySQL8.0版本,必须设置serverTimezone参数的值(值可以是MySQL8.0支持的时区之一,例如EST、CST、GMT等)例如,serverTimezone=CST或 serverTimezone =GMT(CST是Eastern Standard Time的缩写,CST是China Standard Time的缩写,GMT是Greenwich Mean Time缩写)。如果root用户密码是99,将&password=更改为&-password=99即可。

M.SQL5.7以及之后的版本建议应用程序和数据库服务器建立连接时明确设置ssL(Secure Sockets Layer),即在连接信息中明确使用useSSL参数,并设置值是true或fals;如果不设置useSSL参数,程序运行时总会提示用户程序进行明确设置(但不影响程序的运行)。对于早期的MySQL版本,用户程序不必设置该项。

        String url = "jdbc:mysql://localhost:3306/book?" + "useSSL = false&serverTimezone = GMT";
        try {
            connection = DriverManager.getConnection(url,"root","");   //连接数据库
        } catch (SQLException e) {
            e.printStackTrace();
        }
Connection getConnection(java.lang.String)

查询操作

得到SQL查询语句

首先使用Statement声明一个SQL语句对象,然后让已创建的连接对象con调用creatStatement()创建这个SQL语句对象
注意要使用try catch语句

            try {
                sql = connection.createStatement();
            } catch (SQLException e) {
                e.printStackTrace();
            }

处理查询结果

有了 SQL语句对象后就可以对其进行操作,对数据库中表操作后返回一个对象,这个对象就是用ResultSet类声明的对象
SQL语句对象调用executeQuery()方法,括号里填的是SQL语句

ResultSet resultSet = sql.executeQuery("SELECT * FROM mybooklist");	//选择表中的所有列

ResultSet对象的若干方法

  • boolean next()
  • String getString()

整合的例子

import java.sql.*;

public class Example14_1 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement sql;
        ResultSet resultSet;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
        String url = "jdbc:mysql://localhost:3306/book?" + "useSSL = false&serverTimezone = GMT";
        try {
            connection = DriverManager.getConnection(url, "root", "");   //连接数据库
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            sql = connection.createStatement();//创建SQL语句对象
            resultSet = sql.executeQuery("SELECT * FROM mybooklist");   //选择表中的所有列数
            while (resultSet.next()) {
                String str = resultSet.getString(1);
                String str1 = resultSet.getString(2);
                String str2 = resultSet.getString(3);
                String str3 = resultSet.getString(4);
                System.out.print(str + "/" + str1 + "/" + str2 + "/" + str3);
                System.out.println();
            }
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

运行结果

C:\Users\Administrator\.IntelliJIdea2019.3\config\jdbc-drivers\MySQL Connector\J 8\8.0.15\mysql-connector-java-8.0.15.jar" Chapter_14.Part_2.Example14_1
7-302-01465/高等数学/28.67/2020-12-02
7-352-01465/大学日语/58.5/2020-05-01
8-345-35621/我的大学/33.73/2019-05-09
8-345-35721/太阳湾湾/58.43/2020-04-15

进程已结束,退出代码 0

控制游标

结果集的游标的初始位置在结果集第1行的前面,结果集调用next()方法向下(后)移动游标,移动成功返回true,否则返回false。如果需要在结果集中上下(前后)移动、显示结果集中某条记录或随机显示若干条记录等,必须返回一个可滚动的结果集。为了得到一个可滚动的结果集,需使用下述方法获得一个Statement对象。

可以根据需求开获取其间的结果集

Statement stmt = con.createStatement(int type ,int concurrency)

type的取值决定滚动方式

  • ResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下滚动。
  • ResultSet.TYPE SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据变化时,当前结果集不变。
  • ResultSet.TYPE_SCROLL_SENSITIVE:返回可滚动的结果集,当数据库变化时,

Concurrency取值决定是否可以用结果集更新数据库

  • ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库中的表。
  • ResultSet.CONCUR_UPDATABLE:能用结果集更新数据库中的表。

滚动查询经常用到ResultSet的下述方法。

  • public boolean previous():将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时返回false。
  • public void beforeFirst:将游标移动到结果集的初始位置,即在第一行之前。
  • public void afterLast():将游标移到结果集最后一行之后。
  • public void first():将游标移到结果集的第一行。
  • public void last():将游标移到结果集的最后一行。
  • public boolean isAfterLast():判断游标是否在最后一行之后。
  • public boolean isBeforeFirst():判断游标是否在第一行之前
  • public boolean isFirst():判断游标是否指向结果集的第一行。
  • public boolean isLast():判断游标是否指向结果集的最后一行。
  • public int getRow():得到当前游标所指行的行号,行号从1开始,如果结果集没有任何行,返回0。
  • public boolean absolute(int row):将游标移到参数row指定的行。//row值为负数的话表示移到倒数第一行如此类推

由于连接数据库需要重复写大量代码,所以为了方便就把连接的代码封装到一个类里面,用静态方法进行调用

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class GetDatabaseConnection {
    public static Connection connectDB(String DBname, String id, String password) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
        String url = "jdbc:mysql://localhost:3306/" + DBname + "?" + "useSSL = false&serverTimezone = GMT";
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, id, password);   //连接数据库
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
}

随机获取表中两条纪录的例子

获取随机数的类

import java.util.LinkedList;
import java.util.Random;

public class GetRandomNumber {
    public static int[] getRandomNumber(int max, int amount) {
        LinkedList<Integer> linkedList = new LinkedList<Integer>(); //链表
        for (int i = 1; i <= max; i++) {
            linkedList.add(i);  //自动装箱
        }
        int result[] = new int[amount];
        for (int i = 0; i < amount; i++) {     //
            int index = new Random().nextInt(linkedList.size());    //获取链表的随机索引
            int m = linkedList.remove(index);   //然后移除
            result[i] = m;
        }
        return result;
    }
}
import java.sql.*;

public class Example14_1 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement sql;
        ResultSet resultSet;
        connection = GetDatabaseConnection.connectDB("book", "root", "");
        try {
            sql = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);//创建SQL语句对象
            resultSet = sql.executeQuery("SELECT * FROM mybooklist");   //选择表中的所有列数
            resultSet.last();   //将游标指向集的最后一个
            int max = resultSet.getRow();   //获取表的行数
            System.out.println("表中共有" + max + "纪录");
            int[] a = GetRandomNumber.getRandomNumber(max, 2);
            for (int i : a) {
                resultSet.absolute(i);  //游标移动到i行
                String str = resultSet.getString(1);
                String str1 = resultSet.getString(2);
                String str2 = resultSet.getString(3);
                String str3 = resultSet.getString(4);
                System.out.print(str + "/" + str1 + "/" + str2 + "/" + str3);
                System.out.println();
            }
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

运行结果

C:\Users\Administrator\.IntelliJIdea2019.3\config\jdbc-drivers\MySQL Connector\J 8\8.0.15\mysql-connector-java-8.0.15.jar" Chapter_14.Part_2.Example14_1
表中共有4纪录
7-302-01465/高等数学/28.67/2020-12-02
8-345-35621/我的大学/33.73/2019-05-09

进程已结束,退出代码 0

条件与排序查询

where子语句

一般格式:

select 字段 from 表名 where 条件
  • 固定值比较

例如,从mybooklist中查询name为高等数学的记录//

select * from mybooklist where name = '高等数学'
  • 字段值在某区间范围

例如,从mybooklist中查询价格在28.68-87.7之间的记录//

select * from mybooklist where price>28.68 and price<=87.7
  • 用操作符like进行模式匹配 //使用%代表0个或多个,_代表1个

排序
用order by 子语句对记录排序

select * from 表名 order by 字段名 (列名)
select * from 表名 where 条件 order by 字段名 (列名)
select * from mybooklist order by price	//按价格进行排序

CET4P189

  • primary
  • outside
  • variation
  • interfere
  • owe
  • dense
  • starve
  • simplicity
  • burden
  • heap
  • scatter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值