JavaOO综合练习题目 -- 宠物管理系统

JavaOO综合练习题目 – 宠物管理系统

题目要求:

使用DAO模式开发宠物管理系统:

在该宠物系统中,宠物分为狗和企鹅两种。

狗的属性有:编号、名称、亲密值、健康值、品种、所属主人编号。

企鹅的属性有:编号、名称、亲密值、健康值、性别、所属主人编号。

该系统中主人可以领养宠物,主人的属性有:编号、用户名、密码、姓名、地址、电话。

要求将狗和企鹅的数据保存到同一张表中,除品种、性别和所属主人编号外,其余列均不允许为空。主人编号引用主人表中的编号列,主人编号为空表示该宠物未被人领养。

创建宠物表与主人表,狗和企鹅、主人各初始化5条以上的记录用于测试。

编写程序实现以下功能:

  1. 主人登录系统
  2. 查看当前系统中未被领养的宠物
  3. 领养宠物
  4. 查看自己已领养的所有宠物的信息
  5. 根据编号查询宠物信息
  6. 弃养自己已领养的宠物
  7. 退出系统

实现:

项目结构视图:

结构图

为了增强系统可扩展性,将数据库的配置以及DAO实现的信息都放入了xml配置文件中:

<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE configuration SYSTEM "config.dtd">

<configuration>
    <database>
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test" />
        <property name="user" value="root" />
        <property name="password" value="123456" />
    </database>
    <classes>
        <class name="masterDao" class="com.pet.dao.impl.MasterDaoImpl" />
        <class name="petDao" class="com.pet.dao.impl.PetDaoImpl" />
    </classes>
</configuration>

从xml文件中将配置信息读取到应用程序中:

Document document = null;
try {
    // 读取xml文件,创建Document对象
    document = reader.read(Thread.currentThread().getClass()
            .getResourceAsStream("/config/config.xml"));
} catch (DocumentException e) {
    throw new RuntimeException(e);
}

/* 读取数据库配置信息 */
List<?> list = document.selectNodes("//database/property");
for (Object object : list) {
    if (object instanceof Element) {
        Element elem = (Element) object;
        database.put(elem.attributeValue("name"),
                elem.attributeValue("value"));
    }
}

/* 读取类配置信息 */
list = document.selectNodes("//classes/class");
for (Object object : list) {
    if (object instanceof Element) {
        Element elem = (Element) object;
        classes.put(elem.attributeValue("name"),
                elem.attributeValue("class"));
    }
}

通过配置文件获取到数据库连接的驱动及连接字符串等信息:

driver = Configuration.getDatabaseProperty("driver");
url = Configuration.getDatabaseProperty("url");
user = Configuration.getDatabaseProperty("user");
password = Configuration.getDatabaseProperty("password");

对于Dao接口的实现类对象创建,使用反射机制完成,在配置文件中我们配置了Dao接口的实现类全限定名字符串,只需要在应用程序中根据配置获取该全限定名字符串即可创建对象:

/**
 * 根据类名标记获取类名全限定名并创建对象
 * 
 * @param nameRef
 *            类名标记名
 * @return 对象
 */
public static Object getInstance(String nameRef) {
    String className = Configuration.getClassFullName(nameRef);
    if (null != className && !"".equals(className.trim())) {
        try {
            return Class.forName(className).newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    return null;
}

主人收养宠物、弃养宠物都会修改宠物信息:

@Override
public void update(Pet pet) {
    // 存放更新的SQL语句
    StringBuilder builder = new StringBuilder();
    // 存放SQL语句中的'?'参数值
    List<Object> list = new ArrayList<Object>();
    builder.append("UPDATE pets SET name = ? , health = ?, love = ?");
    list.add(pet.getName());
    list.add(pet.getHealth());
    list.add(pet.getLove());
    if (pet instanceof Dog) { // 宠物狗,修改品种
        builder.append(", strain = ?");
        list.add(((Dog) pet).getStrain());
    } else if (pet instanceof Penguin) { // 宠物企鹅,修改性别
        builder.append(", sex = ?");
        list.add(((Penguin) pet).getSex());
    }
    if (pet.getMaster() != null) { // 宠物和主人关联,说明被主人领养
        builder.append(", master_id = ?");
        list.add(pet.getMaster().getId());
    } else { // 宠物和主人解除关联,说明被主人弃养
        builder.append(", master_id = NULL");
    }
    builder.append(" WHERE id=?"); // 追加修改宠物的主键条件
    list.add(pet.getId());

    JdbcUtil.executeUpdate(builder.toString(), list.toArray());
    JdbcUtil.close();
}

根据编号查询宠物信息,所查询到的宠物可能被领养,也可能未被领养,如果需要查询得到被领养的宠物及关联的主人信息,那就需要使用外联接查询:

String sql = "SELECT p.id, p.name, health, love, strain, sex, "
        + "master_id, username, password, m.name as master_name, "
        + "address, phone FROM pets p LEFT JOIN masters m "
        + "ON p.master_id=m.id WHERE p.id=?";

将数据查询出来后,得到ResultSet结果集,需要处理结果集,即映射结果集中的宠物信息与主人信息:

/**
 * 将结果集中宠物的列字段信息映射到宠物对象
 * 
 * @param rs
 *            结果集对象
 * @return 映射之后的宠物对象
 * @throws SQLException
 */
private Pet mappingPet(ResultSet rs) throws SQLException {
    Pet pet = null;
    int id = rs.getInt("id");
    String name = rs.getString("name");
    int health = rs.getInt("health");
    int love = rs.getInt("love");
    String sex = rs.getString("sex");
    String strain = rs.getString("strain");
    if (rs.wasNull()) // 品种列字段值为空,则为企鹅
        pet = new Penguin(id, name, health, love, sex);
    else
        pet = new Dog(id, name, health, love, strain);

    return pet;
}

/**
 * 将结果集中主人的列字段信息映射到主人对象
 * 
 * @param rs
 *            结果集对象
 * @return 映射后的主人对象
 * @throws SQLException
 */
private Master mappingMaster(ResultSet rs) throws SQLException {
    int masterId = rs.getInt("master_id");
    if (rs.wasNull()) { // 宠物主人编号为空,则说明未被主人领养,所以直接返回null
        return null;
    }
    return new Master(masterId, rs.getString("username"),
            rs.getString("password"), rs.getString("master_name"),
            rs.getString("phone"), rs.getString("address"));
}

在查询未被领养的宠物时,SQL语句中需要添加主人id为null的条件,注意SQL语句的书写:

// 未被领养宠物的SQL语句
String sql = "SELECT id, name, health, love, strain, sex FROM pets "
        + "WHERE master_id IS NULL";

运行效果:

登录:

登录成功

查询未被领养:

未被领养

领养:

领养

根据宠物编号查询宠物:

根据编号查询

查询自己已领养宠物:

自己领养

弃养自己的宠物:

弃养

完整代码:http://download.csdn.net/download/zhliro/8676905

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值