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章的宠物商店程序修改为使用数据库保存全部的宠物信息,并可以实现关键字查找。)】
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)