1. 程式人生 > >Java三層架構實現使用者註冊邏輯[示例]

Java三層架構實現使用者註冊邏輯[示例]

    軟體實際開發中,都是採用分層思想,解耦,且方便維護/擴充套件,並提高程式碼重用性,例項層序分層結構與包名對應如下:

    本示例程式環境:

        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
註冊成功!