11 KiB
11 KiB
Database Guidelines
MySQL data and DAO conventions for the library-management system.
Overview
MySQL is the project data layer. DAO classes perform CRUD and query operations
against MySQL. The initial scaffold schema exists at
src/main/resources/db/schema.sql; future module tables should follow the same
DDL style and DAO boundaries.
Core Tables
Use primary keys for every table and foreign keys for cross-entity integrity.
Implemented scaffold tables:
roles: administrator, librarian, reader, and future role definitions.permissions: permission definitions for protected actions.role_permissions: role-to-permission mapping.users: login accounts for administrator, librarian, and reader roles.system_logs: key operation logs, backup events, and exception traces.book_categories: category names and descriptions for catalog grouping.books: book information, category reference, inventory counts, and catalog status.
Planned module tables:
readers: reader profiles, borrowing eligibility, contact information.borrow_records: book-reader borrowing, return, renew, and overdue data.
Record new schema changes in src/main/resources/db/schema.sql and update this
spec with exact table names, key columns, and DAO/service contracts.
DAO Responsibilities
- DAOs own database CRUD and query details.
- Use parameterized SQL or prepared-statement style access; never concatenate raw request parameters into SQL.
- Keep transaction boundaries in the service layer for workflows that span multiple DAO calls, such as borrow/return operations that also update inventory status.
- Return entities or small query result objects to services, not HTML or servlet response objects.
- Keep MySQL connection details in
src/main/resources/db.propertiesloaded byJdbcUtil. The required keys aredb.driver,db.url,db.username, anddb.password.
Query Guidance
- Book search must support combined lookup by title, author, category, and ID.
- Statistics queries should cover borrowing rankings, inventory reports, and overdue reports.
- Borrowing records should preserve enough dates/status fields for borrow, return, renew, overdue calculation, and automatic collection status updates.
- Permission queries should support role-based checks for administrator, librarian, and reader workflows.
Integrity Constraints
books.category_idshould referencebook_categories.borrow_records.book_idshould referencebooks.borrow_records.reader_idshould referencereaders.- Administrator-role and role-permission mapping tables should use foreign keys to preserve authorization integrity.
users.role_codemust referenceroles.code.role_permissions.role_codemust referenceroles.code.role_permissions.permission_codemust referencepermissions.code.books.statusmust matchBookStatusenum codes:available,unavailable, andarchived.
Scenario: Book Catalog And Management Slice
1. Scope / Trigger
- Trigger: the first concrete business module introduced catalog search and basic book management across MySQL, DAO, service, Servlet, and JSP layers.
- Schema path:
src/main/resources/db/schema.sql. - JSP paths:
WEB-INF/jsp/books/catalog.jsp,books/manage.jsp, andbooks/form.jsp.
2. Signatures
- DAO signatures:
BookDao.findAllCategories(),BookDao.search(BookSearchCriteria criteria),findById(long id),findByIdentifier(String identifier),create(Book book),update(Book book), anddelete(long id). - Entity/search signatures:
Bookfields areid,identifier,title,author,categoryId,categoryName,totalCopies,availableCopies,status,createdAt, andupdatedAt;BookSearchCriteriafields areidentifier,title,author, and nullablecategoryId. - Service signatures:
BookService.listCategories(),searchBooks(BookSearchCriteria criteria),findBook(long id),createBook(AuthenticatedUser actor, Book book),updateBook(AuthenticatedUser actor, Book book), anddeleteBook(AuthenticatedUser actor, long id), all returningServiceResult<T>. - Read route:
GET /catalogwith optionalidentifier,title,author, andcategoryIdquery fields. - Management routes:
GET /books,GET /books/new,GET /books/edit?id=...,POST /books,POST /books/update, andPOST /books/delete. - Protected permissions:
/catalogrequiresVIEW_CATALOG;/books*requiresMANAGE_BOOKS. - DB signatures:
book_categories(id, name, description, created_at, updated_at), with unique keyuk_book_categories_name(name).books(id, book_identifier, title, author, category_id, total_copies, available_copies, status, created_at, updated_at), with unique keyuk_books_identifier(book_identifier), indexes on title, author, category, and status, foreign keyfk_books_category, and checks for non-negative copy counts and allowed status values.
3. Contracts
book_categories.nameis unique and displayed through category selectors.books.book_identifieris the unique user-facing book ID.books.category_idreferencesbook_categories.id.books.total_copiesandbooks.available_copiesare non-negative, and available copies cannot exceed total copies.books.statusstores the JavaBookStatuscode exactly.- Servlet controllers parse request fields and set JSP attributes such as
criteria,categories,books,book,statuses,errors,errorMessage, andsuccessMessage. ServiceResult<T>is the service-to-controller response contract:successful, nullabledata, nullablemessage, and field-levelerrors. Controllers must pass validation errors to JSPs so form/search redisplay can highlight the exact field, for exampleerrors.categoryId.- JSP pages render JavaBean properties only; they must not call DAOs or embed SQL.
4. Validation & Error Matrix
- Missing identifier, title, author, category, copy counts, or status -> return
to
books/form.jspwith field errors. - Negative total or available copies -> return a field error.
- Available copies greater than total copies -> return
Available copies cannot exceed total copies. - Duplicate
book_identifier-> return a field error onidentifier. - Reader or unauthenticated actor attempts write -> HTTP 403 through authorization filter or service denial.
- DAO failure during list/search/write -> log server-side details and return
Book service is temporarily unavailable. Please try again later. - Successful create/update/delete -> redirect to
/bookswith a short flash message.
5. Good/Base/Bad Cases
- Good: a librarian creates
BK-1002, sees it in/books, and readers can find it from/catalogwithout write controls. - Base: catalog search with no filters lists available records ordered by title, author, and identifier.
- Bad: a JSP opens JDBC, builds SQL from request parameters, or renders a stack trace from a failed DAO call.
6. Tests Required
- Run
BookServiceCheckor equivalent assertions for invalid inventory, duplicate identifiers, reader write denial, successful librarian CRUD, search, and DAO failure fallback. - Run
PermissionPolicyCheckto confirm readers lackMANAGE_BOOKSand retainVIEW_CATALOG. - Scan JSPs for scriptlets and SQL/JDBC references.
- When Maven/Tomcat dependencies are installed, run
mvn clean packageto compile Servlets and package JSP resources.
7. Wrong vs Correct
Wrong
books/form.jsp -> JDBC -> INSERT INTO books using request parameters
Correct
books/form.jsp -> BookManagementServlet -> BookService -> BookDao -> books
Scenario: Login And Permission Scaffold Schema
1. Scope / Trigger
- Trigger: the initial Java Web scaffold introduced a concrete MySQL schema and login contract.
- Schema path:
src/main/resources/db/schema.sql. - Example configuration path:
src/main/resources/db.properties.example.
2. Signatures
- DAO signature:
UserDao.findActiveByUsername(String username). - Service signature:
AuthService.authenticate(String username, String password). - Permission signature:
AuthService.hasPermission(AuthenticatedUser user, Permission permission). - Servlet route:
POST /loginwithusername,password, and optional same-applicationredirect. - Protected routes:
/dashboard,/admin/home,/librarian/home, and/reader/home. - Session keys:
authenticatedUser,userRole, anduserPermissions. - DB config keys:
db.driver,db.url,db.username, anddb.password. - Login tables:
roles,permissions,role_permissions,users, andsystem_logs.
3. Contracts
users.username: unique login identifier submitted byLoginServlet.users.password_hash: PBKDF2 hash inpbkdf2_sha256$iterations$saltBase64$hashBase64format.users.role_code: foreign key toroles.code; supported scaffold values areadministrator,librarian, andreader.users.active: only rows withactive = 1can authenticate.roles.code,permissions.code, androle_permissionsmust match the JavaRoleandPermissionenum codes exactly.db.propertiesmust be local configuration. Commitdb.properties.example, but do not commit real credentials.- Session state stores an
AuthenticatedUsersnapshot, role code, and permission-code set. It must not store raw passwords or DAO result objects with password hashes. - Login redirects must stay inside the current application context. Reject
values that do not start with a single
/or that contain CR/LF characters.
4. Validation & Error Matrix
- Missing username or password -> request returns to login JSP with
Username and password are required. - Unknown user, inactive user, or hash mismatch -> request returns to login JSP
with
Invalid username or password. - Unsafe or blank redirect -> ignore and route to
/dashboardafter success. - Missing
db.properties, JDBC failure, or unsupported role code -> request returns a generic service-unavailable message and logs server-side details. - Authenticated user missing a required permission -> HTTP 403 and
WEB-INF/jsp/auth/unauthorized.jsp.
5. Good/Base/Bad Cases
- Good:
adminresolves toadministrator, receives all scaffold permissions, and can access/admin/home. - Base:
readerresolves toreader, can access/reader/home, and cannot access/admin/home. - Bad: a JSP reads SQL or password hashes directly from the database. Keep that logic in DAO/service code.
6. Tests Required
- Compile service/DAO/entity/util classes with
javacwhen Maven is unavailable. - Run
PermissionPolicyCheckor equivalent assertions for administrator, librarian, and reader permissions. - Run
AuthServiceCheckor equivalent assertions for required-field failures, invalid credentials, success, permission checks, and DAO failure fallback. - When Maven/Tomcat dependencies are installed, run
mvn testormvn clean packageto compile Servlet and JSP integration.
7. Wrong vs Correct
Wrong
// JSP, Servlet, or session code opens JDBC and stores password_hash.
Correct
login.jsp -> LoginServlet -> AuthService -> UserDao -> users/roles tables
session -> AuthenticatedUser snapshot + role/permission codes only