输入IP使用JDBC读取数据库信息并返回具体地址

13 篇文章 0 订阅

思路分析

  1. 定义连接类,连接数据库
    1. 定义properties,存放mysql信息
    2. 读取properties
    3. 注册驱动,获取连接
  2. 定义测试类,运行主程序
    1. 定义输入类,检测控制台输入
    2. 定义正则表达式,对输入的ip进行判断
    3. 判断通过则调用核心逻辑,判断出地址所在
    4. 反之报错(校验失败)
  3. 编写核心代码
    1. 实例化连接类,获取链接
    2. 连接成功则进入判断
    3. 拿到数据库中两个ip范围,和目标ip一起转换成LONG类型的数据,比较大小
    4. 如果目标ip在范围之内,则代表目标ip在这个地址
    5. 返回地址即可

代码如下

数据库配置文件properties

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3305/tledudayfour?useSSL=false
user = root
password = root

连接类

package zuoye;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

public class Conn {
    public Connection getConn() {
        try {
//            输入流读取properties的配置数据
            FileInputStream fileInputStream = new FileInputStream("2022-10-code/10-24/zuoye/jdbcpro.properties");
            Properties properties = new Properties();
//            load加载流到properties
            properties.load(fileInputStream);
//             注册驱动
            Class.forName(properties.getProperty("driver"));
//             返回连接
            return DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("user"), properties.getProperty("password"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

测试类

package zuoye;

import java.util.Scanner;

public class TestSearch {
    public static void main(String[] args) {
//        创建查找ip的对象
        SelectIp selectIp = new SelectIp();
        
//        监控输入,对ip格式进行校验
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入你要查的ip");
        String s = scanner.nextLine();
        System.out.println(s);
//        匹配ip的正则表达式
        String REGEX = "\\d{1,3}+\\.+\\d{1,3}+\\.+\\d{1,3}+\\.+\\d{1,3}";
        boolean matches = s.matches(REGEX);
        if (matches) {
            System.out.println("校验成功,准备查找");
            //成功校验之后,进入数据库匹配
            selectIp.getIp(s);
        } else {
            System.out.println("校验失败,重新输入");
        }
    }
}

核心代码

package zuoye;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SelectIp {
    public void getIp(String ip) {
        //创建连接对象
        Conn conn = new Conn();

        //jdbc三件套
        Connection conns = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        //通过对象调用方法获取连接
        conns = conn.getConn();

        //如果连接成功(非空)则进入逻辑
        if (conns != null) {
            System.out.println("正在查找");
            String sql = "select * from ip_location_relation";
            try {
                //预编译sql执行对象,执行sql
                preparedStatement = conns.prepareStatement(sql);
                //返回查询到的结果集合
                resultSet = preparedStatement.executeQuery();
                //循环对每个结果进行判断
                while (resultSet.next()) {
                    //ip最小范围
                    String pre = resultSet.getString("prefix");
                    //ip最大范围
                    String suf = resultSet.getString("suffix");
                    //ip对应的地址
                    String location = resultSet.getString("location");
                    
                    //核心思路
                    //最小范围转化为long类型的数值
                    String[] presplit = pre.split("\\.");
                    Long prelong = (Long.parseLong(presplit[0]) << 24) + (Long.parseLong(presplit[1]) << 16) +
                            (Long.parseLong(presplit[2]) << 8) + Long.parseLong(presplit[3]);
                    //最大范围转化为long类型的数值
                    String[] sufsplit = suf.split("\\.");
                    Long suflong = (Long.parseLong(sufsplit[0]) << 24) + (Long.parseLong(sufsplit[1]) << 16) +
                            (Long.parseLong(sufsplit[2]) << 8) + Long.parseLong(sufsplit[3]);
                    //要查询的ip转化为long类型的数值
                    String[] ipsplit = ip.split("\\.");
                    Long iplong = (Long.parseLong(ipsplit[0]) << 24) + (Long.parseLong(ipsplit[1]) << 16) +
                            (Long.parseLong(ipsplit[2]) << 8) + Long.parseLong(ipsplit[3]);
                    
                    //判断目标ip是否在这个范围内
                    if (iplong >= prelong && iplong <= suflong) {
                        System.out.println("你要找的地区是" + location);
                    }
                }
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }finally {
                try {
                    //关闭资源
                    if (resultSet != null) {
                        resultSet.close();
                    }
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                    conns.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }

        } else {
            System.out.println("连接失败,请检查你的账号密码");
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值