都是关于面向对象的,http://bbs.csdn.net/topics/390528973 http://bbs.csdn.net/topics/390536618
花了点时间给两个楼主解答,同时希望初学者少走弯路,不要在为“面向对象”而面向对象,要提前理解JavaBean+DAO的模式(简单的说,就是把数据和方法完全分离;如果实在还不理解,就回忆下C语言的"结构体+函数式"编程的思想,面向过程你能理解吧,换了个更简单的面向对象怎么就纠结了?),简化今后的编程,加快JavaSE学习的速度。
为什么现在有泛型,为什么有反射,为什么有纯POJO?这些思想就是要让你的“数据”和“操作”完全分离;类似于“冰箱具有--开打、关闭方法,汽车具有--行驶、刹车方法”的代码绝对绝对不能再出现在Pojo当中了!
以后谁再写以下这种2B代码你们项目经理跟你没完!package beantest.bean;
/**
*冰箱
*
*/
public class Fridge {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 冰箱具有打开的行为
*/
public void open(){
System.out.println("打开"+name);
}
/**
* 冰箱具有关闭的行为
*/
public void close(){
System.out.println("关闭"+name);
}
}企业级的设计思路有MVC以及SSH框架的单例、代理、Aop等等,
但面向对象基本上只有Dao+JavaBean,没有其他;连继承都很少,纵观马士兵、张孝祥、韩顺平的SSH视频,只找到两个:HibernateTemplate、ActionSupport而已;所以,如果初学者再过分的纠结于所谓的抽象、封装、继承、多态,只会耽误学习Java的进度!
比如一个帖子问到:
老王和老李是夫妻。老王是一名大学教授,老李是一名会计,他们的父母都健在。老王和老李有一个儿子,15岁了,在上中学。老王有时候去打太极拳,老李有时候去兼职讲课。用OO的思想描述他们的关系 可以这样解答,诸位可能有更加优美的代码,但设计思路在20年之内是不会变的。
下面是项目的包结构:
db里边是数据库(我们现在用List代替真正的数据库)
bean包里边是实体(习惯上称为JavaBean、POJO、Entity等等)
dao包里边是增删改查的类(对一个数据的基本操作就是CRUD)
logic包是业务逻辑层(如:判断两人是否是夫妻,判断父母是否健在等等)
util包用于存放:数据字典以及一些常用的正则、IO、日期的工具类
package beantest.bean;
/**
*爱好
*
*/
public class Hobby {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 名称
*/
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Hobby(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Hobby [id=" + id + ", name=" + name + "]";
}
}
package beantest.bean;
/**
* 职业
*/
public class Job {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 名称
*/
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Job(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Job() {
super();
}
@Override
public String toString() {
return "Job [id=" + id + ", name=" + name + "]";
}
}
package beantest.bean;
import java.util.List;
/**
* 人
*/
public class Person {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 姓名
*/
private String name;
/**
* 性别 1-男 2-女
*/
private int male;
/**
* 年龄
*/
private int age;
/**
* 是否在世
*/
private boolean isLive;
/**
* 父亲id引用 -1表示不存在
*/
private int fatherId;
/**
* 母亲id引用 -1表示不存在
*/
private int motherId;
/**
* 爱人的id引用 -1表示不存在
*/
private int loverId;
/**
* 职业的id引用 -1表示不存在
*/
private int jobId;
/**
* 由于可以有多个爱好,所以一个人拥有爱好ID的集合
*/
private List<Integer> hobbyList;
public List<Integer> getHobbyList() {
return hobbyList;
}
public void setHobbyList(List<Integer> hobbyList) {
this.hobbyList = hobbyList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMale() {
return male;
}
public void setMale(int male) {
this.male = male;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isLive() {
return isLive;
}
public void setLive(boolean isLive) {
this.isLive = isLive;
}
public int getFatherId() {
return fatherId;
}
public void setFatherId(int fatherId) {
this.fatherId = fatherId;
}
public int getMotherId() {
return motherId;
}
public void setMotherId(int motherId) {
this.motherId = motherId;
}
public int getLoverId() {
return loverId;
}
public void setLoverId(int loverId) {
this.loverId = loverId;
}
public int getJobId() {
return jobId;
}
public void setJobId(int jobId) {
this.jobId = jobId;
}
public Person() {
super();
}
public Person(int id, String name, int male, int age, boolean isLive,
int fatherId, int motherId, int loverId, int jobId) {
super();
this.id = id;
this.name = name;
this.male = male;
this.age = age;
this.isLive = isLive;
this.fatherId = fatherId;
this.motherId = motherId;
this.loverId = loverId;
this.jobId = jobId;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", male=" + male + ", age="
+ age + ", isLive=" + isLive + ", fatherId=" + fatherId
+ ", motherId=" + motherId + ", loverId=" + loverId + ", jobId="
+ jobId + "]";
}
}
package beantest.dao;
import java.util.List;
/**
*单表 CRUD的类
*/
public class BaseDao<T> {
/**
* 操作哪个表
*/
private List<T> table;
public BaseDao(List<T> table) {
super();
this.table = table;
}
/**
* 插入
*/
public void insert(T t){
table.add(t);
}
/**
* 查询
*/
public T query(int id){
return table.get(id);
}
/**
* 修改
*/
public void update(T t,int id){
table.set(id, t);
}
/**
* 删除
*/
public T delete(int id){
return table.remove(id);
}
}
package beantest.db;
import java.util.ArrayList;
import java.util.List;
import beantest.bean.Hobby;
import beantest.bean.Job;
import beantest.bean.Person;
import beantest.util.Dectionary;
/**
*数据库,每个数据库的记录的id从0开始
*
*/
public class DataBase {
public static List<Person> personDb=new ArrayList<Person>();
public static List<Job> jobDb=new ArrayList<Job>();
public static List<Hobby> hobbyDb=new ArrayList<Hobby>();
//初始化数据库并设置关联
static{
//初始化person数据库
Person p0=new Person(0, "老王的父亲", Dectionary.Male, 60, Dectionary.Live, -1, -1, 1,-1);
Person p1=new Person(1, "老王的母亲", Dectionary.Female, 60, Dectionary.Live, -1, -1, 0,-1);
Person p2=new Person(2, "老李的父亲", Dectionary.Male, 60, Dectionary.Live, -1, -1, 3,-1);
Person p3=new Person(3, "老李的父亲", Dectionary.Female, 60, Dectionary.Live, -1, -1, 2,-1);
Person p4=new Person(4, "老王", Dectionary.Male, 40, Dectionary.Live, 0, 1, 5,0);
Person p5=new Person(5, "老李", Dectionary.Female, 40, Dectionary.Live, 2, 3, 4,1);
Person p6=new Person(6, "儿子", Dectionary.Male, 15, Dectionary.Live, 4, 5, -1, 2);
personDb.add(p0); personDb.add(p1); personDb.add(p2); personDb.add(p3);
personDb.add(p4); personDb.add(p5); personDb.add(p6);
//初始化job数据库
Job job0=new Job(0, "教师");
Job job1=new Job(1, "会计");
Job job2=new Job(2, "上中学");
jobDb.add(job0);jobDb.add(job1);jobDb.add(job2);
//初始化hobby数据库
Hobby h0=new Hobby(0, "太极拳");
Hobby h1=new Hobby(0, "兼职讲课");
hobbyDb.add(h0);
hobbyDb.add(h1);
//设置爱好
List<Integer> wangList=new ArrayList<Integer>();
List<Integer> liList=new ArrayList<Integer>();
wangList.add(0);
liList.add(1);
p0.setHobbyList(wangList);
p1.setHobbyList(liList);
}
}JavaOOP 月经题初学者 面向对象
花了点时间给两个楼主解答,同时希望初学者少走弯路,不要在为“面向对象”而面向对象,要提前理解JavaBean+DAO的模式(简单的说,就是把数据和方法完全分离;如果实在还不理解,就回忆下C语言的"结构体+函数式"编程的思想,面向过程你能理解吧,换了个更简单的面向对象怎么就纠结了?),简化今后的编程,加快JavaSE学习的速度。
为什么现在有泛型,为什么有反射,为什么有纯POJO?这些思想就是要让你的“数据”和“操作”完全分离;类似于“冰箱具有--开打、关闭方法,汽车具有--行驶、刹车方法”的代码绝对绝对不能再出现在Pojo当中了!
以后谁再写以下这种2B代码你们项目经理跟你没完!package beantest.bean;
/**
*冰箱
*
*/
public class Fridge {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 冰箱具有打开的行为
*/
public void open(){
System.out.println("打开"+name);
}
/**
* 冰箱具有关闭的行为
*/
public void close(){
System.out.println("关闭"+name);
}
}企业级的设计思路有MVC以及SSH框架的单例、代理、Aop等等,
但面向对象基本上只有Dao+JavaBean,没有其他;连继承都很少,纵观马士兵、张孝祥、韩顺平的SSH视频,只找到两个:HibernateTemplate、ActionSupport而已;所以,如果初学者再过分的纠结于所谓的抽象、封装、继承、多态,只会耽误学习Java的进度!
比如一个帖子问到:
老王和老李是夫妻。老王是一名大学教授,老李是一名会计,他们的父母都健在。老王和老李有一个儿子,15岁了,在上中学。老王有时候去打太极拳,老李有时候去兼职讲课。用OO的思想描述他们的关系 可以这样解答,诸位可能有更加优美的代码,但设计思路在20年之内是不会变的。
下面是项目的包结构:
db里边是数据库(我们现在用List代替真正的数据库)
bean包里边是实体(习惯上称为JavaBean、POJO、Entity等等)
dao包里边是增删改查的类(对一个数据的基本操作就是CRUD)
logic包是业务逻辑层(如:判断两人是否是夫妻,判断父母是否健在等等)
util包用于存放:数据字典以及一些常用的正则、IO、日期的工具类
package beantest.bean;
/**
*爱好
*
*/
public class Hobby {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 名称
*/
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Hobby(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Hobby [id=" + id + ", name=" + name + "]";
}
}
package beantest.bean;
/**
* 职业
*/
public class Job {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 名称
*/
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Job(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Job() {
super();
}
@Override
public String toString() {
return "Job [id=" + id + ", name=" + name + "]";
}
}
package beantest.bean;
import java.util.List;
/**
* 人
*/
public class Person {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 姓名
*/
private String name;
/**
* 性别 1-男 2-女
*/
private int male;
/**
* 年龄
*/
private int age;
/**
* 是否在世
*/
private boolean isLive;
/**
* 父亲id引用 -1表示不存在
*/
private int fatherId;
/**
* 母亲id引用 -1表示不存在
*/
private int motherId;
/**
* 爱人的id引用 -1表示不存在
*/
private int loverId;
/**
* 职业的id引用 -1表示不存在
*/
private int jobId;
/**
* 由于可以有多个爱好,所以一个人拥有爱好ID的集合
*/
private List<Integer> hobbyList;
public List<Integer> getHobbyList() {
return hobbyList;
}
public void setHobbyList(List<Integer> hobbyList) {
this.hobbyList = hobbyList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMale() {
return male;
}
public void setMale(int male) {
this.male = male;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isLive() {
return isLive;
}
public void setLive(boolean isLive) {
this.isLive = isLive;
}
public int getFatherId() {
return fatherId;
}
public void setFatherId(int fatherId) {
this.fatherId = fatherId;
}
public int getMotherId() {
return motherId;
}
public void setMotherId(int motherId) {
this.motherId = motherId;
}
public int getLoverId() {
return loverId;
}
public void setLoverId(int loverId) {
this.loverId = loverId;
}
public int getJobId() {
return jobId;
}
public void setJobId(int jobId) {
this.jobId = jobId;
}
public Person() {
super();
}
public Person(int id, String name, int male, int age, boolean isLive,
int fatherId, int motherId, int loverId, int jobId) {
super();
this.id = id;
this.name = name;
this.male = male;
this.age = age;
this.isLive = isLive;
this.fatherId = fatherId;
this.motherId = motherId;
this.loverId = loverId;
this.jobId = jobId;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", male=" + male + ", age="
+ age + ", isLive=" + isLive + ", fatherId=" + fatherId
+ ", motherId=" + motherId + ", loverId=" + loverId + ", jobId="
+ jobId + "]";
}
}
package beantest.dao;
import java.util.List;
/**
*单表 CRUD的类
*/
public class BaseDao<T> {
/**
* 操作哪个表
*/
private List<T> table;
public BaseDao(List<T> table) {
super();
this.table = table;
}
/**
* 插入
*/
public void insert(T t){
table.add(t);
}
/**
* 查询
*/
public T query(int id){
return table.get(id);
}
/**
* 修改
*/
public void update(T t,int id){
table.set(id, t);
}
/**
* 删除
*/
public T delete(int id){
return table.remove(id);
}
}
package beantest.db;
import java.util.ArrayList;
import java.util.List;
import beantest.bean.Hobby;
import beantest.bean.Job;
import beantest.bean.Person;
import beantest.util.Dectionary;
/**
*数据库,每个数据库的记录的id从0开始
*
*/
public class DataBase {
public static List<Person> personDb=new ArrayList<Person>();
public static List<Job> jobDb=new ArrayList<Job>();
public static List<Hobby> hobbyDb=new ArrayList<Hobby>();
//初始化数据库并设置关联
static{
//初始化person数据库
Person p0=new Person(0, "老王的父亲", Dectionary.Male, 60, Dectionary.Live, -1, -1, 1,-1);
Person p1=new Person(1, "老王的母亲", Dectionary.Female, 60, Dectionary.Live, -1, -1, 0,-1);
Person p2=new Person(2, "老李的父亲", Dectionary.Male, 60, Dectionary.Live, -1, -1, 3,-1);
Person p3=new Person(3, "老李的父亲", Dectionary.Female, 60, Dectionary.Live, -1, -1, 2,-1);
Person p4=new Person(4, "老王", Dectionary.Male, 40, Dectionary.Live, 0, 1, 5,0);
Person p5=new Person(5, "老李", Dectionary.Female, 40, Dectionary.Live, 2, 3, 4,1);
Person p6=new Person(6, "儿子", Dectionary.Male, 15, Dectionary.Live, 4, 5, -1, 2);
personDb.add(p0); personDb.add(p1); personDb.add(p2); personDb.add(p3);
personDb.add(p4); personDb.add(p5); personDb.add(p6);
//初始化job数据库
Job job0=new Job(0, "教师");
Job job1=new Job(1, "会计");
Job job2=new Job(2, "上中学");
jobDb.add(job0);jobDb.add(job1);jobDb.add(job2);
//初始化hobby数据库
Hobby h0=new Hobby(0, "太极拳");
Hobby h1=new Hobby(0, "兼职讲课");
hobbyDb.add(h0);
hobbyDb.add(h1);
//设置爱好
List<Integer> wangList=new ArrayList<Integer>();
List<Integer> liList=new ArrayList<Integer>();
wangList.add(0);
liList.add(1);
p0.setHobbyList(wangList);
p1.setHobbyList(liList);
}
}JavaOOP 月经题初学者 面向对象
解决方案 »
- 如何提高长method的可读性?
- java调用shell命令 不能正确执行
- 我对java多维数组的理解
- 用JAVA如何实现写CSV文件
- 请问putvalue在这里有什么用?
- Runtime.exec()只在linux上执行命令,生成的文件总是默认放在了eclipse工程的根目录下?!
- 在j2se中查看URL所指向的链接,如何安装和启动is服务
- 悄悄地问:用JBuild8怎么连接ACCESS数据库?
- 给我出道中等难度的题!!
- 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
- 导入excel,批量将数据插入数据库的问题
- Document XML 取值问题
其中 UserDB, ProductDB 等属于dao; ConnectionPool,DBUtil,SQLUtil等属于db;
3.初始化数据库是用sql文件生成的,
Person p=personDao.query(personId);
for ( Integer i: p.getHobbyList()){
Hobby h=hobbyDao.query(i);
System.out.println(p.getName()+ " like"+ h.getName());
}
}lc.personDoSth(4);
lc.personDoSth(5); Hobby h0=new Hobby(0, " swiming");
Hobby h1=new Hobby(1, " part-time teacher");
Hobby h2=new Hobby(2, " baseball");
Hobby h3=new Hobby(3, " hiking");
hobbyDb.add(h0);
hobbyDb.add(h1);
hobbyDb.add(h2);
hobbyDb.add(h3);
List<Integer> wangList=new ArrayList<Integer>();
List<Integer> liList=new ArrayList<Integer>();
wangList.add(0);
liList.add(0);
liList.add(1);
liList.add(2);
p4.setHobbyList(wangList);
p5.setHobbyList(liList);
然后写BaseDao,只写基本的CRUD;再写每个实体的dao;
然后logic,logic调用dao;遇到复杂的查询,再回过头来在某个实体Dao里边写特定的SQL或HQL语句;
然后写main或junitTest测试logic的正确性;
最后再写Jsp和servlet。
Util包贯穿始终,比如写JavaBean的时候要定义常量,我们就去写
Dectionary;sql要用到日期和String的转换,我们就去写DateFormatUtil;页面要用到上传下载,我们就去写IOUtil;前台接收的参数要在servlet中判断合法性,如身份证、邮箱的验证等等,我们就需要去写RegExpUtil。
正常的开发过程中,
太感谢了,对照我的musicStore,很有感觉了。我的musicStore,logic 好象都是用servlet写的啊?
如果项目很赶时间,可以放在servlet中,如果是比较规范的项目,就尽量让servlet控制纯粹的跳转;比如最简单的“登录”程序,可以在servlet中这样写:String userName=request.getParameter("userName");
String password=request.getParameter("password");
UserInfo userInfo=userInfologic.login(userName,password);UserInfoLogic中这样写:public UserInfo login(String userName,String password){
UserInfo userInfo=userInfoDao.queryByUserNameAndPassword(userName,password);
return userInfo;
}
如果项目很赶时间,可以放在servlet中,如果是比较规范的项目,就尽量让servlet控制纯粹的跳转;比如最简单的“登录”程序,可以在servlet中这样写:String userName=request.getParameter("userName");
String password=request.getParameter("password");
UserInfo userInfo=userInfologic.login(userName,password);UserInfoLogic中这样写:public UserInfo login(String userName,String password){
UserInfo userInfo=userInfoDao.queryByUserNameAndPassword(userName,password);
return userInfo;
}
非常支持LZ分享了很好的东西,给大家!看到了这段代码,也想说两句。其实,分层是为了各司其职,提高代码可复用性。Dao(Data access Object)层,顾名思义,是对数据库访问的。此时,我们通过一个用户名和密码去dao中获取数据,其实是把业务逻辑放到了dao中处理。既然已经写了业务逻辑层,我认为,应该这样拆分代码:
1. Dao中,根据username获取一个userInfo对象(Dao层负责)
2. 判断UserInfo中的密码,跟请求中的密码是否一致(逻辑层负责)这样,针对按照用户名获取用户和按照用户名、密码获取用户,在应用的频率中,会有不同的。这是,个人的一点观点,希望跟大家交流~!
String password=request.getParameter("password");
UserInfo userInfo=userInfoDao.queryByUserNameAndPassword(userName,password);
只是一个文件组织的方法,可以考虑一下~至于代码,我上面已经说清楚我的思路了啊~Logic中,public UserInfo login(String userName,String password){
UserInfo userInfo=userInfoDao.queryByUserName(userName);
// 执行密码验证
checkPassword(password, userInfo.getPassword());
return userInfo;
}
此处是不是“父亲”应该改为“母亲”,不小心看到了,就提一下,望LZ见谅哈!楼主很给力!!!
super();
this.id = id;
this.name = name;
}
然后写BaseDao,只写基本的CRUD;再写每个实体的dao;
然后logic,logic调用dao;遇到复杂的查询,再回过头来在某个实体Dao里边写特定的SQL或HQL语句;
然后写main或junitTest测试logic的正确性;
最后再写Jsp和servlet。
Util包贯穿始终,比如写JavaBean的时候要定义常量,我们就去写
Dectionary;sql要用到日期和String的转换,我们就去写DateFormatUtil;页面要用到上传下载,我们就去写IOUtil;前台接收的参数要在servlet中判断合法性,如身份证、邮箱的验证等等,我们就需要去写RegExpUtil。
大学自己架构过项目,Util这一步学习了
1.logic 类如何定义? 一个实体对应一个? 当系统变大后,logic类的行数变多 2000- 3000 , 如何处理?
2.获取一个Person 是否成年的方法在logic里面还是在 Person里面?
3.javaBean 应该是指实现一类逻辑的 class?
2、PersonLogic里,或页面直接使用JSTL标签。
3、从目前不含EJB的系统来讲,javabean==pojo==entity;其他的叫做“组件component”。