大學(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();;
? ? ? ? }
? ? }
}
?