JavaOO综合练习题目 -- 宠物管理系统
2015-05-08 17:23
435 查看
JavaOO综合练习题目 – 宠物管理系统
题目要求:使用DAO模式开发宠物管理系统:
在该宠物系统中,宠物分为狗和企鹅两种。
狗的属性有:编号、名称、亲密值、健康值、品种、所属主人编号。
企鹅的属性有:编号、名称、亲密值、健康值、性别、所属主人编号。
该系统中主人可以领养宠物,主人的属性有:编号、用户名、密码、姓名、地址、电话。
要求将狗和企鹅的数据保存到同一张表中,除品种、性别和所属主人编号外,其余列均不允许为空。主人编号引用主人表中的编号列,主人编号为空表示该宠物未被人领养。
创建宠物表与主人表,狗和企鹅、主人各初始化5条以上的记录用于测试。
编写程序实现以下功能:
主人登录系统
查看当前系统中未被领养的宠物
领养宠物
查看自己已领养的所有宠物的信息
根据编号查询宠物信息
弃养自己已领养的宠物
退出系统
实现:
项目结构视图:
为了增强系统可扩展性,将数据库的配置以及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
相关文章推荐
- Java Web开发-项目部分(中国移动科技综合管理系统)视频――私塾在线提供
- qq宠物管理系统(java)
- 系统集成资质培训 - 成本管理考前冲刺题目练习
- 办公管理系统(当初学的时候做练习的)jsp+servlet+javabean
- Java程序综合案例:教务处管理系统之学生档案管理模块
- Java GUI 实战练习 学生成绩管理系统
- Java-第二章-上机练习2我行我素购物管理系统
- 数据结构(JAVA版本)练习之集合 简易图书管理系统
- Java_Web之宠物管理系统
- C语言编程入门——综合练习(三)学生管理系统
- Java面向对象练习-电话本管理系统
- 黑马程序员——综合练习 学生信息管理系统
- 慕课网JAVA入门第二季综合练习答答租车系统
- JAVAWEB开发之Struts2示例——Struts2练习之员工管理系统
- Java练习 学生信息管理系统简版
- Java-单机版的书店管理系统(练习设计模块和思想_系列 一 )
- Java-单机版的书店管理系统(练习设计模块和思想_系列 一 )
- Java-单机版的书店管理系统(练习设计模块和思想_系列 二 )
- Java-单机版的书店管理系统(练习设计模块和思想_系列 二 )
- Java-单机版的书店管理系统(练习设计模块和思想_系列 三 )