第17章,第六题(将第6章的宠物商店程序修改为使用数据库保存全部的宠物信息,并可以实现关键字查找。)

package exercise17; 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.util.Scanner; /** * @ClassName: Ex04 * @Description 将第6章的宠物商店程序修改为使用数据库保存全部的宠物信息,并可以实现关键字查找。 * @author 叶青 * @date 2019年05月07日晚上23:05 * */ interface Pet {// 定义一个接口作为可以放入宠物商店到标准,只要是符合该标准的宠物都可以放入商店 public String getName(); public String getColor(); public int getAge(); public void setName(String name); public void setColor(String color); public void setAge(int age); }class Dog2 implements Pet {// 定义宠物狗的类,并实现Pet接口 private String name; private String color; private int age; public Dog2(String name, String color, int age) { this.name = name; this.color = color; this.age = age; } public String getName() { return this.name; } public String getColor() { return this.color; } public int getAge() { return this.age; } public void setName(String name) { this.name = name; } public void setColor(String color) { this.color = color; } public void setAge(int age) { this.age = age; } }class Cat implements Pet {// 定义宠物猫的类,并实现Pet接口 private String name; private String color; private int age; public Cat(String name, String color, int age) { this.name = name; this.color = color; this.age = age; } public String getName() { return this.name; } public String getColor() { return this.color; } public int getAge() { return this.age; } public void setName(String name) { this.name = name; } public void setColor(String color) { this.color = color; } public void setAge(int age) { this.age = age; } }/** * 创建一个专门用于操作数据库的类,实现宠物信息的插入、关键字查询、删除操作。 */ class DbOperater { private static final String DBDRIVER = "com.mysql.cj.jdbc.Driver"; private static final String DBURL = "jdbc:mysql://localhost:3306/test"; private static final String DBUSER = "root"; private static final String DBPASS = "mysqladmin"; private Connection conn; private PreparedStatement pstmt; public DbOperater() {// 在构造器中实现加载驱动、获得数据库连接、创建数据表。 try { Class.forName(DBDRIVER); conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); Statement stmt = conn.createStatement(); String sql1 = "drop table pet"; // 每次操作前都将原来的数据表删除 String sql2 = "create table if not exists pet(" + "id int auto_increment primary key," + "name varchar(30) not null," + "color varchar(30) not null," + "age int); "; stmt.execute(sql1); stmt.execute(sql2); stmt.close(); }catch(Exception e) { e.printStackTrace(); } }public void add(Pet pet) throws SQLException {// 向数据表中增加一条宠物信息 String sql = "insert into pet(name, color, age) values(?, ?, ?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, pet.getName()); pstmt.setString(2, pet.getColor()); pstmt.setInt(3, pet.getAge()); pstmt.executeUpdate(); pstmt.close(); }public void delete(int id) throws SQLException {// 根据宠物的编号从数据库中删除某个宠物 ResultSet rs = null; String sql = "select id, name, color, age from pet where id=?"; // 我们可以通过结果集来实现信息的删除,因此在获取结果集实例时加入两个常量参数,一个表示可以滚动,另一个表示可以更新。 pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); pstmt.setInt(1, id); rs = pstmt.executeQuery(); if (rs != null) { rs.absolute(1); // 因为查询出来的结果集中只有一条信息,因此只用将结果集中的指针指定到第一条即可。 rs.deleteRow(); // 删除信息 pstmt.close(); rs.close(); } }public void search(String keyword) throws SQLException { // 通过关键词查找宠物 ResultSet rs = null; String sql = "select * from pet where name like ? or color like ? or age like ?; "; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "%" + keyword + "%"); pstmt.setString(2, "%" + keyword + "%"); pstmt.setString(3, keyword); // Int类型的列也可以通过String类型来设置 rs = pstmt.executeQuery(); while (rs.next()) { System.out.print("编号:" + rs.getString(1) + "\t"); System.out.print("名称:" + rs.getString(2) + "\t"); System.out.print("颜色:" + rs.getString(3) + "\t"); System.out.println("年龄:" + rs.getInt(4)); System.out.println("------------------------"); } }public void print() throws SQLException {// 打印当前数据表中的所有宠物信息 String sql = "select id, name, color, age from pet; "; pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); System.out.print("编号:" + id + "\t"); String name = rs.getString("name"); System.out.print("名称:" + name + "\t"); String color = rs.getString("color"); System.out.print("颜色:" + color + "\t"); int age = rs.getInt("age"); System.out.println("年龄:" + age); System.out.println("------------------------------"); } } }/** * 定义宠物商店的类,用于存放、删除、查找宠物 */ class PetShop { private DbOperater o; // 数据库操作 private int num; // 记录宠物个数 public PetShop() throws Exception { this.o = new DbOperater(); this.num = 0; } public void addPet(Pet pet) { try { o.add(pet); num++; }catch(Exception e) { e.printStackTrace(); } } public void deletePet(int id) { try { o.delete(id); num--; }catch(Exception e) { e.printStackTrace(); } } public void searchPet(String keyword) { try { o.search(keyword); }catch(Exception e) { e.printStackTrace(); } } public int getNum() { return this.num; } public void show() { try { o.print(); }catch(Exception e) { e.printStackTrace(); } } }public class Ex04_PetShop {// 定义应用宠物商店的客户端 public static void main(String[] args) throws Exception { // TODO Auto-generated method stub] PetShop shop = new PetShop(); Scanner scann = new Scanner(System.in); shop.addPet(new Dog2("边境牧羊犬", "黑白相间", 2)); shop.addPet(new Dog2("贵宾犬", "浅棕色", 3)); shop.addPet(new Dog2("德国牧羊犬", "背部黑色,其余部位棕色", 3)); shop.addPet(new Cat("埃塞俄比亚猫", "灰色", 2)); shop.addPet(new Cat("阿比西尼亚猫", "棕色", 3)); shop.addPet(new Cat("埃及猫", "灰色并有黑色斑点", 3)); shop.addPet(new Dog2("欢欢", "黑色", 2)); // 商店已经存满了,所以该宠物将无法放入 System.out.println("目前商店总共有" + shop.getNum() + "只宠物。"); System.out.println("是否打印所有宠物信息(按'y'打印,按其他任意键不打印):"); String str = scann.nextLine(); if ("y".equals(str)) { shop.show(); } System.out.println("输入查询的关键字:"); str = scann.nextLine(); shop.searchPet(str); // 以关键词“黑”来查找符合条件的所有宠物System.out.println("请输入要删除的宠物编号:"); int id = scann.nextInt(); shop.deletePet(id); System.out.println("目前商店中剩余" + shop.getNum() + "只宠物。"); shop.show(); scann.close(); } }/** * 程序运行结果: 目前商店总共有7只宠物。 是否打印所有宠物信息(按'y'打印,按其他任意键不打印): y 编号:1 名称:边境牧羊犬 颜色:黑白相间 年龄:2 ------------------------------ 编号:2 名称:贵宾犬 颜色:浅棕色 年龄:3 ------------------------------ 编号:3 名称:德国牧羊犬 颜色:背部黑色,其余部位棕色 年龄:3 ------------------------------ 编号:4 名称:埃塞俄比亚猫 颜色:灰色 年龄:2 ------------------------------ 编号:5 名称:阿比西尼亚猫 颜色:棕色 年龄:3 ------------------------------ 编号:6 名称:埃及猫 颜色:灰色并有黑色斑点 年龄:3 ------------------------------ 编号:7 名称:欢欢 颜色:黑色 年龄:2 ------------------------------ 输入查询的关键字: 黑 编号:1 名称:边境牧羊犬 颜色:黑白相间 年龄:2 ------------------------ 编号:3 名称:德国牧羊犬 颜色:背部黑色,其余部位棕色 年龄:3 ------------------------ 编号:6 名称:埃及猫 颜色:灰色并有黑色斑点 年龄:3 ------------------------ 编号:7 名称:欢欢 颜色:黑色 年龄:2 ------------------------ 请输入要删除的宠物编号: 2 目前商店中剩余6只宠物。 编号:1 名称:边境牧羊犬 颜色:黑白相间 年龄:2 ------------------------------ 编号:3 名称:德国牧羊犬 颜色:背部黑色,其余部位棕色 年龄:3 ------------------------------ 编号:4 名称:埃塞俄比亚猫 颜色:灰色 年龄:2 ------------------------------ 编号:5 名称:阿比西尼亚猫 颜色:棕色 年龄:3 ------------------------------ 编号:6 名称:埃及猫 颜色:灰色并有黑色斑点 年龄:3 ------------------------------ 编号:7 名称:欢欢 颜色:黑色 年龄:2 ------------------------------ * */

【第17章,第六题(将第6章的宠物商店程序修改为使用数据库保存全部的宠物信息,并可以实现关键字查找。)】

    推荐阅读