Я пишу приложение командной строки Java для поиска книг в библиотеке и вывода пользователю местоположения книги. Книги хранятся в базе данных MySQL, и весь доступ осуществляется через приложение Java. Я хочу, чтобы пользователи могли выполнять поиск по инвентарю с частичными названиями/isbn, аналогично тому, как панель поиска находится на этом веб-сайте. Если это возможно в java/mysql, я также хочу добавить функцию автозамены/заполнения, аналогичную тому, как Google исправляет опечатку в поиске. Я пробовал искать решения в Интернете, но не смог найти ничего похожего, возможно, из-за незнания правильных терминов.
Я рассматривал возможность использования приложения Java для поиска вместо MySQL. но подумал, что это будет слишком ресурсоемко, учитывая, что на сервере всего 8 ГБ оперативной памяти с i5 4-го поколения. Функции поиска будут доступны только зарегистрированным пользователям, но это я добавлю позже. Код приложения Java и базы данных MySQL приведен ниже. Заранее спасибо за ответы!
App.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Scanner;
class App {
public static void main(String[] args) {
Connection con = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://172.26.114.217:3306/mydb", "root", "1234");
} catch (Exception e) {
System.out.println("Database connection failed: " + e);
return;
}
Scanner scanner = new Scanner(System.in);
boolean isRunning = true;
boolean isAuthenticated = false;
String username = null;
while (isRunning) {
try {
if (!isAuthenticated) {
System.out.println("Select an option: 1. Signup 2. Login 3. Exit");
int choice = scanner.nextInt();
scanner.nextLine(); // Consume newline
switch (choice) {
case 1:
Helper.signup(con);
break;
case 2:
isAuthenticated = Helper.login(con);
if (isAuthenticated) {
System.out.println("Login successful.");
username = Helper.getUsername();
System.out.println("Welcome " + username);
Helper.readLastLogin(con, username);
}
break;
case 3:
isRunning = false;
break;
default:
System.out.println("Invalid choice. Please try again.");
}
} else {
System.out.println("Select an option: 1. Logout 2. Exit");
int choice = scanner.nextInt();
scanner.nextLine(); // Consume newline
switch (choice) {
case 1:
isAuthenticated = false;
System.out.println("Logged out successfully.");
break;
case 2:
isRunning = false;
break;
default:
System.out.println("Invalid choice. Please try again.");
}
}
} catch (Exception e) {
System.out.println("An error occurred: " + e);
scanner.nextLine(); // Consume newline if invalid input
}
}
scanner.close();
try {
if (con != null && !con.isClosed()) {
con.close();
}
} catch (Exception e) {
System.out.println("Failed to close the database connection: " + e);
}
}
}
Helper.java (содержит все функции входа и регистрации, функциональность библиотеки будет в другом классе)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
import java.io.Console;
public class Helper {
static Scanner s = new Scanner(System.in);
static Console cons = System.console();
private static String currentUsername;
public static boolean login(Connection con) {
System.out.println("Enter Username:");
String uname = s.nextLine();
System.out.println("Enter Password:");
String plainpass = readPasswordtoString();
String passhash = Password.makePass(plainpass);
try {
PreparedStatement loginstmt = con.prepareStatement("SELECT passhash FROM member WHERE uname = ?;");
loginstmt.setString(1, uname);
ResultSet loginrs = loginstmt.executeQuery();
if (loginrs.next()) {
if (loginrs.getString("passhash").equals(passhash)) {
currentUsername = uname;
writeLoginTime(con);
return true;
} else {
System.out.println("Invalid username or password.");
}
} else {
System.out.println("User not found.");
}
} catch (Exception e) {
System.out.println(e);
}
return false;
}
private static void writeLoginTime(Connection con) {
try {
PreparedStatement loginstampstmt = con.prepareStatement(
"UPDATE member SET lastlogin = ? WHERE uname = ?");
loginstampstmt.setString(1, timeStamp());
loginstampstmt.setString(2, currentUsername);
loginstampstmt.executeUpdate();
} catch (Exception e) {
System.out.println(e);
}
}
public static void readLastLogin(Connection con, String uname) {
try {
PreparedStatement loginreadstmt = con.prepareStatement("SELECT lastlogin FROM member WHERE uname = ?;");
loginreadstmt.setString(1, uname);
ResultSet loginreadrs = loginreadstmt.executeQuery();
if (loginreadrs.next()){
System.out.println("Last seen: " + (loginreadrs.getString("lastlogin")));
}
else{
System.out.println("First login, welcome!");
}
} catch (Exception e) {
System.out.println(e);
}
}
public static void signup(Connection con) {
System.out.println("Enter Username:"); // same as login
String uname = s.nextLine();
System.out.println("Enter First Name:");
String fName = s.nextLine();
System.out.println("Enter Last Name:");
String sName = s.nextLine();
boolean passMatch = false;
String plainpass;
do {
System.out.println("Enter Password:");
plainpass = readPasswordtoString();
System.out.println("Reenter Password:");
if (readPasswordtoString().equals(plainpass)) {
passMatch = true;
} else {
System.out.println("Passwords do not match!");
}
} while (!passMatch);
String passHash = Password.makePass(plainpass);
try {
PreparedStatement signupstmt = con.prepareStatement(
"INSERT INTO member (uname, fname, sname, passhash) VALUES (?, ?, ?, ?);");
signupstmt.setString(1, uname);
signupstmt.setString(2, fName);
signupstmt.setString(3, sName);
signupstmt.setString(4, passHash);
signupstmt.executeUpdate();
System.out.println("Signup complete, proceed to login.");
} catch (Exception e) {
System.out.println(e);
}
}
public static String getUsername() {
return currentUsername;
}
public static String timeStamp() {
return ZonedDateTime.now(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("uuuu.MM.dd.HH.mm.ss"));
}
private static String readPasswordtoString(){
char[] passchars = cons.readPassword();
return new String(passchars);
}
}
Password.java (исключительно для хеширования паролей)
import java.security.NoSuchAlgorithmException;
import java.security.MessageDigest;
public class Password {
private static String password = null;
private static String encryptedpassword = null;
public static String makePass(String plainpass) {
try {
/* MessageDigest instance for MD5. */
MessageDigest m = MessageDigest.getInstance("MD5");
password = plainpass;
/* Add plain-text password bytes to digest using MD5 update() method. */
m.update(password.getBytes());
/* Convert the hash value into bytes */
byte[] bytes = m.digest();
/*
* The bytes array has bytes in decimal form. Converting it into hexadecimal
* format.
*/
StringBuilder s = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
s.append(Integer.toString((bytes & 0xff) + 0x100, 16).substring(1));
}
/* Complete hashed password in hexadecimal format */
encryptedpassword = s.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return encryptedpassword;
}
}
Скрипт создания базы данных MySQL: (при необходимости можно загрузить модель):
-- MySQL Script generated by MySQL Workbench
-- Tue Jul 16 18:18:44 2024
-- Model: New Model Version: 1.0
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8mb3 ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`author`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`author` (
`idauthor` INT NOT NULL AUTO_INCREMENT,
`authorfname` VARCHAR(45) NOT NULL,
`authorsname` VARCHAR(45) NULL DEFAULT NULL,
PRIMARY KEY (`idauthor`),
UNIQUE INDEX `idauthor_UNIQUE` (`idauthor` ASC) VISIBLE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb3;
-- -----------------------------------------------------
-- Table `mydb`.`language`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`language` (
`idlang` INT NOT NULL AUTO_INCREMENT,
`languagename` VARCHAR(50) NOT NULL,
PRIMARY KEY (`idlang`),
UNIQUE INDEX `languagename_UNIQUE` (`languagename` ASC) VISIBLE,
UNIQUE INDEX `idlang_UNIQUE` (`idlang` ASC) VISIBLE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb3;
-- -----------------------------------------------------
-- Table `mydb`.`publisher`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`publisher` (
`idpublisher` INT NOT NULL AUTO_INCREMENT,
`publishername` VARCHAR(255) NOT NULL,
PRIMARY KEY (`idpublisher`),
UNIQUE INDEX `publishername_UNIQUE` (`publishername` ASC) VISIBLE,
UNIQUE INDEX `idpublisher_UNIQUE` (`idpublisher` ASC) VISIBLE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb3;
-- -----------------------------------------------------
-- Table `mydb`.`book`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`book` (
`idbook` INT NOT NULL AUTO_INCREMENT,
`bookname` VARCHAR(1024) NOT NULL,
`idauthor` INT NOT NULL,
`idtype` INT NULL DEFAULT NULL,
`genre` VARCHAR(45) NULL DEFAULT NULL,
`idlang` INT NOT NULL,
`pubyear` VARCHAR(45) NULL DEFAULT NULL,
`idpublisher` INT NULL DEFAULT NULL,
PRIMARY KEY (`idbook`),
UNIQUE INDEX `idbook_UNIQUE` (`idbook` ASC) VISIBLE,
INDEX `idauthor_idx` (`idauthor` ASC) VISIBLE,
INDEX `idlang_idx` (`idlang` ASC) VISIBLE,
INDEX `idpublisher_idx` (`idpublisher` ASC) VISIBLE,
CONSTRAINT `idauthor`
FOREIGN KEY (`idauthor`)
REFERENCES `mydb`.`author` (`idauthor`),
CONSTRAINT `idlang`
FOREIGN KEY (`idlang`)
REFERENCES `mydb`.`language` (`idlang`),
CONSTRAINT `idpublisher`
FOREIGN KEY (`idpublisher`)
REFERENCES `mydb`.`publisher` (`idpublisher`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb3;
-- -----------------------------------------------------
-- Table `mydb`.`member`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`member` (
`idmember` INT NOT NULL AUTO_INCREMENT,
`uname` VARCHAR(50) NOT NULL,
`fname` VARCHAR(255) NOT NULL,
`sname` VARCHAR(255) NOT NULL,
`passhash` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NULL DEFAULT NULL,
`phone` BIGINT NULL DEFAULT NULL,
`lastlogin` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`idmember`),
UNIQUE INDEX `idmember_UNIQUE` (`idmember` ASC) VISIBLE,
UNIQUE INDEX `uname_UNIQUE` (`uname` ASC) VISIBLE,
UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE,
UNIQUE INDEX `phone_UNIQUE` (`phone` ASC) VISIBLE)
ENGINE = InnoDB
AUTO_INCREMENT = 6
DEFAULT CHARACTER SET = utf8mb3;
-- -----------------------------------------------------
-- Table `mydb`.`loan`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`loan` (
`idmember` INT NOT NULL,
`takedate` DATE NOT NULL,
`idbook` INT NOT NULL,
`returndate` DATE NULL DEFAULT NULL,
PRIMARY KEY (`idmember`, `takedate`, `idbook`),
INDEX `idbook_idx` (`idbook` ASC) VISIBLE,
CONSTRAINT `idbook`
FOREIGN KEY (`idbook`)
REFERENCES `mydb`.`book` (`idbook`),
CONSTRAINT `idmember`
FOREIGN KEY (`idmember`)
REFERENCES `mydb`.`member` (`idmember`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb3;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Подробнее здесь: https://stackoverflow.com/questions/787 ... lar-to-a-s
Как выполнить поиск по нескольким столбцам в MySQL с частичным совпадением (?), Аналогично строке поиска? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Поиск pandas по нескольким столбцам возвращает один столбец, если совпадает
Anonymous » » в форуме Python - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как выполнить поиск по нескольким регулярным выражениям в одной строке?
Anonymous » » в форуме Python - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-