思路分析
- 定义连接类,连接数据库
- 定义properties,存放mysql信息
- 读取properties
- 注册驱动,获取连接
- 定义测试类,运行主程序
- 定义输入类,检测控制台输入
- 定义正则表达式,对输入的ip进行判断
- 判断通过则调用核心逻辑,判断出地址所在
- 反之报错(校验失败)
- 编写核心代码
- 实例化连接类,获取链接
- 连接成功则进入判断
- 拿到数据库中两个ip范围,和目标ip一起转换成LONG类型的数据,比较大小
- 如果目标ip在范围之内,则代表目标ip在这个地址
- 返回地址即可
代码如下
数据库配置文件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("连接失败,请检查你的账号密码");
}
}
}