第17章练习4:将第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
	------------------------------ 
 * 
 */

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值