基于数据库的通讯录管理系统(Java)

该代码实现了一个基于JavaSwing的通讯录系统,用户可以通过菜单栏进行联系人的添加、修改、删除和查询操作。系统连接到本地数据库,根据不同的分组存储联系人信息,支持对分组中的联系人进行管理。此外,还提供了显示所有联系人和删除所有联系人等功能。
摘要由CSDN通过智能技术生成
package demo;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;

public class AddressBookSystem extends JFrame {

    private JList<String> contactsList;
    private DefaultListModel<String> contactsModel;
    private JComboBox<String> groupComboBox;
    private DefaultComboBoxModel<String> groupModel;
    private Connection connection;

    //创建窗口
    public AddressBookSystem() {
        setTitle("通讯录");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 500);
        setLocationRelativeTo(null);

        ImageIcon icon = new ImageIcon("back.jpg");
        setIconImage(icon.getImage());

        createMenuBar();
        createContactsList();
        createGroupComboBox();

        setLayout(new BorderLayout());
        JScrollPane scrollPane = new JScrollPane(contactsList);
        add(scrollPane, BorderLayout.CENTER);
        add(new JScrollPane(contactsList), BorderLayout.CENTER);
        add(groupComboBox, BorderLayout.NORTH);
    }

    //创建菜单栏
    private void createMenuBar() {
        JMenuBar menuBar = new JMenuBar();

        JMenu contactsMenu = new JMenu("联系人管理");
        JMenuItem addContactItem = new JMenuItem("添加联系人");
        JMenuItem modifyContactItem = new JMenuItem("修改联系人");
        JMenuItem removeContactItem = new JMenuItem("删除联系人");
        JMenuItem searchContactItem = new JMenuItem("查询联系人");
        contactsMenu.add(searchContactItem);
        contactsMenu.add(addContactItem);
        contactsMenu.add(modifyContactItem);
        contactsMenu.add(removeContactItem);
        menuBar.add(contactsMenu);

        JMenu settingsMenu = new JMenu("全局操作");
        JMenuItem deleteAllContactsItem = new JMenuItem("删除所有联系人");
        JMenuItem showAllContactsItem = new JMenuItem("显示所有联系人");
        settingsMenu.add(showAllContactsItem);
        settingsMenu.add(deleteAllContactsItem);
        menuBar.add(settingsMenu);

        JMenu messageMenu = new JMenu("帮助");
        JMenuItem showMessageItem = new JMenuItem("联系人显示格式");
        showMessageItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(AddressBookSystem.this,
                        "姓名-性别-电话号码-备注", "格式", JOptionPane.INFORMATION_MESSAGE);
            }
        });
        messageMenu.add(showMessageItem);
        menuBar.add(messageMenu);

        setJMenuBar(menuBar);

        deleteAllContactsItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int option = JOptionPane.showConfirmDialog(AddressBookSystem.this,
                        "确定要删除所有联系人吗?", "删除所有联系人", JOptionPane.YES_NO_OPTION);
                if (option == JOptionPane.YES_OPTION) {
                    deleteAllContacts();
                }
            }
        });
        showAllContactsItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showAllContacts();
            }
        });
        addContactItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JPanel inputPanel = new JPanel();
                inputPanel.setLayout(new GridLayout(4, 2));

                JTextField nameField = new JTextField();
                JComboBox<String> genderComboBox = new JComboBox<>(new String[]{"男", "女"});
                JTextField phoneNumberField = new JTextField();
                JTextField remarksField = new JTextField();

                inputPanel.add(new JLabel("姓名:"));
                inputPanel.add(nameField);
                inputPanel.add(new JLabel("性别:"));
                inputPanel.add(genderComboBox);
                inputPanel.add(new JLabel("电话号码:"));
                inputPanel.add(phoneNumberField);
                inputPanel.add(new JLabel("备注:"));
                inputPanel.add(remarksField);

                int option = JOptionPane.showConfirmDialog(AddressBookSystem.this, inputPanel,
                        "添加联系人", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                if (option == JOptionPane.OK_OPTION) {
                    String name = nameField.getText().trim();
                    String gender = (String) genderComboBox.getSelectedItem();
                    String phoneNumber = phoneNumberField.getText().trim();
                    String remarks = remarksField.getText().trim();
                    if (!name.isEmpty()) {
                        if (phoneNumber.isEmpty()) {
                            phoneNumber = " null ";
                        }
                        if (remarks.isEmpty()) {
                            remarks = " null ";
                        }
                        Contact contact = new Contact(name, gender, phoneNumber, remarks);
                        contactsModel.addElement(contact.toString());
                        String selectedGroup = groupComboBox.getSelectedItem().toString();
                        insertContactToGroup(contact, selectedGroup);
                    } else {
                        JOptionPane.showMessageDialog(AddressBookSystem.this,
                                "姓名不能为空", "添加联系人", JOptionPane.ERROR_MESSAGE);
                    }

                }
            }
        });

        modifyContactItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedIndex = contactsList.getSelectedIndex();
                if (selectedIndex != -1) {
                    String selectedContact = contactsModel.getElementAt(selectedIndex);
                    String[] contactInfo = selectedContact.split(" - ");

                    JPanel inputPanel = new JPanel();
                    inputPanel.setLayout(new GridLayout(4, 2));

                    JTextField nameField = new JTextField(contactInfo[0]);
                    JComboBox<String> genderComboBox = new JComboBox<>(new String[]{"男", "女"});
                    genderComboBox.setSelectedItem(contactInfo[1]);
                    JTextField phoneNumberField = new JTextField(contactInfo[2]);
                    JTextField remarksField = new JTextField(contactInfo[3]);

                    inputPanel.add(new JLabel("姓名:"));
                    inputPanel.add(nameField);
                    inputPanel.add(new JLabel("性别:"));
                    inputPanel.add(genderComboBox);
                    inputPanel.add(new JLabel("电话号码:"));
                    inputPanel.add(phoneNumberField);
                    inputPanel.add(new JLabel("备注:"));
                    inputPanel.add(remarksField);

                    int option = JOptionPane.showConfirmDialog(AddressBookSystem.this, inputPanel,
                            "修改联系人", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                    if (option == JOptionPane.OK_OPTION) {
                        String name = nameField.getText().trim();
                        String gender = (String) genderComboBox.getSelectedItem();
                        String phoneNumber = phoneNumberField.getText().trim();
                        String remarks = remarksField.getText().trim();

                        if (name.isEmpty()) {
                            name = " null ";
                        }
                        if (phoneNumber.isEmpty()) {
                            phoneNumber = " null ";
                        }
                        if (remarks.isEmpty()) {
                            remarks = " null ";
                        }

                        String newContact = name + " - " + gender + " - " + phoneNumber + " - " + remarks;
                        contactsModel.setElementAt(newContact, selectedIndex);
                        String selectedGroup = groupComboBox.getSelectedItem().toString();
                        updateContactInGroup(selectedContact, newContact, selectedGroup);
                    }
                }
            }
        });

        removeContactItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedIndex = contactsList.getSelectedIndex();
                if (selectedIndex != -1) {
                    String selectedContact = contactsModel.getElementAt(selectedIndex);

                    int option = JOptionPane.showConfirmDialog(AddressBookSystem.this,
                            "确定要删除联系人吗?", "删除联系人", JOptionPane.YES_NO_OPTION);
                    if (option == JOptionPane.YES_OPTION) {
                        String selectedGroup = groupComboBox.getSelectedItem().toString();
                        removeContactFromGroup(selectedContact, selectedGroup);
                        contactsModel.removeElementAt(selectedIndex);
                    }
                }
            }
        });

        searchContactItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JTextField searchField = new JTextField();
                searchField.setColumns(10);
                JPanel searchPanel = new JPanel();
                searchPanel.add(new JLabel("请输入联系人姓名:"));
                searchPanel.add(searchField);

                int option = JOptionPane.showConfirmDialog(AddressBookSystem.this, searchPanel,
                        "查询联系人", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

                if (option == JOptionPane.OK_OPTION) {
                    String searchTerm = searchField.getText().trim();
                    if (!searchTerm.isEmpty()) {
                        searchContacts(searchTerm);
                    } else {
                        JOptionPane.showMessageDialog(AddressBookSystem.this,
                                "请输入联系人姓名", "查询联系人", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        });
    }

    //创建联系人列表
    private void createContactsList() {
        contactsModel = new DefaultListModel<>();
        contactsList = new JList<>(contactsModel);
    }

    //创建分组下拉框
    private void createGroupComboBox() {
        groupModel = new DefaultComboBoxModel<>();
        groupModel.addElement("朋友");
        groupModel.addElement("家人");
        groupModel.addElement("同学");
        groupModel.addElement("室友");
        groupModel.addElement("陌生人");
        groupComboBox = new JComboBox<>(groupModel);
        groupComboBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                loadContacts();
            }
        });
    }

    //将通讯录连接至本地数据库并为分组创建表格
    private void connectToDatabase() {
        try { // 加载数据库驱动类
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("数据库驱动加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            String url = "jdbc:mysql://localhost:3306/address_book";
            String username = "root";
            String password = "mysql";
            System.out.println("数据库连接成功");
            connection = DriverManager.getConnection(url, username, password);
            createGroupTable("朋友");
            createGroupTable("家人");
            createGroupTable("同学");
            createGroupTable("室友");
            createGroupTable("陌生人");
            loadContacts();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //根据给定的分组名创建对应的表格
    private void createGroupTable(String groupName) {
        try {
            Statement statement = connection.createStatement();
            String sql = "CREATE TABLE IF NOT EXISTS " + groupName.toLowerCase() + " (" +
                    "id INT PRIMARY KEY AUTO_INCREMENT," +
                    "name VARCHAR(255)," +
                    "gender VARCHAR(10)," +
                    "phone_number VARCHAR(20)," +
                    "remarks VARCHAR(255))";
            statement.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //将联系人信息插入选中表中
    private void insertContactToGroup(Contact contact, String groupName) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "INSERT INTO " + groupName.toLowerCase() + " (name, gender, phone_number, remarks) VALUES (?, ?, ?, ?)");
            statement.setString(1, contact.getName().isEmpty() ? " " : contact.getName());
            statement.setString(2, contact.getGender());
            statement.setString(3, contact.getPhoneNumber().isEmpty() ? " " : contact.getPhoneNumber());
            statement.setString(4, contact.getRemarks().isEmpty() ? " " : contact.getRemarks());
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //删除表中的选中的联系人信息
    private void removeContactFromGroup(String contactString, String groupName) {
        String[] contactInfo = contactString.split(" - ");
        String name = contactInfo[0];
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "DELETE FROM " + groupName.toLowerCase() + " WHERE name = ?");
            statement.setString(1, name);
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //修改选中的联系人信息
    private void modifyContact() {
        int selectedIndex = contactsList.getSelectedIndex();
        if (selectedIndex != -1) {
            String selectedContact = contactsModel.getElementAt(selectedIndex);

            JPanel inputPanel = new JPanel();
            inputPanel.setLayout(new GridLayout(4, 2));

            JTextField nameField = new JTextField();
            JComboBox<String> genderComboBox = new JComboBox<>(new String[]{"男", "女"});
            JTextField phoneNumberField = new JTextField();
            JTextField remarksField = new JTextField();

            String[] contactInfo = selectedContact.split(" - ");
            nameField.setText(contactInfo[0]);
            genderComboBox.setSelectedItem(contactInfo[1]);
            phoneNumberField.setText(contactInfo[2]);
            remarksField.setText(contactInfo[3]);

            inputPanel.add(new JLabel("姓名:"));
            inputPanel.add(nameField);
            inputPanel.add(new JLabel("性别:"));
            inputPanel.add(genderComboBox);
            inputPanel.add(new JLabel("电话号码:"));
            inputPanel.add(phoneNumberField);
            inputPanel.add(new JLabel("备注:"));
            inputPanel.add(remarksField);

            int option = JOptionPane.showConfirmDialog(AddressBookSystem.this, inputPanel,
                    "修改联系人", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
            if (option == JOptionPane.OK_OPTION) {
                String name = nameField.getText().trim();
                String gender = (String) genderComboBox.getSelectedItem();
                String phoneNumber = phoneNumberField.getText().trim();
                String remarks = remarksField.getText().trim();

                if (!name.isEmpty()) {
                    String newContact = name + " - " + gender + " - " + phoneNumber + " - " + remarks;
                    contactsModel.setElementAt(newContact, selectedIndex);
                    String selectedGroup = groupComboBox.getSelectedItem().toString();
                    updateContactInGroup(selectedContact, newContact, selectedGroup);
                } else {
                    JOptionPane.showMessageDialog(AddressBookSystem.this,
                            "姓名不能为空", "修改联系人", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }

    //更新指定分组中的联系人信息
    private void updateContactInGroup(String oldContact, String newContact, String groupName) {
        String[] oldContactInfo = oldContact.split(" - ");
        String[] newContactInfo = newContact.split(" - ");

        try {
            StringBuilder updateStatement = new StringBuilder("UPDATE ")
                    .append(groupName.toLowerCase())
                    .append(" SET name = ?, gender = ?, phone_number = ?, remarks = ? WHERE name = ?");
            PreparedStatement statement = connection.prepareStatement(updateStatement.toString());

            statement.setString(1, newContactInfo[0].isEmpty() ? " " : newContactInfo[0]); // Name
            statement.setString(2, newContactInfo[1]); // Gender
            statement.setString(3, newContactInfo[2].isEmpty() ? " " : newContactInfo[2]); // Phone number
            statement.setString(4, newContactInfo[3].isEmpty() ? " " : newContactInfo[3]); // Remarks
            statement.setString(5, oldContactInfo[0]); // Old name

            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //根据姓名全局查询联系人信息
    private void searchContacts(String searchTerm) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "SELECT * FROM 同学 WHERE name LIKE ? UNION " +
                            "SELECT * FROM 陌生人 WHERE name LIKE ? UNION " +
                            "SELECT * FROM 室友 WHERE name LIKE ? UNION " +
                            "SELECT * FROM 朋友 WHERE name LIKE ? UNION " +
                            "SELECT * FROM 家人 WHERE name LIKE ?");
            statement.setString(1, "%" + searchTerm + "%");
            statement.setString(2, "%" + searchTerm + "%");
            statement.setString(3, "%" + searchTerm + "%");
            statement.setString(4, "%" + searchTerm + "%");
            statement.setString(5, "%" + searchTerm + "%");
            ResultSet resultSet = statement.executeQuery();

            StringBuilder result = new StringBuilder();
            while (resultSet.next()) {
                String name = resultSet.getString("name");
                String gender = resultSet.getString("gender");
                String phoneNumber = resultSet.getString("phone_number");
                String remarks = resultSet.getString("remarks");

                result.append("姓名: ").append(name).append("\n");
                result.append("性别: ").append(gender).append("\n");
                result.append("电话号码: ").append(phoneNumber).append("\n");
                result.append("备注: ").append(remarks).append("\n\n");
            }

            if (result.length() > 0) {
                JOptionPane.showMessageDialog(AddressBookSystem.this, result.toString(),
                        "查询结果", JOptionPane.INFORMATION_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(AddressBookSystem.this,
                        "未找到匹配的联系人", "查询结果", JOptionPane.ERROR_MESSAGE);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //加载指定组别的联系人并显示在界面上
    private void loadContacts() {
        contactsModel.clear();
        String selectedGroup = groupComboBox.getSelectedItem().toString();
        try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM " + selectedGroup.toLowerCase());
            while (resultSet.next()) {
                String name = resultSet.getString("name");
                String gender = resultSet.getString("gender");
                String phoneNumber = resultSet.getString("phone_number");
                String remarks = resultSet.getString("remarks");
                Contact contact = new Contact(name, gender, phoneNumber, remarks);
                contactsModel.addElement(contact.toString());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //删除所有联系人
    private void deleteAllContacts() {
        int option = JOptionPane.showConfirmDialog(AddressBookSystem.this,
                "此操作将删除所有联系人。确定要继续吗?", "删除所有联系人", JOptionPane.YES_NO_OPTION);
        if (option == JOptionPane.YES_OPTION) {
            try {
                Statement statement = connection.createStatement();
                statement.executeUpdate("DELETE FROM 朋友");
                statement.executeUpdate("DELETE FROM 家人");
                statement.executeUpdate("DELETE FROM 同学");
                statement.executeUpdate("DELETE FROM 室友");
                statement.executeUpdate("DELETE FROM 陌生人");
                contactsModel.clear();
                JOptionPane.showMessageDialog(AddressBookSystem.this,
                        "所有联系人已成功删除", "删除所有联系人", JOptionPane.INFORMATION_MESSAGE);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    //显示所有联系人
    private void showAllContacts() {
        JTextArea textArea = new JTextArea();
        textArea.setEditable(false);

        try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM 朋友 UNION " +
                    "SELECT * FROM 家人 UNION " +
                    "SELECT * FROM 同学 UNION " +
                    "SELECT * FROM 室友 UNION " +
                    "SELECT * FROM 陌生人");

            while (resultSet.next()) {
                String name = resultSet.getString("name");
                String gender = resultSet.getString("gender");
                String phoneNumber = resultSet.getString("phone_number");
                String remarks = resultSet.getString("remarks");

                textArea.append("姓名: " + name + "\n");
                textArea.append("性别: " + gender + "\n");
                textArea.append("电话号码: " + phoneNumber + "\n");
                textArea.append("备注: " + remarks + "\n\n");
            }

            if (textArea.getText().isEmpty()) {
                textArea.setText("通讯录中没有联系人");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            textArea.setText("无法显示联系人");
        }

        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setPreferredSize(new Dimension(300, 300));

        JOptionPane.showMessageDialog(AddressBookSystem.this, scrollPane,
                "所有联系人", JOptionPane.INFORMATION_MESSAGE);
    }

    //创建联系人Contact类
    private static class Contact {
        private String name;
        private String gender;
        private String phoneNumber;
        private String remarks;

        public Contact(String name, String gender, String phoneNumber, String remarks) {
            this.name = name;
            this.gender = gender;
            this.phoneNumber = phoneNumber;
            this.remarks = remarks;
        }

        public String getName() {
            return name;
        }

        public String getGender() {
            return gender;
        }

        public String getPhoneNumber() {
            return phoneNumber;
        }

        public String getRemarks() {
            return remarks;
        }

        @Override
        public String toString() {
            return name + " - " + gender + " - " + phoneNumber + " - " + remarks;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                AddressBookSystem addressBook = new AddressBookSystem();
                addressBook.connectToDatabase();
                addressBook.setVisible(true);
            }
        });
    }
}

实现了以下要求说明的功能: 1.要求使用GUI,采用 Swing 技术数据存储采用文件系统(可以是文本 文件、xml 文件、vCard 文件或其他自定义格式文件,但不能是 Excel 文件)。不 使用数据库。 2. 通讯录中每个项目包括: ( 1)基本信息:姓名、手机号码、电子邮箱、生日、所属组、备注、像片。 ( 2)工作单位:国家、省份、城市、地址、工作单位、所属部门、职位、 邮编、电话、传真 ( 3)网络信息:个人主页、即时通信工具及号码、备用邮箱 ( 4)家庭资料:国家、省份、城市、地址、邮编、电话 3 .通讯录数据的录入功能:输入并存储新的通讯录数据,输入时如果有同 名或同电话号码时,应该给出提示。 4 .通讯录数据的查询功能: ( 1)默认列出所有条目。 ( 2)模糊查询,可以按:姓名、电话号码、手机、姓名的汉语拼音的声母 或全拼查询。支持模糊查询即输入部分数据后,可以查询出符合条件的全部条目。 如:输入“张”,列出所有名字中有“张”的条目;输入“ 2645”列出电话中有 该 4个数字的所有条目;输入“xl ”,列出声母为该 2 个字母的所有条目 ( 3)指定分组后,列出某分组的所有条目 说明:查询结果如果有多个条目,应按照姓名排序,并使用姓或姓的第一 个汉语拼音的字母分类。 5 .删除和修改功能:查询到一个条目后,可以删除该条目或修改条目内容。 6 .通信录内容的导入和导出功能。要求能够以CSV 格式和 vCard 格式导入 和导出通讯录的全部内容。并能够与主流手机或其他通讯录软件交换数据。 7 .通讯录显示设置,可以设置在显示查询结果时,一个条目可以显示或不 显示哪些内容。 注意:本系统实现了读取和保存csv文件,同时csv文件中只保存了图片的路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值