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

题目要求:

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

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

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

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

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

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

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

编写程序实现以下功能:

主人登录系统

查看当前系统中未被领养的宠物

领养宠物

查看自己已领养的所有宠物的信息

根据编号查询宠物信息

弃养自己已领养的宠物

退出系统

实现:

项目结构视图:

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

从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 list = new ArrayList();

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";

运行效果:

登录:

查询未被领养:

领养:

根据宠物编号查询宠物:

查询自己已领养宠物:

弃养自己的宠物:

java实现宠物主人登录_JavaOO综合练习题目 -- 宠物管理系统相关推荐

  1. mysql实现宠物主人登陆的数据访问_使用DAO模式开发宠物管理系统

    http://www.cnblogs.com/hellokitty1/p/4489213.html 宠物有狗和企鹅. 狗的属性有:编号.名称.亲密值.健康值.品种.所属主人编号. 企鹅的属性有:编号. ...

  2. java毕业生设计医保局综合办公系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计医保局综合办公系统计算机源码+系统+mysql+调试部署+lw java毕业生设计医保局综合办公系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 ...

  3. 计算机毕业设计JAVA钢材销售平台登录mybatis+源码+调试部署+系统+数据库+lw

    计算机毕业设计JAVA钢材销售平台登录mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA钢材销售平台登录mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目 ...

  4. Java的反射机制 工厂模式综合讲解【转载自51CTO】

    2019独角兽企业重金招聘Python工程师标准>>> Java的反射机制 工厂模式综合讲解 1.什么叫反射 Java.lang.reflect包下 正常情况下我们可以通过类实例化一 ...

  5. java仿qq登录 界面设计,Java Swing仿QQ登录界面效果

    本文实例为大家分享了Java Swing仿QQ登录界面展示的具体代码,供大家参考,具体内容如下 闲来无事将早些时候已实现的QQ登录界面再实现了一遍,纯手工打造(意思是没有用NetBeans.MyEcl ...

  6. Java版本微信授权登录(测试版)

    这篇文章是对微信授权登录的一个测试版本,并不能直接在生产上使用,对于在生产上正式使用将会在下一篇中描述. 一,首先需要以下两个数据 appID和appsecret 如何获取这两个数据,请先登录微信公众 ...

  7. Java版本微信授权登录(升级版)

    前面写了一遍文章<Java版本微信授权登录(测试版)>,可以当做入门的基础文章,这里继续做一点深入,主要解决的是,如何在本地开发中微信授权以后跳转到本地启动的项目中. 我们知道了微信公众平 ...

  8. 【JAVA】网页版登录注册系统2.0

    前言 JAVA实现网页的登录与注册2.0版 一.环境的搭建 导入1.0版本的项目Java实现网页版登录注册系统-Java文档类资源-CSDN文库可参考[JAVA]网页版登录注册系统_Lx_Hy_的博客 ...

  9. 【JAVA】网页版登录注册系统

    目录 前言 一.环境的搭建 二.功能实现 1.登录功能 2.注册功能 [注意] 总结 前言 JAVA实现网页的登录与注册 一.环境的搭建 1.创建Maven Web工程,参考[JAVA]Web服务器- ...

最新文章

  1. 俞敏洪+摆脱恐惧+世界想让你做一个平凡的人、你信了吗
  2. Serverless 场景下 Pod 创建效率优化
  3. m5310模组数据上传至onenet_硬核干货!基于M5310-A的NB-IoT水表通信模块软件业务逻辑分享...
  4. javascript实现分页效果
  5. redis 使用案例
  6. .Net MVC中设置默认启动为某区域的视图
  7. Springboot druid 监控sql语句
  8. INSPINIA ADMIN 开发框架
  9. matlab在故障诊断中的应用,Matlab在发动机故障诊断中的应用研究
  10. Flex 绘制圆形或椭圆并填充图片
  11. 从GitHub火到了CSDN,共计1658页的《Java岗面试核心MCA版》
  12. 0基础学编程需要哪些基础?
  13. 系统体系结构-概念和框架
  14. Windows账户隐藏
  15. 头歌C++面向对象 - 类的多态性与虚函数
  16. 从英雄无极看中国电影的弊端与不确定未来
  17. TypeScript类
  18. Docker下载Tomcat镜像并运行Tomcat容器
  19. 思科 路由器密码破解
  20. 老紫竹的南大通用面试PPT文档下载

热门文章

  1. Thinkphp5.1 报错找不到 thinkphp/base.php
  2. Xiaohe-LeetCode 279 Perfect Squares
  3. calibre check
  4. Omni Recover for Mac(苹果手机数据恢复软件)
  5. 国税系统计算机代码变成a,美国国税局针对放弃美国国籍人士出台税责补救程序...
  6. android高仿苹果计算器,Android仿IOS计算器源码
  7. Android-百度地图定位实现仿钉钉签到打卡功能(附源码)
  8. 高通骁龙835:手机充电5分钟续航5小时
  9. The Standard C Library电子书pdf下载
  10. #2022年合肥市经开区信息学初中组竞赛试题题解#