大學(xué)JAVA課設(shè)難盐捷? 來

大學(xué)JAVA課設(shè)難? 來

學(xué)完Java后默勾,老師讓寫個(gè)課設(shè)碉渡,不知如何下手?

大學(xué)學(xué)習(xí)java課需要學(xué)的東西

最基本的變量類型母剥、運(yùn)算符滞诺、Java強(qiáng)大的面向?qū)ο笠惶住ava的各種IO环疼、JavaGUI习霹、Java異常處理、多線程炫隶、網(wǎng)絡(luò)編程淋叶、JDBC,差不多就這么多吧伪阶。

課設(shè): 管理系統(tǒng)

我們先來說說管理系統(tǒng)煞檩,做這個(gè)東西我們需要考慮三點(diǎn)处嫌,第一點(diǎn)是數(shù)據(jù)保存,第二點(diǎn)是數(shù)據(jù)展示斟湃,第三點(diǎn)是用戶的操作邏輯熏迹,這里包含一些個(gè)保存數(shù)據(jù)的Java類,比如說User的話凝赛,這個(gè)類里面有用戶的一些信息

然后考慮技術(shù):

1.是否使用網(wǎng)絡(luò)

2.是否使用數(shù)據(jù)庫(kù)

基于這兩點(diǎn)注暗,我們大約可以分為3類,難度依次遞增

1.本地的文件的

2.本地的數(shù)據(jù)庫(kù)的

3.網(wǎng)絡(luò)的數(shù)據(jù)庫(kù)的

數(shù)據(jù)的操作

我們可以把數(shù)據(jù)保存到文件哄酝,也可以保存到數(shù)據(jù)庫(kù)

但是他們都有一個(gè)操作友存,增刪改查

1.文件實(shí)現(xiàn)增刪改查

實(shí)現(xiàn)辦法一:文件一行保存一個(gè)數(shù)據(jù),在程序啟動(dòng)時(shí)把數(shù)據(jù)讀進(jìn)來實(shí)例化成一個(gè)一個(gè)的Java對(duì)象陶衅,然后保存到一個(gè)列表里面屡立,然后后面的增加,刪除搀军,修改膨俐,查找都是在操作這個(gè)列表中的數(shù)據(jù),在程序關(guān)閉的時(shí)候把這個(gè)列表中的所有數(shù)據(jù)全部有重新寫入到那個(gè)文件中就可以實(shí)現(xiàn)罩句,但是有個(gè)缺點(diǎn)焚刺,耗費(fèi)內(nèi)存,因?yàn)槌绦蜻\(yùn)行的時(shí)候门烂,所有管理的數(shù)據(jù)都在內(nèi)存中乳愉。但是好像大學(xué)的管理系統(tǒng)只是個(gè)練習(xí),沒有那個(gè)多數(shù)據(jù)屯远,而且這個(gè)好實(shí)現(xiàn)蔓姚。

舉個(gè)例子

Java 保存數(shù)據(jù)的類

publicclassUser{

? ? privateStringname;

? ? privateintage;

? ? privateStringsex;

.....getterandsetter

}

數(shù)據(jù)文件格式

李四#30#男

張三#100#女

操作數(shù)據(jù)的類

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();

? ? ? ? }

? ? }


? ? /**

? ? * 保存數(shù)據(jù)

? ? * @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;

? ? }


}

實(shí)現(xiàn)辦法二:

和方法以類似,數(shù)據(jù)每行保存一個(gè)數(shù)據(jù)慨丐,但是程序啟動(dòng)時(shí)不會(huì)把所有數(shù)據(jù)讀到內(nèi)存中坡脐,查找時(shí)候逐行讀取,但是Java的流文件是順序讀取房揭,不能修改某個(gè)地方备闲,所以需要用到RandomAccessFile來隨機(jī)讀取修改文件,實(shí)現(xiàn)比上個(gè)難捅暴,優(yōu)點(diǎn)恬砂,耗費(fèi)內(nèi)存小,但是速度慢蓬痒,因?yàn)樵诓粩嗟淖x取設(shè)備文件觉既。

我們這里以更新為例子

? ? 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.數(shù)據(jù)庫(kù)的增刪改查

對(duì)于數(shù)據(jù)庫(kù)的操作,其重點(diǎn)在SQL語(yǔ)句上,所以我們可以把操作數(shù)據(jù)庫(kù)的可以大約分為兩類:不改數(shù)據(jù)(查詢)瞪讼,改數(shù)據(jù)(增加钧椰,修改,刪除)

可以將他封裝

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();

?? }

}

我們舉個(gè)例子

?? 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

這個(gè)沒有說的符欠,界面可以參考我寫的

一個(gè)完整的圖書管理系統(tǒng)

需要代碼的話

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

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

網(wǎng)絡(luò)

網(wǎng)絡(luò)的話嫡霞,需要把架構(gòu)弄明白,每個(gè)用戶通過套接字Socket連接希柿,在每個(gè)用戶連接到服務(wù)器的時(shí)候诊沪,服務(wù)器需要給這個(gè)用戶分配一個(gè)線程去處理這個(gè)用戶的請(qǐng)求

publicclassServer{

? ? publicstaticvoidmain(String[]args)throwsException{

? ? ? ? ServerSocketserverSocket=newServerSocket(8080);

? ? ? ? while(true) {

? ? ? ? ? ? Socketaccept=serverSocket.accept();

? ? ? ? ? ? InputStreaminputStream=accept.getInputStream();

? ? ? ? ? ? OutputStreamoutputStream=accept.getOutputStream();

? ? ? ? ? ? newThread() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? publicvoidrun() {

? ? ? ? ? ? ? ? ? ? /**

? ? ? ? ? ? ? ? ? ? * 這里需要處理業(yè)務(wù)

? ? ? ? ? ? ? ? ? ? *

? ? ? ? ? ? ? ? ? ? * 一般需要定義 發(fā)送信息的格式

? ? ? ? ? ? ? ? ? ? * 比如說 客戶端發(fā)過來

? ? ? ? ? ? ? ? ? ? * adduser 張三 20 23

? ? ? ? ? ? ? ? ? ? * 這里就會(huì)判斷需要添加用戶,去調(diào)用dao的添加用戶

? ? ? ? ? ? ? ? ? ? *

? ? ? ? ? ? ? ? ? ? */

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }.start();;


? ? ? ? }


? ? }


}

?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曾撤,一起剝皮案震驚了整個(gè)濱河市端姚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挤悉,老刑警劉巖渐裸,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異装悲,居然都是意外死亡昏鹃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門诀诊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洞渤,“玉大人,你說我怎么就攤上這事属瓣≡仄” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵抡蛙,是天一觀的道長(zhǎng)护昧。 經(jīng)常有香客問我,道長(zhǎng)溜畅,這世上最難降的妖魔是什么埃撵? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任铝耻,我火速辦了婚禮,結(jié)果婚禮上蛋褥,老公的妹妹穿的比我還像新娘遥金。我一直安慰自己浴捆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布稿械。 她就那樣靜靜地躺著选泻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上页眯,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天梯捕,我揣著相機(jī)與錄音,去河邊找鬼窝撵。 笑死傀顾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碌奉。 我是一名探鬼主播短曾,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赐劣!你這毒婦竟也來了嫉拐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤魁兼,失蹤者是張志新(化名)和其女友劉穎婉徘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璃赡,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡判哥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碉考。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塌计。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侯谁,靈堂內(nèi)的尸體忽然破棺而出锌仅,到底是詐尸還是另有隱情,我是刑警寧澤墙贱,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布热芹,位于F島的核電站,受9級(jí)特大地震影響惨撇,放射性物質(zhì)發(fā)生泄漏伊脓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一魁衙、第九天 我趴在偏房一處隱蔽的房頂上張望报腔。 院中可真熱鬧,春花似錦剖淀、人聲如沸纯蛾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翻诉。三九已至炮姨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碰煌,已是汗流浹背舒岸。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拄查,地道東北人吁津。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像堕扶,于是被迫代替她去往敵國(guó)和親碍脏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355