Zadałeś pytanie w strasznie niejasny sposób, więc zacznę od krytyki kodu a potem bd myślał o co Ci chodzi.
Stosujesz bardzo niejasne nazewnictwo.
Scanner ksiazki = new Scanner(System.in);
Czemu skaner nazywa się książki?
Boolean ok = false;
Bardzo deskryptywna nazwa zmiennej, wszystko jasne na pierwszy rzut oka :D Po co klasa opakowująca, czemu nie zwykłe boolean?
insertKsiazka()
skoro już piszemy po polsku to czemu nie dodajKsiazke()?
księgozbiór()
metoda o takiej nazwie wyswietla dostepne ksiazki i umozliwia wypozycznie? Coś tu jest nie tak.
listaCzytelnikow()
Spodziewałbym się, że metoda o takiej nazwie albo zwróci listę czytelników, albo ja wypisze u Ciebie nic nie zwraca więc pewnie ja wypisuje (wtedy powinna się nazywać wyswietlListeCzytelnikow()). A ta metoda wypisuje liste czytelników a potem pozwala wyszukac konkretnego i ło matko i córko na końcu wywołuje metode księgozbiór, czyli ta metoda robi wszystko.
Kolejna sprawa to te do while w metodach. Po co do while a nie zwykłe while, a po drugie - w takiej aplikacji powinna być raczej jedna nieskończona pętla while, w której wywoływane metody się kończą. Jeśli wywoływanie metod biblioteki blokuje program nieskończoną pętlą to taka biblioteka praktycznie nie ma zastosowania, bo ktoś kto z niej korzysta od pewnego momentu nie moze juz nic zrobić.
Co do wykorzystania bazy danych to brakuje Ci odpowiedzi na to pytanie:
https://www.youtube.com/watch?v=sk6BzH_Htqg
:P. Skoro już używasz SQL'a to użyj jakichś relacji :P. Tabela wypozyczenia nie ma jakiegokolwiek polaczenia z ksiazkami i czytelnikami. Mozna tam wpisać dowolne id.
Nie do końca rozumiem pytanie. Ale myślę, że może Ci pomóc dzielenie programu na mniejsze metody:
Zrobić metodę tylko wyświetlającą liste książek/czytelników (będzie robiła to samo tylko bez dodatkowych opcji (przeskakiwania między metodami)) tylko wiąże się to z powtarzaniem kodu...
W jaki sposób? Właśnie przy pomocy takiej metody unikniesz potwarzania kodu.