Я создаю библиотечную систему для школьного проекта.
При работе с большим приложением Java, один из способов упростить кодирование - использовать модель / просмотр / контроллер шаблон. Разделяя задачи, вы можете сосредоточиться на одной части приложения за раз.
Хорошо, я собираюсь сделать некоторые предположения. Давайте предположим, что в библиотеке есть книги.
Итак, давайте создадим класс для хранения книги. Этот класс является простым Java классом. Это не имеет никакого отношения к Swing или любому виду GUI. Это совершенно независимо. Мы называем это классом модели.
Этот класс является частью модели приложения. Будут другие классы для описания других аспектов библиотеки,
import java.util.ArrayList;
import java.util.List;
public class Book {
private final String title;
private final String isbn;
private List<String> author;
private List<String> genre;
public Book(String title, String isbn) {
this.title = title;
this.isbn = isbn;
this.author = new ArrayList<>();
this.genre = new ArrayList<>();
}
public String getTitle() {
return title;
}
public void addAuthor(String author) {
this.author.add(author);
}
public List<String> getAuthor() {
return author;
}
public String getIsbn() {
return isbn;
}
public void addGenre(String genre) {
this.genre.add(genre);
}
public List<String> getGenre() {
return genre;
}
}
В Java имена классов - TitleCase. Имена методов и имена полей являются camelCase.
Все в классе Book
связано с книгой. Чтобы получить коллекцию книг, мы создадим List<Book>
в другом классе моделей.
Книга имеет одно название. Это может иметь субтитры, но я решил не включать поле субтитров. Вы можете добавить поле субтитров, если хотите.
Книга имеет одного или нескольких авторов.
Книга имеет один код ISBN.
Книга может быть помещена в один или больше жанров.
Теперь нам все еще нужно моделировать посетителей. Это было бы логически Patron
классом.
import java.util.ArrayList;
import java.util.List;
public class Patron {
private String name;
private String address;
private String phoneNumber;
private List<Book> checkedOut;
public Patron(String name, String address, String phoneNumber) {
this.name = name;
this.address = address;
this.phoneNumber = phoneNumber;
this.checkedOut = new ArrayList<>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public List<Book> getCheckedOut() {
return checkedOut;
}
public void addCheckedOut(Book checkedOut) {
this.checkedOut.add(checkedOut);
}
public void removeCheckedOut(Book returned) {
this.checkedOut.remove(returned);
}
}
Я думаю, вы поняли модель приложения.
Во-первых, создайте полную модель приложения.
Во-вторых, из модели приложения создайте свой SQL таблицы. Создайте класс SQL
, который содержит весь код SQL. Я не видел достаточно вашего кода, чтобы создать для вас класс SQL
.
В-третьих, создайте Swing GUI. Вы можете использовать модели Swing по умолчанию для этого шага.
Вот один из моих SQL классов, чтобы дать вам представление о том, как вы должны кодировать свой SQL класс. Я использую MySQL. Вы всегда должны использовать подготовленные операторы для предотвращения SQL инъекционных атак .
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.amazon.ask.model.User;
import com.ggl.bible.reader.model.Book;
import com.ggl.bible.reader.model.Verse;
import com.ggl.bible.reader.model.VerseKey;
public class SQL {
private Connection connection;
public boolean connect() {
try {
String[] params = createConnectionStrings();
connection = DriverManager.getConnection(params[0],
params[1], params[2]);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
private String[] createConnectionStrings() {
String[] connection = new String[3];
String host = "bible-database.caaitaoyrsgp.us-east-1."
+ "rds.amazonaws.com";
String port = "3306";
String user = "ggleblanc";
String useSSL = "?useSSL=false";
String schema = "/bible";
String password = "******************";
String driver = "jdbc:mysql://" + host + ":" + port;
driver += schema + useSSL;
connection[0] = driver;
connection[1] = user;
connection[2] = password;
return connection;
}
public void close() {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public Optional<Timestamp> selectLastCreated() {
StringBuilder builder = new StringBuilder();
builder.append("SELECT `timestamp` ");
builder.append(" FROM `bible`.`lastCreated` ");
builder.append(" ORDER BY `timestamp` DESC ");
builder.append(" LIMIT 0, 1; ");
String sql = builder.toString();
try {
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql);
rs.next();
Optional<Timestamp> timestamp = Optional.of(
rs.getTimestamp(1));
rs.close();
return timestamp;
} catch (SQLException e) {
e.printStackTrace();
return Optional.empty();
}
}
public List<Book> selectBooks() {
List<Book> books = new ArrayList<>();
StringBuilder builder = new StringBuilder();
builder.append("SELECT `bookId`, `bookShortName`, ");
builder.append(" `bookName` ");
builder.append(" FROM `bible`.`book`; ");
String sql = builder.toString();
try {
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
int bookID = rs.getInt("bookID");
String bookShortName = rs.getString(
"bookShortName");
String bookName = rs.getString("bookName");
Book book = new Book(bookID, bookShortName,
bookName);
books.add(book);
}
rs.close();
return books;
} catch (SQLException e) {
e.printStackTrace();
return new ArrayList<Book>();
}
}
public int selectLastChapter(int bookID) {
StringBuilder builder = new StringBuilder();
builder.append("SELECT MAX(`chapter`) ");
builder.append(" FROM `bible`.`verse` ");
builder.append(" WHERE `bookID` = ? ");
String sql = builder.toString();
try {
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setInt(1, bookID);
ResultSet rs = statement.executeQuery();
rs.next();
int result = rs.getInt(1);
rs.close();
return result;
} catch (SQLException e) {
e.printStackTrace();
return -1;
}
}
public int selectLastVerse(int bookID, int chapter) {
StringBuilder builder = new StringBuilder();
builder.append("SELECT MAX(`verse`) ");
builder.append(" FROM `bible`.`verse` ");
builder.append(" WHERE `bookID` = ? ");
builder.append(" AND `chapter` = ? ");
String sql = builder.toString();
try {
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setInt(1, bookID);
statement.setInt(2, chapter);
ResultSet rs = statement.executeQuery();
rs.next();
int result = rs.getInt(1);
rs.close();
return result;
} catch (SQLException e) {
e.printStackTrace();
return -1;
}
}
public List<Verse> selectPassage(VerseKey startVerseKey,
VerseKey endVerseKey) {
List<Verse> verses = new ArrayList<>();
String[] sql = new String[2];
StringBuilder builder = new StringBuilder();
builder.append("SELECT `verseID` ");
builder.append(" FROM `bible`.`verse` ");
builder.append(" WHERE `bookID` = ? ");
builder.append(" AND `chapter` = ? ");
builder.append(" AND `verse` = ?; ");
sql[0] = builder.toString();
builder = new StringBuilder();
builder.append("SELECT `bookID`, `chapter`, `verse`, "
+ "`text` ");
builder.append(" FROM `bible`.`verse` ");
builder.append(" WHERE `verseID` BETWEEN ? AND ? ");
sql[1] = builder.toString();
try {
PreparedStatement statement =
connection.prepareStatement(sql[0]);
statement.setInt(1, startVerseKey.getBookID());
statement.setInt(2, startVerseKey.getChapter());
statement.setInt(3, startVerseKey.getVerse());
ResultSet rs = statement.executeQuery();
if (!rs.next()) {
rs.close();
return verses;
}
int startIndex = rs.getInt("verseID");
rs.close();
statement.setInt(1, endVerseKey.getBookID());
statement.setInt(2, endVerseKey.getChapter());
statement.setInt(3, endVerseKey.getVerse());
rs = statement.executeQuery();
if (!rs.next()) {
rs.close();
return verses;
}
int endIndex = rs.getInt("verseID");
rs.close();
statement = connection.prepareStatement(sql[1]);
statement.setInt(1, startIndex);
statement.setInt(2, endIndex);
rs = statement.executeQuery();
while (rs.next()) {
int bookID = rs.getInt("bookID");
int chapter = rs.getInt("chapter");
int verseNum = rs.getInt("verse");
String text = rs.getString("text");
Verse verse = new Verse(bookID, chapter,
verseNum, text);
verses.add(verse);
}
rs.close();
return verses;
} catch (SQLException e) {
e.printStackTrace();
return new ArrayList<Verse>();
}
}
public Optional<Verse> selectNextVerse(VerseKey verseKey) {
String[] sql = new String[2];
StringBuilder builder = new StringBuilder();
builder.append("SELECT `verseID` ");
builder.append(" FROM `bible`.`verse` ");
builder.append(" WHERE `bookID` = ? ");
builder.append(" AND `chapter` = ? ");
builder.append(" AND `verse` = ?; ");
sql[0] = builder.toString();
builder = new StringBuilder();
builder.append("SELECT `bookID`, `chapter`, "
+ "`verse`, `text` ");
builder.append(" FROM `bible`.`verse` ");
builder.append(" WHERE `verseID` = ? ");
sql[1] = builder.toString();
try {
PreparedStatement statement =
connection.prepareStatement(sql[0]);
statement.setInt(1, verseKey.getBookID());
statement.setInt(2, verseKey.getChapter());
statement.setInt(3, verseKey.getVerse());
ResultSet rs = statement.executeQuery();
if (!rs.next()) {
rs.close();
return Optional.empty();
}
int verseID = rs.getInt("verseID");
rs.close();
statement = connection.prepareStatement(sql[1]);
statement.setInt(1, verseID + 1);
rs = statement.executeQuery();
if (!rs.next()) {
rs.close();
return Optional.empty();
}
int bookID = rs.getInt("bookID");
int chapter = rs.getInt("chapter");
int verseNum = rs.getInt("verse");
String text = rs.getString("text");
Verse verse = new Verse(bookID, chapter,
verseNum, text);
rs.close();
return Optional.of(verse);
} catch (SQLException e) {
e.printStackTrace();
return Optional.empty();
}
}
public int selectVisitCount(User user) {
StringBuilder builder = new StringBuilder();
builder.append("SELECT `numberOfVisits` ");
builder.append(" FROM `bible`.`archive` ");
builder.append(" WHERE `userID` = ?; ");
String sql = builder.toString();
String userID = user.getUserId();
try {
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
if (!rs.next()) {
rs.close();
return -1;
}
int result = rs.getInt(1);
rs.close();
return result;
} catch (SQLException e) {
e.printStackTrace();
return -1;
}
}
public int[] selectPassageChapter(User user) {
StringBuilder builder = new StringBuilder();
builder.append("SELECT `passageBookID`, "
+ "`passageChapter`, ");
builder.append(" `passageVerse` ");
builder.append(" FROM `bible`.`archive` ");
builder.append(" WHERE `userID` = ?; ");
String sql = builder.toString();
String userID = user.getUserId();
try {
int[] output = {-1, -1, -1};
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
if (!rs.next()) {
rs.close();
return output;
}
output[0] = rs.getInt("passageBookID");
output[1] = rs.getInt("passageChapter");
output[2] = rs.getInt("passageVerse");
rs.close();
return output;
} catch (SQLException e) {
e.printStackTrace();
int[] output = {-1, -1, -1};
return output;
}
}
public int[] selectReadingChapter(User user) {
StringBuilder builder = new StringBuilder();
builder.append("SELECT `readingBookID`, "
+ "`readingChapter`, ");
builder.append(" `readingStartVerse`, "
+ "`readingEndVerse` ");
builder.append(" FROM `bible`.`archive` ");
builder.append(" WHERE `userID` = ?; ");
String sql = builder.toString();
String userID = user.getUserId();
try {
int[] output = {-1, -1, -1, -1};
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
if (!rs.next()) {
rs.close();
return output;
}
output[0] = rs.getInt("readingBookID");
output[1] = rs.getInt("readingChapter");
output[2] = rs.getInt("readingStartVerse");
output[3] = rs.getInt("readingEndVerse");
rs.close();
return output;
} catch (SQLException e) {
e.printStackTrace();
int[] output = {-1, -1, -1, -1};
return output;
}
}
public void insertArchiveRow(User user) {
StringBuilder builder = new StringBuilder();
builder.append("INSERT INTO `bible`.`archive` ");
builder.append(" (`archiveID`, `numberOfVisits`, ");
builder.append(" `readingBookID`, `readingChapter`, ");
builder.append(" `readingStartVerse`, "
+ "`readingEndVerse`, ");
builder.append(" `passageBookID`, ");
builder.append(" `passageChapter`, `passageVerse`, ");
builder.append(" `lastVisitTimeStamp`, `userID`) ");
builder.append("VALUES (DEFAULT, ?, ?, ?, "
+ "?, ?, ?, ?, ?, ");
builder.append(" CURRENT_TIMESTAMP, ?); ");
String sql = builder.toString();
String userID = user.getUserId();
try {
connection.setAutoCommit(false);
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setInt(1, 1);
statement.setInt(2, 0);
statement.setInt(3, 0);
statement.setInt(4, 0);
statement.setInt(5, 0);
statement.setInt(6, 0);
statement.setInt(7, 0);
statement.setInt(8, 0);
statement.setString(9, userID);
statement.executeUpdate();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void updateVisitCount(User user) {
StringBuilder builder = new StringBuilder();
builder.append("UPDATE `bible`.`archive` ");
builder.append("SET `numberOfVisits` = "
+ "`numberOfVisits` + 1, ");
builder.append(" `lastVisitTimestamp` = "
+ "CURRENT_TIMESTAMP ");
builder.append("WHERE `userID` = ? ");
String sql = builder.toString();
String userID = user.getUserId();
try {
connection.setAutoCommit(false);
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setString(1, userID);
statement.executeUpdate();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void updatePassageChapter(User user,
VerseKey verseKey) {
StringBuilder builder = new StringBuilder();
builder.append("UPDATE `bible`.`archive` ");
builder.append("SET `passageBookID` = ?, ");
builder.append(" `passageChapter` = ?, ");
builder.append(" `passageVerse` = ? ");
builder.append("WHERE `userID` = ? ");
String sql = builder.toString();
String userID = user.getUserId();
try {
connection.setAutoCommit(false);
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setInt(1, verseKey.getBookID());
statement.setInt(2, verseKey.getChapter());
statement.setInt(3, verseKey.getVerse());
statement.setString(4, userID);
statement.executeUpdate();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void updateReadingChapter(User user,
VerseKey verseKey, int endVerse) {
StringBuilder builder = new StringBuilder();
builder.append("UPDATE `bible`.`archive` ");
builder.append("SET `readingBookID` = ?, ");
builder.append(" `readingChapter` = ?, ");
builder.append(" `readingStartVerse` = ?, ");
builder.append(" `readingEndVerse` = ? ");
builder.append("WHERE `userID` = ? ");
String sql = builder.toString();
String userID = user.getUserId();
try {
connection.setAutoCommit(false);
PreparedStatement statement =
connection.prepareStatement(sql);
statement.setInt(1, verseKey.getBookID());
statement.setInt(2, verseKey.getChapter());
statement.setInt(3, verseKey.getVerse());
statement.setInt(4, endVerse);
statement.setString(5, userID);
statement.executeUpdate();
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
}