大学JAVA课设难? 来

大学JAVA课设难? 来

学完Java后,老师让写个课设,不知如何下手?

大学学习java课需要学的东西

最基本的变量类型、运算符、Java强大的面向对象一套、Java的各种IO、JavaGUI、Java异常处理、多线程、网络编程、JDBC,差不多就这么多吧。

课设: 管理系统

我们先来说说管理系统,做这个东西我们需要考虑三点,第一点是数据保存,第二点是数据展示,第三点是用户的操作逻辑,这里包含一些个保存数据的Java类,比如说User的话,这个类里面有用户的一些信息

然后考虑技术:

1.是否使用网络

2.是否使用数据库

基于这两点,我们大约可以分为3类,难度依次递增

1.本地的文件的

2.本地的数据库的

3.网络的数据库的

数据的操作

我们可以把数据保存到文件,也可以保存到数据库

但是他们都有一个操作,增删改查

1.文件实现增删改查

实现办法一:文件一行保存一个数据,在程序启动时把数据读进来实例化成一个一个的Java对象,然后保存到一个列表里面,然后后面的增加,删除,修改,查找都是在操作这个列表中的数据,在程序关闭的时候把这个列表中的所有数据全部有重新写入到那个文件中就可以实现,但是有个缺点,耗费内存,因为程序运行的时候,所有管理的数据都在内存中。但是好像大学的管理系统只是个练习,没有那个多数据,而且这个好实现。

举个例子

Java 保存数据的类

publicclassUser{

    privateStringname;

    privateintage;

    privateStringsex;

.....getterandsetter

}

数据文件格式

李四#30#男

张三#100#女

操作数据的类

publicclassUserDao{

    privateList<User>users=newArrayList<User>();


    publicUserDao()throwsException{

        synchronized(UserDao.class) {

            Filefile=newFile("./dat/users.txt");

            FileReaderreader=newFileReader(file);

            BufferedReaderbReader=newBufferedReader(reader);

            Stringline=null;

            while((line=bReader.readLine())!=null) {

                Useruser=stringToUser(line);

                users.add(user);

            }

            bReader.close();

            reader.close();

        }

    }


    /**

    * 保存数据

    * @throws Exception

    */

    publicvoidclose()throwsException{

        Filefile=newFile("./dat/users.txt");

        FileWriterfileWriter=newFileWriter(file);

        BufferedWriterbufferedWriter=newBufferedWriter(fileWriter);

        for(inti=0;i<users.size();i++) {

            bufferedWriter.write(userToString(users.get(i)));

            bufferedWriter.newLine();

        }

        bufferedWriter.close();

        fileWriter.close();

    }


    /**

    * 查找

    * @param user

    * @return

    */

    publicList<User>query(Useruser){

        List<User>result=newArrayList<User>();

        for(inti=0;i<users.size();i++) {

            Userap=users.get(i);

            Usertmp=newUser(user.getName(),user.getAge(),user.getSex());

            if(tmp.getName()==null) {

                tmp.setName(ap.getName());

            }

            if(tmp.getAge()<0) {

                tmp.setAge(ap.getAge());

            }

            if(tmp.getSex()==null) {

                tmp.setSex(ap.getSex());

            }


            if(ap.equals(tmp)) {

                result.add(ap);

            }

        }

        returnresult;

    }


    /**

    * 删除

    * @param user

    * @return

    */

    publicintdelete(Useruser) {

        List<User>query=query(user);

        for(inti=0;i<query.size();i++) {

            users.remove(query.get(i));

        }

        returnquery.size();

    }


    /**

    * 增加

    * @param user

    * @return

    */

    publicintadd(Useruser) {

        returnusers.add(user)?1:0;

    }


    publicintupdate(Userold,Userupdate) {

        List<User>query=query(old);

        for(inti=0;i<query.size();i++) {

            users.remove(query.get(i));

            users.add(update);

        }

        returnquery.size();

    }


    privateStringuserToString(Useruser) {

        StringBufferbuffer=newStringBuffer();

        buffer.append(user.getName()+"#");

        buffer.append(user.getAge()+"#");

        buffer.append(user.getSex());

        returnbuffer.toString();

    }


    privateUserstringToUser(Stringstr) {

        String[]split=str.split("#");

        Useruser=newUser();

        user.setName(split[0]);

        user.setAge(Integer.parseInt(split[1]));

        user.setSex(split[2]);

        returnuser;

    }


}

实现办法二:

和方法以类似,数据每行保存一个数据,但是程序启动时不会把所有数据读到内存中,查找时候逐行读取,但是Java的流文件是顺序读取,不能修改某个地方,所以需要用到RandomAccessFile来随机读取修改文件,实现比上个难,优点,耗费内存小,但是速度慢,因为在不断的读取设备文件。

我们这里以更新为例子

    privateFilefile=newFile("./dat/users.txt");

    privateRandomAccessFileaccessFile=null;


    privateintlen=20;


    privatelongcurrent=0;


    publicRandomUserDao()throwsException{

        accessFile=newRandomAccessFile(file,"rw");

        accessFile.seek(0);

        current=accessFile.getChannel().size();

    }


    publicintupdate(Userold,Userupdate)throwsException{

        accessFile.seek(0);

        intread=0,count=0,up=0;

        byte[]data=newbyte[len];

        while( (read=accessFile.read(data))!=-1) {

            UsertoUser=stringToUser(newString(data,0,read).trim());

            if(toUser.equals(old)) {

                accessFile.seek(count);

                accessFile.write(userToString(update).getBytes());

                up++;

            }

            count+=len;

        }

        returnup;

    }

2.数据库的增删改查

对于数据库的操作,其重点在SQL语句上,所以我们可以把操作数据库的可以大约分为两类:不改数据(查询),改数据(增加,修改,删除)

可以将他封装

publicclassJdbcTemplate{

privatestaticJdbcTemplatejdbcTemplate;

privateStringurl=null;

privateStringusername=null;

privateStringpassword=null;

privateStringdriver=null;

/**

* 使用单例模式

* @return

*/

publicstaticJdbcTemplategetJdbcTemplate() {

synchronized(JdbcTemplate.class){

if(jdbcTemplate==null){

jdbcTemplate=newJdbcTemplate();

           }

       }

returnjdbcTemplate;

   }

privateJdbcTemplate(){

this.url=SystemConfiguration.getProperty("jdbc.url");

this.username=SystemConfiguration.getProperty("jdbc.username");

this.password=SystemConfiguration.getProperty("jdbc.password");

this.driver=SystemConfiguration.getProperty("jdbc.driver");

try{

Class.forName(this.driver);

}catch(ClassNotFoundExceptione) {

e.printStackTrace();

       }

   }

/**

* 获取连接

* @return

*/

publicConnectiongetConnection(){

try{

returnDriverManager.getConnection(url,username,password);

}catch(SQLExceptione) {

e.printStackTrace();

       }

returnnull;

   }

/**

* 查询 返回map列表

* @param sql

* @param params

* @return

* @throws SQLException

*/

publicList<Map<String,Object>>query(Stringsql,Object...params)throwsSQLException{

Connectionconnection=getConnection();

PreparedStatementstatement=connection.prepareStatement(sql);

if(params!=null){

for(inti=0;i<params.length;i++) {

statement.setObject(i+1,params[i]);

           }

       }

/**

* 获取表头

*/

ResultSetresultSet=statement.executeQuery();

ResultSetMetaDatameta=resultSet.getMetaData();

String[]header=newString[meta.getColumnCount()];

for(inti=0;i<meta.getColumnCount();i++) {

header[i]=meta.getColumnName(i+1);

       }

List<Map<String,Object>>result=newArrayList<Map<String,Object>>();

while(resultSet.next()){

Map<String,Object>map=newHashMap<String,Object>();

for(inti=0;i<header.length;i++) {

map.put(header[i],resultSet.getObject(i+1));

           }

result.add(map);

       }

resultSet.close();

statement.close();

connection.close();

returnresult;

   }

public<T>List<T>query(Stringsql,Class<T>cls,Object...params)throwsSQLException{

List<Map<String,Object>>query=query(sql,params);

List<T>result=newArrayList<T>();

for(inti=0;i<query.size();i++) {

try{

Tinstance=cls.newInstance();

Map<String,Object>map=query.get(i);

map.forEach((key,value)->{

try{

Fieldfield=instance.getClass().getDeclaredField(getStandardName(key));

field.setAccessible(true);

field.set(instance,value);

}catch(NoSuchFieldException|IllegalAccessExceptione) {

e.printStackTrace();

                   }

               });

result.add(instance);

}catch(Exceptione) {

e.printStackTrace();

           }

       }

returnresult;

   }

publicStringgetStandardName(Stringname){

returnname.replace("_","").toLowerCase();

   }

publicintmodify(Stringsql,Object...params)throwsSQLException{

Connectionconnection=getConnection();

PreparedStatementstatement=connection.prepareStatement(sql);

if(params!=null){

for(inti=0;i<params.length;i++) {

statement.setObject(i+1,params[i]);

           }

       }

returnstatement.executeUpdate();

   }

}

我们举个例子

   private JdbcTemplate jdbcTemplate;

   public PersonDao(){

       jdbcTemplate = JdbcTemplate.getJdbcTemplate();

   }

public List<Person>query(Map<String,Object>condition) {

       StringBuffer sql = new StringBuffer("select * from person where 1=1");

List<Object>objects = new ArrayList<Object>();

       condition.forEach((key,value)->{

           sql.append(" and "+key+"=?");

           objects.add(value);

       });

       System.out.println(sql);

List<Person>query = null;

       try {

           query = jdbcTemplate.query(sql.toString(), Person.class,objects.toArray());

       } catch (SQLException e) {

           e.printStackTrace();

       }

       return query;

   }

Java GUI

这个没有说的,界面可以参考我写的

一个完整的图书管理系统

需要代码的话

码云:https://gitee.com/soupcode/bookManager

CSDN: https://blog.csdn.net/weixin_41554210/article/details/105970406

网络

网络的话,需要把架构弄明白,每个用户通过套接字Socket连接,在每个用户连接到服务器的时候,服务器需要给这个用户分配一个线程去处理这个用户的请求

publicclassServer{

    publicstaticvoidmain(String[]args)throwsException{

        ServerSocketserverSocket=newServerSocket(8080);

        while(true) {

            Socketaccept=serverSocket.accept();

            InputStreaminputStream=accept.getInputStream();

            OutputStreamoutputStream=accept.getOutputStream();

            newThread() {

                @Override

                publicvoidrun() {

                    /**

                    * 这里需要处理业务

                    *

                    * 一般需要定义 发送信息的格式

                    * 比如说 客户端发过来

                    * adduser 张三 20 23

                    * 这里就会判断需要添加用户,去调用dao的添加用户

                    *

                    */

                }

            }.start();;


        }


    }


}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343