关键词:
今天,我们要玩个大的!!!
我们把之前使用数组做的这个单身狗系统改版成数据库版本,并且使用面向对象里面的一些简单思想。如果有不知道这个系统的看官,请跳转到目录页,然后再选择单身狗系统(数组版)先围观五分钟吧。里面的功能很简单。。。。。。。。。
五分钟之后···
要完成的功能还是如上图所示,只不过实现的代码有翻天覆地的变化而已。。。
第一步:分析
一般做一个项目,根据侧重点不同,会把整个项目分成三大部分:界面、功能业务实现、数据库操作。具体三层架构的内容,等后面JSP的时候再来细讲哈。
所以首先要有三个不同的包来保存这三大部分的内容。
com.test:包含main方法的程序入口类放在这个包下。
com.dog.ui:界面相关的类文件放在这个包下。
com.dog.service:功能中的业务逻辑的处理放在这个包下。
com.dog.dao:和数据库打交道的类放在这个包下。
包分好了,我们再来分析要创建哪些类,根据引用顺序,ui要调用service,service要调用dao,而类与类之间的方法如何进行数据传递呢?一般使用实体类。所以我们还要再创建一个entity包存放所有的实体类。项目结构如下图:
昨天文章讲到了JDBC的常用操作分为两类,增、删、改是一样的操作,查询是一样的操作,所以我们可以再写一个通用操作类(DBManager),类中包含两个方法,分别用来操作数据和查询数据。最终的项目结构图如下:
分析过程就到这儿吧,下面进入编码环节。
二、编码
按照调用的先后顺序,我们先编写entity包中的实体类。
2.1 Dog类
public class Dog { private int did; //编号 private String nickname; //昵称 private int gender; //性别 private String outDate; //租出日期 private int state; //状态 public int getDid() { return did; } public void setDid(int did) { this.did = did; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getGender() { return gender; } public void setGender(int gender) { if(gender==1 || gender==0){ this.gender = gender; } else{ this.gender = 1; } } public String getOutDate() { return outDate; } public void setOutDate(String outDate) { this.outDate = outDate; } public int getState() { return state; } public void setState(int state) { if(state==1 || state==0){ this.state = state; } else{ this.state = 0; } } }
再编写dao包下面的类。
2.2 DBManager类是一个通用操作类,代码如下:
public class DBManage { static Connection con = null; static PreparedStatement ps = null; static ResultSet rs = null; //连接MySQL static String driver = "com.mysql.jdbc.Driver"; static String url = "jdbc:mysql://127.0.0.1:3306/singledogdb"; //创建连接对象 private static Connection getConnect(){ try { Class.forName(driver); con = DriverManager.getConnection(url,"root","root"); //连接mysql }catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return con; } //执行查询后返回ResultSet对象(不带参数) public static ResultSet getResultSet(String sql){ con = getConnect(); try { ps = con.prepareStatement(sql); rs = ps.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; } //执行查询后返回ResultSet对象(带参数) public static ResultSet getResultSet(String sql,Object[] params){ con = getConnect(); try { ps = con.prepareStatement(sql); for (int i = 0; i < params.length; i++) ps.setObject(i+1, params[i]); rs = ps.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; } //执行增、删、改操作,返回受影响的行数 public static int modifyEntiy(String sql, Object[] params){ int num = 0; con = getConnect(); try { ps = con.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i+1, params[i]); } num = ps.executeUpdate(); closeAll(); } catch (SQLException e) { e.printStackTrace(); } return num; } //关闭连接 public static void closeAll(){ if (ps != null){ try { ps.close(); ps = null; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con != null){ try { con.close(); con = null; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
后面主要使用getResultSet()方法和modifyEntiy()方法。
2.3 DogDao类代码如下:
public class DogDAO { //查询所有单身狗 public List<Dog> findAll(){ List<Dog> list = new ArrayList<Dog>(); String strSql = "select did,nickname,gender,DATE_FORMAT( outDate,‘%Y-%m-%d‘) outDate,state from dogtbl"; try { ResultSet rs = DBManage.getResultSet(strSql); while (rs.next()) { Dog dog = new Dog(); dog.setDid(rs.getInt("did")); dog.setNickname(rs.getString("nickname")); dog.setGender(rs.getInt("gender")); dog.setOutDate(rs.getString("outDate")); dog.setState(rs.getInt("state")); list.add(dog); } } catch (SQLException e) { e.printStackTrace(); } return list; } //新增 public int insert(Dog dog){ int result = 0; String strSql = "INSERT INTO dogTbl (did, nickname, gender ) VALUES (?, ?, ?)"; Object[] params = new Object[3]; params[0] = dog.getDid(); params[1] = dog.getNickname(); params[2] = dog.getGender(); result = DBManage.modifyEntiy(strSql, params ); return result; } //删除(result的值:-1.查无此狗 0.删除失败 1.删除成功) public int delete(int dogid){ int result = 0; String strSql = "select state from dogTbl where did=?"; Object[] params = new Object[1]; params[0] = dogid; //1.查询是否有该记录 ResultSet rs = DBManage.getResultSet(strSql, params); try { if(rs.next()){ int state = rs.getInt("state"); //2. 如果是未借出状态则可以删除 if(state==0){ strSql = "delete from dogTbl where did=? and state=0"; result = DBManage.modifyEntiy(strSql, params ); } } else{ result = -1; } } catch (SQLException e) { e.printStackTrace(); } return result; } //更新借出状态 public int update(Dog dog){ int result = 0; String strSql; //判断要更新的状态,同时更新借出日期 if(dog.getState()==1){ strSql = "update dogTbl set state=1,outdate=now() where did=?"; } else{ strSql = "update dogTbl set state=0,outdate=null where did=?"; } Object[] params = new Object[1]; params[0] = dog.getDid(); result = DBManage.modifyEntiy(strSql, params ); return result; } }
主要包括四个操作,添加、删除、更新借出状态和日期、查询所有。等所有功能实现后,小伙伴们可以自己尝试写一写搜索功能。
接下来编写service中的类。
2.4 DogService类
public class DogService { private DogDAO dogDAO = new DogDAO(); //数据访问对象 //查询所有 public List<Dog> findAll(){ return dogDAO.findAll(); } //添加 public int add(Dog dog){ return dogDAO.insert(dog); } //删除 public String delete(int dogid){ String msg = "删除成功!"; int result = dogDAO.delete(dogid); if(result==-1){ msg = "查无此狗"; } else if(result==0){ msg = "该单身狗已租出还未归还,不能删除!"; } return msg; } //借出 public int loan(Dog dog){ int result = 0; result = dogDAO.update(dog); return result; } //归还:是不是发现和借出的代码一样,这就对了,方法名不同,方便上层的人调用 public int repay(Dog dog){ int result = 0; result = dogDAO.update(dog); return result; } }
再接下来写UI包中的类
2.5 Face类
public class Face { // 因为在很多方法中都需要使用输入对象,所以定义到最外面,那么在每个方法中都可以使用了 private Scanner input = new Scanner(System.in); //创建业务逻辑对象 private DogService dogService = new DogService(); // 显示主菜单 public void mainMenu() { System.out.println("======================"); System.out.println(" 欢迎使用单身狗租赁系统"); System.out.println(" 1.查看"); System.out.println(" 2.新增"); System.out.println(" 3.删除"); System.out.println(" 4.借出"); System.out.println(" 5.归还"); System.out.println(" 6.退出"); System.out.println("======================"); // 注意,如果用户输入了1~6之外的数字,需要让他重新输入 int num = 6; do { System.out.print("请选择:"); num = input.nextInt(); switch (num) { case 1: show(); break; case 2: add(); break; case 3: delete(); break; case 4: loan(); break; case 5: repay(); break; case 6: System.out.println("客官,下次再来玩哟~!"); break; default: System.out.println("输入的啥玩意啊,我只认识1,2,3,4,5,6!!!"); break; } } while (num > 6 || num < 1); } //查看 public void show() { System.out.println("======================"); System.out.println("====>查看"); System.out.println(); showDog(); goMainMenu(); } //新增 public void add(){ System.out.println("======================"); System.out.println("====>添加"); System.out.println(); Dog dog = new Dog(); System.out.print("请输入昵称:"); dog.setNickname(input.next()); System.out.print("请选择性别(0.女|1.男):"); dog.setGender(input.nextInt()); //调用添加方法 dogService.add(dog); System.out.println("添加完毕!"); goMainMenu(); } //删除 public void delete(){ System.out.println("======================"); System.out.println("====>删除"); System.out.println(); System.out.print("请输入编号:"); int dogid = input.nextInt(); //调用删除方法 System.out.println(dogService.delete(dogid)); goMainMenu(); } //借出 public void loan(){ System.out.println("======================"); System.out.println("====>借出"); System.out.println(); showDog(); //显示所有单身狗(按道理应该在DAO包中的类编写一个find(state)方法来根据状态查询对应的记录,但我懒癌发作了,没办法···) System.out.print("请输入编号"); int no = input.nextInt(); //按道理,在这儿应该先根据ID查询出对应的记录,再判断这条记录中的借出状态之后再决定是否能借出,但···,懒癌继续发作中··· Dog dog = new Dog(); dog.setDid(no); dog.setState(1); if(dogService.loan(dog)>0){ System.out.println("借出成功!"); } else{ System.out.println("借出失败!"); } goMainMenu(); } //归还 public void repay(){ System.out.println("======================"); System.out.println("====>归还"); System.out.println(); showDog(); //显示所有单身狗(懒癌还在发作···) System.out.print("请输入编号"); int no = input.nextInt(); //懒癌持续发作中··· Dog dog = new Dog(); dog.setDid(no); dog.setState(0); if(dogService.repay(dog)>0){ System.out.println("归还成功!"); } else{ System.out.println("归还失败!"); } goMainMenu(); } //返回主菜单 public void goMainMenu(){ System.out.print("按任意键后回车返回主菜单:"); String in = input.next(); mainMenu(); } /** * 显示所有单身狗 */ private void showDog() { //查看时注意不要把数组中的空元素进行输出了 System.out.println("编号 昵称 性别 状态 借出日期"); System.out.println("==========================================="); List<Dog> list = dogService.findAll(); for (int i = 0; i < list.size(); i++) { Dog dog = list.get(i); System.out.println(dog.getDid()+" "+dog.getNickname()+" "+ (dog.getGender()==0?"女":"男") + " "+ (dog.getState()==0?"未借出":"已借出 "+ dog.getOutDate())); } System.out.println("==========================================="); } }
注意代码中有些方法的注释,大家如果要做完整版的,可以自行优化!!!
最后,main方法:
public static void main(String[] args) { // TODO Auto-generated method stub Face face = new Face(); face.mainMenu(); }
到这儿,所有的代码就编写完成了,测试过程如下:
今天有很多地方因为懒病发作,所以···,大家懂的,一个完整的流程,很多步骤都需要进行判断,看官中的小萌新们,你们就不要懒了,把该补完整的代码补上吧,之后就可以去比你更新的萌新面前得瑟了,哈哈哈!
“软件思维”博客地址:51CTO,博客园,感兴趣的小伙伴可以去看相关的其它博文。
本文出自 “软件思维” 博客,请务必保留此出处http://softi.blog.51cto.com/13093971/1967186
《java从入门到放弃》javase入门篇:集合
今天来讲讲Java中的集合和常见集合类型的使用。什么是集合呢?刚好最近学校里面军训,只听到教官一声喊:“集合!!!”各位小萌新们就屁颠屁颠的跑过来排列整齐了,这就是集合···650)this.width=650;"src="https://img.baidu.com/hi/... 查看详情
《java从入门到放弃》javase入门篇:单元测试
单元测试其实没什么好说的,直接看操作步骤!我们来测试前一篇的小明买食物的方法。第一步:在小明类上点右键,然后再new一个JUnitTestCase650)this.width=650;"src="https://s3.51cto.com/wyfs02/M02/A5/8D/wKioL1m_iAygNbgSAABZDwejGG4076.png"title="11.png"w... 查看详情
《java从入门到放弃》javase篇:数组
数组,就是一组数!!!之前我们学习的变量只能保存一个数据,如果一个部门有50个员工的姓名要保存,怎么办?如果定义50个变量··················Stringname1;Stringname2;............Stringname49;Stringname50;,这画面太美,我不... 查看详情
《java从入门到放弃》javase入门篇:面向对象语法一(入门版)
前一次简单说明了一下面向对象编程的概念,今天我们就把这些概念通过Java语法来实现,然后看看效果。来看第一个案例:定义女神类,再根据女神类创建三个女神对象,并使用女神对象的属性和方法。第一步:定义女神类(... 查看详情
《java从入门到放弃》javase入门篇:网络编程(入门版)
要进行网络编程,首先要搞清楚目的是什么。网络编程说简单点就是在网络上的计算机进行数据的交互。650)this.width=650;"src="https://s4.51cto.com/wyfs02/M00/07/18/wKiom1nDU8jBR29DAADRe0E88II285.png"title="11.png"width="600"height="328"border="0"hspace="0 查看详情
《java从入门到放弃》javase入门篇:面向对象语法二(入门版)
想了半天,发现单独的封装和多态没什么好讲的,我们就简单说说Java里面对应的语法吧。相关内容如下:一、访问修饰符二、getter/setter方法三、构造方法四、super和this五、static关键字六、final关键字七、方法重写八、抽象类和... 查看详情
《java从入门到放弃》javase篇:程序结构
程序的结构一般分为三种:顺序结构。选择结构。循环结构。一、顺序结构:这个不用多说吧,跟我们平时写文章的顺序一样,从上往下。650)this.width=650;"src="https://s3.51cto.com/wyfs02/M01/A2/70/wKioL1mf0MqwRCa0AAA_SnPBxrY664.png"title="11.png"style... 查看详情
《java从入门到放弃》javase篇:程序结构
程序的结构一般分为三种:顺序结构。选择结构。循环结构。一、顺序结构:这个不用多说吧,跟我们平时写文章的顺序一样,从上往下。650)this.width=650;"src="https://s3.51cto.com/wyfs02/M01/A2/70/wKioL1mf0MqwRCa0AAA_SnPBxrY664.png"title="11.png"style... 查看详情
《java从入门到放弃》javase篇:程序结构
程序的结构一般分为三种:顺序结构。选择结构。循环结构。 一、顺序结构:这个不用多说吧,跟我们平时写文章的顺序一样,从上往下。 二、选择结构:从名字就能看出,要选择嘛,到底是要漂亮滴妹子,还是要有钱... 查看详情
《java从入门到放弃》文章目录
...,等相关内容都写完后,再按学习顺序来整理。《Java从入门到放弃》入门篇:XMLHttpRequest的基本用法《Java从入门到放弃》入门篇:Struts2的基本访问方《Java从入门到放弃》入门篇:Struts2的基本访 查看详情
《java从入门到放弃》入门篇:变量
变量是什么玩意呢?变量,顾名思义就是能变化的量-- 好吧,举个栗子。图片上的各种餐具,就是变量,因为同一个盘子可以在不同的时间装不同的菜,在这一桌可以装土豆肉丝,在下一桌可以装清炒黄瓜(当然,这个盘... 查看详情
《java从入门到放弃》入门篇:hibernate查询——hql
不知不觉又到了hibernate的最后一篇了,只感觉时光飞逝~,岁月如梭~!转眼之间,我们就···························,好吧,想装个X,结果装不下去了,还是直接开始吧·650)this.width=650;"src="https://img.baidu.com/hi/jx2/j_00... 查看详情
《java从入门到放弃》入门篇:xmlhttprequest的基本用法
不闲扯,直接开讲。使用XMLHttpRequest对象,主要分为以下七个步骤:创建对象设置过期时间设置数据格式初始化HTTP请求设置HTTP头请求回传数据的处理发送HTTP请求对应代码如下所示<script type="text/javascript"> &nbs... 查看详情
java从入门到放弃·arraylist集合小练习
练习1(存储随机数字)题目:生成10个1~55之间的随机数,添加到集合中,并且遍历输出。先来解析一下这道题,给出思路1.需要存储10个整数,所以创建一个<Integer>的集合2.需要产生随机数,用到Random类3.产生10个随机数,使用... 查看详情
java从入门到放弃——01.java环境搭建
本文目标:下载与安装JDK配置Java环境 1、JDK9下载: 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase9-3934878.html 2、安装JDK: 打开安装包,除了下图可以取消公共JRE¹... 查看详情
《java从入门到放弃》入门篇:运算符
运算符分为运算和符。运算:是一种行为,通过已知量的可能的组合,获得新的量。 符:上古时期,符是沟通人和神的秘密图案,所以符是不可以随便乱画的,故有所谓“画符不知窍,反惹鬼神笑;画符若知窍,惊得鬼神叫”... 查看详情
《java从入门到放弃》入门篇:运算符
运算符分为运算和符。运算:是一种行为,通过已知量的可能的组合,获得新的量。 符:上古时期,符是沟通人和神的秘密图案,所以符是不可以随便乱画的,故有所谓“画符不知窍,反惹鬼神笑;画符若知窍,惊得鬼神叫”... 查看详情
《java从入门到放弃》入门篇:hibernate基本配置
hibernate是个什么玩意呢?简单点说,就是别人写好的一套访问数据库的东东,底层其实就是JDBC。使用JDBC就像以前没有电饭煲,我们要自己根据经验,多少人煮多少米,放多少水,用多大的火,煮多长时间,整个过程都需要自己... 查看详情