Java三層架構實現使用者註冊邏輯[示例]
阿新 • • 發佈:2018-11-26
軟體實際開發中,都是採用分層思想,解耦,且方便維護/擴充套件,並提高程式碼重用性,例項層序分層結構與包名對應如下:
本示例程式環境:
1. 基本資訊:Spring框架的JDBCTeamplate模板 / 阿里的DruiDruid連線池 / mysql資料庫及其驅動jar包 / JDK版本1.8
2. 工具類: Druid連線池工具類
以下是原始碼:
Dao層(持久層):
package com.wen.dao; import com.wen.domain.User; import com.wen.utils.DateSourceDruid; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; //持久層 一般方法功能單一,以供業務層組合使用 //主要與資料庫進行互動 public class UserDao { //新建JDBCTemplate模板,用到Druid連線池工具類 private JdbcTemplate jdbcTemplate=new JdbcTemplate(DateSourceDruid.getDateSource()); private String sql=null;//新建一個sql字串變數 public User findUser(String userName){ User user=null;//初始化使用者物件 sql="select * from users where uname=?";//查詢語句 try { user=jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class),userName); } catch (DataAccessException e) {//若報錯則返回null,代表未找到 } return user; } public int saveUser(String userName,String userPassword){ int result=0;//初始化返回值 sql="insert into users values(null,?,?);";//sql語句存入使用者 try { result = jdbcTemplate.update(sql, userName, userPassword);//存入並返回結果 } catch (DataAccessException e) {//若儲存失敗則返回0 } return result; } }
Service層(業務層):
package com.wen.service; import com.wen.dao.UserDao; //業務層:主要對持久層功能進行組合,供表現層使用,並返回符合邏輯的結果 //後端程式設計師主要戰場 public class UserService { private UserDao userDao=new UserDao();//新建持久層物件 public boolean userIsexist(String username){//判斷使用者是否存在 return userDao.findUser(username)!=null; } public boolean saveUser(String userName,String userPassword){//儲存使用者 return userDao.saveUser(userName,userPassword)>0; } }
Action層(變現層):
package com.wen.action; import com.wen.service.UserService; //變現層:接收客戶端資料並返回結果 //提供一個簡明的方法池,供使用 //實際開發中該層為程式入口,接收客戶端請求並返回資料 public class UserAction { private UserService userService=new UserService();//新建業務層物件 public boolean findUser(String userName){//查詢使用者 return userService.userIsexist(userName); } public boolean saveUser(String userName,String userPassword){//儲存使用者 return userService.saveUser(userName,userPassword); } }
模擬使用者介面(View):
package com.wen.view;
import com.wen.action.UserAction;
import java.util.Scanner;
public class UserView {
/*
web介面用控制檯代替,主要展現註冊邏輯和三層架構基本思想
實際開發都是分層思想,解耦,且便於後期維護和增加功能,並提高下一層程式碼的複用性
*/
public static void main(String[] args) {
System.out.println("歡迎來到Xxx的世界");//歡迎語
Scanner scanner = new Scanner(System.in);//
UserAction userAction = new UserAction();//新建表現層物件
while (true) {//迴圈輸入註冊名,直到註冊名可用為止
System.out.println("請輸入您想要註冊的使用者名稱:");
String userName = scanner.nextLine();//輸入註冊名
//註冊
if (userAction.findUser(userName)) {//判斷註冊名是否可用
System.out.println("使用者名稱已被註冊,請重新輸入:");
} else {//若可用,開始你設定密碼
String userPassword;//以下用迴圈確認密碼一致性,故該變數提出到迴圈外
while (true) {
System.out.println("請輸入註冊密碼");
userPassword = scanner.nextLine();
System.out.println("請確認密碼:");
String repeat = scanner.nextLine();
if (repeat.equals(userPassword)) {
break;//若一致則退出迴圈開始註冊
} else {
System.out.println("密碼輸入不一致,請再次輸入");//否則再次輸入密碼並確認
}
}
boolean login = userAction.saveUser(userName, userPassword);//註冊到資料庫,並返回註冊結果
if (login) {
System.out.println("註冊成功!");
} else {
System.out.println("伺服器忙,請稍後再試");
}
break;//註冊完畢,退出外層迴圈
}
}
}
}
使用者實體類:
package com.wen.domain;
import java.util.Objects;
public class User {
private int id;
private String name;
private int password;
public User() {
}
public User(int id, String name, int password) {
this.id = id;
this.name = name;
this.password = password;
}
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 getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password=" + password +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
password == user.password &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name, password);
}
}
Druid工具類原碼見上一篇博文:Spring框架中JdbcTemplate類的查表功能演示(基於Druid連線池)
本例執行結果邏輯展示如下:
歡迎來到Xxx的世界
請輸入您想要註冊的使用者名稱:
黃晴
九月 15, 2018 3:12:20 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
資訊: {dataSource-1} inited
使用者名稱已被註冊,請重新輸入:
請輸入您想要註冊的使用者名稱:
小文
請輸入註冊密碼
12345
請確認密碼:
123456
密碼輸入不一致,請再次輸入
請輸入註冊密碼
12345
請確認密碼:
12345
註冊成功!