1. ソート機能1. 各書籍のシリアル番号、タイトル、著者、価格、種類などの書籍情報を表現できます。
2. データベースを準備するユーザーテーブルとブックテーブルを作成する データベースが存在しない場合は作成します java100_bookmanager; java100_bookmanager を使用します。 ブックが存在する場合はテーブルを削除します。 // id を自動増分主キーとして設定します。create table book(id int primary key auto_increment,name varchar(20),author varchar(20),price int,type varchar(20),isBorrowed int); ユーザーが存在する場合はテーブルを削除します。 // また、userid を自動増分主キーとして設定し、ユーザー名が一意であることを確認します。create table user( userId int 主キー auto_increment, ユーザー名varchar(20) 一意、 パスワードvarchar(20)、 管理者整数 ); -- いくつかの本を挿入します insert into book values(null,'西遊記','呉承恩',10000,'古典小説',0); insert into book values(null,'三国志演義','羅貫中',10000,'古典小説',0); insert into book values(null,'水滸伝','世内庵',10000,'古典小説',0); insert into book values(null,'Jin Ping Mei','Lanling Xiao Xiao Sheng',10000,'Classical Novels',0); --ユーザーをいくつか挿入します insert into user values(null,'admin','123',1); ユーザーに値を挿入します(null、'zhangsan'、'123'、0); 3. データベースに関連するエンティティクラスの構築本パブリッククラスBooks { private int bookId;//書籍番号 private String name;//書籍タイトル private String author;//著者 private int price;//価格 private String type;//タイプ private boolean isBorrowed;//借用されているかどうか//設定 get メソッド public int getBookId() { bookIdを返します。 } パブリック void setBookId(int bookId) { this.bookId = ブックID; } パブリック文字列getName() { 名前を返します。 } パブリック void setName(文字列名) { this.name = 名前; } パブリック文字列 getAuthor() { 著者を返す; } パブリックvoid setAuthor(String author) { this.author = 著者; } パブリック int getPrice() { 返品価格; } パブリックvoid setPrice(int price) { this.price = 価格; } パブリック文字列getType() { 戻り値の型; } パブリック void setType(文字列型) { this.type = タイプ; } パブリックブール値isBorrowed() { isBorrowed を返します。 } パブリック void setBorrowed(boolean 借用) { isBorrowed = 借用済み; } @オーバーライド パブリック文字列toString() { "Book{" を返す + "bookId=" + ブックId + ", 名前='" + 名前 + '\'' + ", 著者='" + 著者 + '\'' + ", 価格=" + 価格 + ", タイプ='" + タイプ + '\'' + ", isBorrowed=" + isBorrowed + '}'; } ユーザーユーザーには一般ユーザーと管理者の2種類があります。管理者と一般ユーザーでは表示されるメニューが異なり、管理者と一般ユーザーのクラスメソッドも異なります。まず、抽象クラス User を定義し、一般ユーザー NoramlUser と管理者クラス Admin に User クラスを継承させます。 抽象パブリッククラスユーザー{ プライベート int ユーザーID; プライベート文字列userName; プライベート文字列passWord; IOperation[] operations; // ユーザー クラスに含まれるメソッドを示すメソッド配列 abstract int menu(); // 2 つのサブクラスは異なるメニューを参照するため、サブクラスは menu メソッドをオーバーライドする必要があります public void doOperation(int choice) { // このメソッドは、本の借り出しや返却などの操作を実行するために使用されます。 operations[choice].work(); } パブリックint getUserId() { ユーザーIDを返します。 } パブリックvoid setUserId(int userId) { this.userId = ユーザーID; } パブリック文字列 getUserName() { ユーザー名を返します。 } パブリックvoid setUserName(文字列userName) { this.userName = ユーザー名; } パブリック文字列 getPassWord() { パスワードを返します。 } パブリックvoid setPassWord(文字列passWord) { this.passWord = パスワード; } @オーバーライド パブリック文字列toString() { "user{" を返す + "ユーザーID=" + ユーザーID + ", ユーザー名='" + ユーザー名 + '\'' + ", パスワード='" + パスワード + '\'' + '}'; } } NormalUser クラスパブリッククラス NormalUser は user{ パブリックNormalUser(){ this.operations = new IOperation[]{//これらのメソッドを保存および実装するための別のパッケージを開きます。new ExitOperation(), //システムを終了します。new DisplayOperation(), //書籍リストを表示します。new FindOperation(), //書籍を検索します。new BorrowOperation(), //書籍を借ります。new ReturnOperation(), //書籍を返却します。}; } @オーバーライド public int menu(){//親クラスの menu メソッドをオーバーライドします System.out.println("========================="); System.out.println("ようこそ、「+this.getUserName()+」!"); System.out.println("1. 書籍リストを表示する"); System.out.println("2. 指定された本を見つける"); System.out.println("3. 本の借り方"); System.out.println("4. 本を返却する"); System.out.println("0. システムを終了します"); System.out.println("=========================="); System.out.println("オプションを入力してください"); スキャナー sc = 新しいスキャナー (System.in); int 選択 = sc.nextInt(); 選択肢を返す; } } 管理者クラス パブリッククラスAdminはuserを拡張します{ パブリック管理者(){ this.operations = 新しいIOperation[]{ new ExitOperation(), // システムを終了します new DisplayOperation(), // 本のリストを表示します new FindOperation(), // 本を検索します new AddOperation(), // 本を追加します new DelOperation(), // 本を削除します }; } @オーバーライド パブリック int メニュー() { System.out.println("=========================="); System.out.println("ようこそ,"+this.getUserName()+"あなたは管理者です!"); System.out.println("1. 書籍リストを表示する"); System.out.println("2. 指定された本を見つける"); System.out.println("3. 新しい本"); System.out.println("4. 書籍を削除する"); System.out.println("0. システムを終了します"); System.out.println("=========================="); System.out.println("オプションを入力してください"); スキャナー sc = new Scanner(System.in); int 選択 = sc.nextInt(); 選択肢を返す; } } 4. データベース関連操作のカプセル化
データベースリンク操作//ここでデータベース接続操作をカプセル化します public class DBUtil { // 個人設定に従って URL アカウントとパスワードを設定します private static final String URL="jdbc:mysql://127.0.0.1:3306/java100_bookmanager?characterEncoding=utf8&&useSSL=false"; プライベート静的最終文字列 USERNAME="root"; プライベート静的最終文字列 PASSWORD="q986681563"; //ハングリーマン モード//静的コード ブロックは、クラスの読み込みフェーズ中にインスタンス化のために呼び出されます/*private static DataSource dataSource=new MysqlDataSource(); 静的{ ((MysqlDataSource)dataSource).setUrl(URL); ((MysqlDataSource)dataSource).setUser(ユーザー名); ((MysqlDataSource)dataSource).setPassword(パスワード); }*/ // 遅延モード // getDataSource メソッドは最初にのみインスタンス化されます private static DataSource dataSource=null; パブリック静的データソース getDataSource() { if(データソース==null){ データソース = 新しいMysqlDataSource(); ((MysqlDataSource)dataSource).setUrl(URL); ((MysqlDataSource)dataSource).setUser(ユーザー名); ((MysqlDataSource)dataSource).setPassword(パスワード); } データソースを返します。 } パブリック静的Connection getConnection() はSQLExceptionをスローします { getDataSource().getConnection() を返します。 } public static void close(ResultSet resultSet, PreparedStatement statement,Connection connection){//リソースを解放する//コメントアウトされたメソッドの方が安全です/*if(resultSet!=null){ 試す { 結果セットを閉じます。 } キャッチ (SQLException e) { e.printStackTrace(); } } if(ステートメント!=null){ 試す { ステートメント.close(); } キャッチ (SQLException e) { e.printStackTrace(); } } if (接続!=null) { 試す { 接続を閉じます。 } キャッチ (SQLException e) { e.printStackTrace(); } }*/ 試す { resultSet が null の場合、 resultSet.close(); if(statement!=null) ステートメント.close(); 接続がnullの場合、接続を閉じます。 } キャッチ (SQLException e) { e.printStackTrace(); } } } ブックテーブルでの操作//DAO データ アクセス オブジェクト データ アクセス オブジェクト public class BookDAO { //1. 新しい本を追加する public boolean add(Books book){ 接続 connection=null; PreparedStatement ステートメント = null; 試す { 接続 = DBUtil.getConnection(); 文字列 sql="帳簿値に挿入(null,?,?,?,?,?)"; ステートメント=connection.prepareStatement(sql); ステートメント.setString(1,book.getName()); ステートメント.setString(2,book.getAuthor()); ステートメント.setInt(3,book.getPrice()); ステートメント.setString(4,book.getType()); ステートメント.setInt(5,book.isBorrowed()?1:0); int ret = ステートメント.executeUpdate(); if(ret!=1) は false を返します。 true を返します。 } キャッチ (SQLException e) { e.printStackTrace(); }ついに { DBUtil.close(null,ステートメント,接続); } false を返します。 } //2. すべての書籍を表示する public List<Books> selectAll(){ リスト<Books> list=new ArrayList<>(); 接続 connection=null; PreparedStatement ステートメント = null; 結果セット resultSet=null; 試す { 接続=DBUtil.getConnection(); 文字列 sql="select*from book"; ステートメント=connection.prepareStatement(sql); 結果セット=ステートメント.executeQuery(); while(resultSet.next()){ 本 book = new Books(); book.setBookId(resultSet.getInt("id")); book.setName(resultSet.getString("name")); book.setAuthor(resultSet.getString("著者")); book.setPrice(resultSet.getInt("price")); book.setType(resultSet.getString("type")); book.setBorrowed(resultSet.getInt("isBorrowed")==1); リストに本を追加します。 } } キャッチ (SQLException e) { e.printStackTrace(); }ついに { DBUtil.close(結果セット、ステートメント、接続); } リストを返します。 } //3. 名前で本を検索する public List<Books> selectByName(String name) { リスト<Books> list=new ArrayList<>(); 接続 connection=null; PreparedStatement ステートメント = null; 結果セット resultSet=null; 試す { 接続=DBUtil.getConnection(); 文字列 sql="select* from book where name=?"; ステートメント=connection.prepareStatement(sql); ステートメント.setString(1,名前); 結果セット=ステートメント.executeQuery(); while(resultSet.next()){ 本 book = new Books(); book.setBookId(resultSet.getInt("Id")); book.setName(resultSet.getString("name")); book.setAuthor(resultSet.getString("著者")); book.setType(resultSet.getString("type")); book.setPrice(resultSet.getInt("price")); book.setBorrowed(resultSet.getInt("isBorrowed")==1); リストに本を追加します。 } } キャッチ (SQLException e) { e.printStackTrace(); }ついに { DBUtil.close(結果セット、ステートメント、接続); } リストを返します。 } //4. 本を削除する public boolean delete(int bookId){ 接続 connection=null; PreparedStatement ステートメント = null; 試す { 接続=DBUtil.getConnection(); 文字列 sql="id=?" のブックから削除; ステートメント=connection.prepareStatement(sql); ステートメント.setInt(1,bookId); int ret = ステートメント.executeUpdate(); if(ret!=1) は false を返します。 true を返します。 } キャッチ (SQLException e) { e.printStackTrace(); }ついに { DBUtil.close(null、ステートメント、接続); } false を返します。 } //5. 本を借りる public boolean lendBook(int bookId){ 接続 connection=null; PreparedStatement ステートメント = null; PreparedStatement ステートメント2 = null; 結果セット resultSet=null; 試す { 接続=DBUtil.getConnection(); 文字列 sql="select * from book where id=?"; ステートメント=connection.prepareStatement(sql); ステートメント.setInt(1,bookId); 結果セット=ステートメント.executeQuery(); if(resultSet.next()){ ブール値 isBorrowed=(resultSet.getInt("isBorrowed")==1); if(isBorrowed){ System.out.println("この本は借りられており、再度借りることはできません! bookId="+bookId); false を返します。 } }それ以外{ System.out.println("書籍が存在しません bookId="+bookId); false を返します。 } sql="書籍セットを更新、isBorrowed=1、id=?"; ステートメント2 = connection.prepareStatement(sql); ステートメント2.setInt(1,bookId); int ret = ステートメント2.executeUpdate(); if(ret!=1) { System.out.println("借用に失敗しました"); false を返します。 } System.out.println("借用成功"); true を返します。 } キャッチ (SQLException e) { e.printStackTrace(); }ついに { if(結果セット!=null) { 試す { 接続を閉じます。 } catch (SQLException スロー可能) { throwables.printStackTrace(); } } if(ステートメント!=null) { 試す { ステートメント.close(); } catch (SQLException スロー可能) { throwables.printStackTrace(); } } if(ステートメント2!=null) { 試す { ステートメント2.close(); } catch (SQLException スロー可能) { throwables.printStackTrace(); } } if (接続!=null) { 試す { 接続を閉じます。 } catch (SQLException スロー可能) { throwables.printStackTrace(); } } } false を返します。 } //6. 戻り値 public boolean returnBook(int bookId){ 接続 connection=null; PreparedStatement ステートメント = null; PreparedStatement ステートメント2 = null; 結果セット resultSet=null; 試す { 接続=DBUtil.getConnection(); 文字列 sql="select* from book where id=?"; ステートメント=connection.prepareStatement(sql); ステートメント.setInt(1,bookId); 結果セット = ステートメント.executeQuery(); if(resultSet.next()){ ブール値 isBorrowed=(resultSet.getInt("isBorrowed")==1); if(!isBorrowed){ System.out.println("この本は借りられていないので返却する必要はありません bookId="+bookId); false を返します。 } }それ以外{ System.out.println("そのような本はありません! bookId="+bookId); false を返します。 } sql="書籍セットを更新、isBorrowed=0、id=?"; ステートメント2 = connection.prepareStatement(sql); ステートメント2.setInt(1,bookId); int ret = ステートメント2.executeUpdate(); if(ret!=1) は false を返します。 true を返します。 } キャッチ (SQLException e) { e.printStackTrace(); }ついに { if(結果セット!=null) { 試す { 接続を閉じます。 } catch (SQLException スロー可能) { throwables.printStackTrace(); } } if(ステートメント!=null) { 試す { ステートメント.close(); } catch (SQLException スロー可能) { throwables.printStackTrace(); } } if(ステートメント2!=null) { 試す { ステートメント2.close(); } catch (SQLException スロー可能) { throwables.printStackTrace(); } } if (接続!=null) { 試す { 接続を閉じます。 } catch (SQLException スロー可能) { throwables.printStackTrace(); } } } false を返します。 } } ユーザーテーブルに対する操作パブリッククラスUserDao{ //ユーザー名に基づいてパスワードを見つけるロジック //ユーザー名は一意の制約です public user selectByName(String name){ 接続 connection=null; PreparedStatement ステートメント = null; 結果セット resultSet=null; 試す { 接続=DBUtil.getConnection(); 文字列 sql="select* from user where username=?"; ステートメント=connection.prepareStatement(sql); ステートメント.setString(1,名前); 結果セット = ステートメント.executeQuery(); if(resultSet.next()){ ブール値 isAdmin=(resultSet.getInt("isAdmin")==1); ユーザー users=null; if(isAdmin){ ユーザー = 新しい Admin(); }そうでない場合、users=new NormalUser(); users.setPassWord(resultSet.getString("パスワード")); ユーザIDを設定します。 users.setUserName(resultSet.getString("ユーザー名")); ユーザーを戻す; } } キャッチ (SQLException e) { e.printStackTrace(); }ついに { DBUtil.close(結果セット、ステートメント、接続); } null を返します。 } } メインロジック(メインメソッドとログインメソッド)を記述するパブリッククラスMain { パブリック静的voidメイン(String[] args) { ユーザー users=login(); while(true){ int choice=users.menu(); users.doOperation(選択肢); } } プライベート静的ユーザーログイン(){ スキャナー sc = 新しいスキャナー (System.in); System.out.println("ユーザー名を入力してください"); 文字列名=sc.next(); System.out.println("パスワードを入力してください"); 文字列パスワード=sc.next(); UserDao を新規 UserDao() に追加します。 ユーザー users=userDao.selectByName(名前); if(users==null){ System.out.println("ログインに失敗しました!"); システム終了(0); } if(!users.getPassWord().equals(パスワード)){ System.out.println("パスワードが間違っています"); システム終了(0); } ユーザーを戻す; } } 操作のさまざまな詳細を記述しますすべての操作をパッケージに入れて、インターフェース操作を定義し、すべての操作がこのインターフェースを実装してメソッドをオーバーライドします。 パブリックインターフェースIOperation{ void 作業(); } ブックアクションの追加パブリッククラスAddOperationはIOperationを実装します{ @オーバーライド パブリックボイドワーク(){ System.out.println("新しい本!"); スキャナー sc = new Scanner(System.in); System.out.println("本のタイトルを入力してください"); 文字列名=sc.next(); System.out.println("著者を入力してください"); 文字列author = sc.next(); System.out.println("価格を入力してください"); int 価格 = sc.nextInt(); System.out.println("カテゴリを入力してください"); 文字列タイプ=sc.next(); 本 book = new Books(); book.setName(名前); book.setPrice(価格); book.setType(type); book.setAuthor(著者); BookDAO を新規作成します。 ブール値 ret = bookDAO.add(book); if(ret) System.out.println("正常に追加されました"); そうでない場合、System.out.println("追加に失敗しました"); } } 本の貸出業務パブリッククラスBorrowOperationはIOperationを実装します{ @オーバーライド パブリックボイドワーク(){ System.out.println("借りた本"); System.out.println("借りたい本のIDを入力してください"); スキャナー sc = 新しいスキャナー (System.in); int id = sc.nextInt(); BookDAO を新規作成します。 ブール値 ret = bookDAO.borrowBook(id); } } 書籍削除操作パブリッククラスDelOperationはIOperationを実装します{ @オーバーライド パブリックボイドワーク(){ System.out.println("書籍を削除します!"); スキャナー sc = new Scanner(System.in); System.out.println("削除する本のIDを入力してください"); int id = sc.nextInt(); BookDAO を新規作成します。 ブール値 ret = bookDAO.delete(id); if(ret) System.out.println("正常に削除されました"); そうでない場合、System.out.println("削除に失敗しました"); } } 書籍リストの表示操作パブリッククラスDisplayOperationはIOperationを実装します{ @オーバーライド パブリックボイドワーク(){ System.out.println("すべての書籍を表示"); BookDAO を新規作成します。 リスト<Books> list=bookdao.selectAll(); for(書籍 book:リスト){ System.out.println(本); } System.out.println("書籍の表示が完了しました"); } } 終了システム操作パブリッククラスExitOperationはIOperationを実装します{ @オーバーライド パブリックボイドワーク(){ System.out.println("プログラムを終了"); システム終了(0); } } 本を探す操作パブリッククラス FindOperation は IOperation を実装します{ @オーバーライド パブリックボイドワーク(){ System.out.println("名前で書籍を検索"); System.out.println("本のタイトルを入力してください"); スキャナー sc = new Scanner(System.in); 文字列名=sc.next(); BookDAO を新規作成します。 リスト<Books> books = bookDAO.selectByName(name); for(本 book:本){ System.out.println(本); } System.out.println("名前による書籍の検索が完了しました"); } } 本の返却業務パブリッククラスReturnOperationはIOperationを実装します{ @オーバーライド パブリックボイドワーク(){ System.out.println("本を返却してください!"); System.out.println("返却したい本のIDを入力してください"); スキャナー sc = 新しいスキャナー (System.in); int id = sc.nextInt(); BookDAO を新規作成します。 ブール値 ret = bookDAO.returnBook(id); if(ret){ System.out.println("成功しました"); }それ以外{ System.out.println("戻りに失敗しました"); } } } 概要: シンプルなライブラリ管理システム。実践を通じて、シンプルな JDBC 構文と API を習得できるほか、Java のポリモーフィック継承などの概念を理解するのにも役立ちます。 これで、MySQL の実践演習と簡単なライブラリ管理システムに関するこの記事は終了です。MySQL ライブラリ管理システムに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: DockerでRabbitMqの共通クラスタとミラークラスタを構築する詳細な操作
>>: HTML+CSS+JS でスタックカルーセル効果を実装するサンプルコード
データを挿入するとき、以前オフィス システムに取り組んでいたときにはデータベースのパフォーマンスにつ...
概要プロジェクトは正常に作成され、正常にデプロイされましたが、以下に示すように、Tomcat サーバ...
まずデータ テーブルを作成しましょう。 使用テスト; テーブル「従業員」を作成します( emp_no...
問題の説明今日、ページ スタイルを変更していたときに、子要素にmargin-top設定したのに、子要...
たった15行のCSSでiPhoneがクラッシュするWire のセキュリティ研究者 Sabri Had...
MySql でリモート接続を許可する方法この目標を達成するには、2つのことを行う必要がある。ユーザー...
Linux でディレクトリを切り替えるとなると、誰もが間違いなくcdコマンドを思い浮かべるでしょう。...
nohup コマンド: プロセスを実行しており、アカウントからログアウトしてもプロセスが終了しないと...
目次1. ステートメントを挿入する1.1 行を挿入する1.2 複数行を挿入する1.3 クエリステート...
Vue エコシステムには Vite と呼ばれる新しいビルド ツールがあり、Vue CLI よりも 1...
3つの仮想マシン132、133、134を群がらせる1. クラスターを初期化し、自分自身をクラスターに...
色はウェブサイト訪問者に影響を与えますか?数年前までは、ウェブサイトはまだ贅沢品でしたが、今ではほと...
フロントエンドの初心者として、私は数日間フロントエンドをいじってみました。 。今日、私は自分が固く信...
ディレクトリ構造 。 │ .env │ docker-compose.yml │ └─mysql ├...
高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Ngi...