Java MySQL 省市二级联动查询

在 Web 开发中,常常需要对地理位置进行选择,例如省份和城市的选择。在这种情况下,实现省市二级联动查询是一个常见的需求。本文将详细介绍如何使用 Java 和 MySQL 进行省市二级联动查询,并提供代码示例。

一、数据模型设计

在我们开始编码之前,需要先设计数据库的表结构。通常我们会有两个表:省份表和城市表。它们之间存在一对多的关系,即一个省包含多个城市。

数据库表结构

2023年10月的设计示例包括以下两个表:

  • Province 表:存储省份信息
  • City 表:存储城市信息

以下是数据模型关系图:

erDiagram
    Province {
        int id PK
        string name
    }
    
    City {
        int id PK
        string name
        int province_id FK
    }

    Province ||--o{ City : contains

创建表 SQL 语句

首先,我们需要在 MySQL 中创建这两张表。

CREATE TABLE Province (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE City (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    province_id INT,
    FOREIGN KEY (province_id) REFERENCES Province(id)
);

二、添加数据

接下来,我们可以添加一些省和城市的数据。以下是插入数据的 SQL 语句示例:

INSERT INTO Province (name) VALUES ('广东省'), ('江苏省');

INSERT INTO City (name, province_id) VALUES 
    ('广州市', 1), 
    ('深圳市', 1), 
    ('南京市', 2), 
    ('苏州市', 2);

三、后端实现

1. Maven 依赖

在 Java 中,我们可以使用 JDBC 连接 MySQL 数据库。确保在 pom.xml 文件中添加 MySQL 驱动依赖:

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

2. 数据库连接

接下来,我们需要创建一个数据库连接类:

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

public class DatabaseConnection {
    private static final String URL = "jdbc:mysql://localhost:3306/your_database_name";
    private static final String USER = "your_username";
    private static final String PASSWORD = "your_password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

3. 省市查询接口

然后,我们实现逻辑以获取省份和城市信息。以下是省份和城市查询的示例代码:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class LocationService {
    
    public List<String> getProvinces() throws SQLException {
        List<String> provinces = new ArrayList<>();
        String sql = "SELECT * FROM Province";

        try (Connection conn = DatabaseConnection.getConnection(); 
             PreparedStatement stmt = conn.prepareStatement(sql);
             ResultSet rs = stmt.executeQuery()) {
            
            while (rs.next()) {
                provinces.add(rs.getString("name"));
            }
        }
        return provinces;
    }

    public List<String> getCities(int provinceId) throws SQLException {
        List<String> cities = new ArrayList<>();
        String sql = "SELECT * FROM City WHERE province_id = ?";

        try (Connection conn = DatabaseConnection.getConnection(); 
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, provinceId);
            try (ResultSet rs = stmt.executeQuery()) {
                while (rs.next()) {
                    cities.add(rs.getString("name"));
                }
            }
        }
        return cities;
    }
}

4. 前端实现

最后,在前端使用 JavaScript 或 jQuery 调用这些接口实现省市的联动效果。以下是一个简单的示例:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>省市联动</title>
    <script src="
</head>
<body>

<select id="province"></select>
<select id="city"></select>

<script>
    $(document).ready(function() {
        // 加载省份
        $.get('/api/provinces', function(data) {
            data.forEach(function(province) {
                $('#province').append(new Option(province, province.id));
            });
        });

        // 加载城市
        $('#province').change(function() {
            var provinceId = $(this).val();
            $.get(`/api/cities?provinceId=${provinceId}`, function(data) {
                $('#city').empty();
                data.forEach(function(city) {
                    $('#city').append(new Option(city.name, city.id));
                });
            });
        });
    });
</script>

</body>
</html>

结论

通过上述步骤,我们实现了一个简单的省市二级联动查询功能。文章从数据库设计、添加数据、后端实现到前端动态交互进行了详细介绍。实际开发中,你可以根据需求扩展功能,例如通过 RESTful API 返回 JSON 数据,增加错误处理和优化性能等。

希望这篇文章能帮到你,更好的理解如何在 Java 中实现 MySQL 的省市二级联动查询功能!如有疑问,欢迎进一步交流。