spring+springMVC+mybatis的整合 part5

UserService實(shí)現(xiàn)(注意編程思維的養(yǎng)成)

根據(jù)面向接口編程的思維來講芋哭,在Service中核心是實(shí)現(xiàn)Dao層,并調(diào)用Dao層恐似。
UserDao層通過單元測(cè)試了,現(xiàn)在中心就應(yīng)該放在業(yè)務(wù)邏輯的實(shí)現(xiàn)便锨,畢竟數(shù)據(jù)持久化已經(jīng)實(shí)現(xiàn)了。
從服務(wù)端程序的角度看來我碟,用戶的主要業(yè)務(wù)有注冊(cè)放案、登錄、注銷登錄矫俺、注銷帳號(hào)等等吱殉,這里我們先拿注冊(cè)來說事。

用戶注冊(cè)流程分析(用戶角度):
填寫帳號(hào)相關(guān)信息
提交注冊(cè)信息
服務(wù)器返回是否注冊(cè)成功

用戶注冊(cè)流程分析(服務(wù)器角度):
收到用戶注冊(cè)請(qǐng)求
解包數(shù)據(jù)→封裝到UserBean解包數(shù)據(jù)失敗(請(qǐng)求信息異常)恳守,返回錯(cuò)誤提示信息
針對(duì)具體的用戶信息檢查是否符合標(biāo)準(zhǔn)不符合檢查標(biāo)準(zhǔn)考婴,返回對(duì)應(yīng)的錯(cuò)誤提示
通過檢查贩虾,調(diào)用Dao檢查是否存在同樣的用戶數(shù)據(jù)庫(kù)已經(jīng)存在相同的用戶信息催烘,不能重復(fù)添加,返回錯(cuò)誤提示信息
不存在同樣的用戶缎罢,添加新用戶伊群,并返回成功的提示信息

流程圖反映如下:


ssm框架用戶行為解析流程圖

自定義異常
新建一個(gè)與daodomain同級(jí)的包exception來存放自定義的異常
所有的自定義異常都要繼承于Exception
UserAireadyExistException 用戶已經(jīng)存在異常

public UserAireadyExistException(String s) {
        super(s);
    }
    public UserAireadyExistException(String message, Throwable cause) {
        super(message, cause);
    }

下面的UserCanNotBeNullException (用戶為空異常)策精,UserNameCanNotBeNullException(用戶名為空異常)舰始,UserPwdCanNotBeNullException(用戶密碼為空)異常代碼相類似

還有個(gè)其他異常

public class OtherThingsException extends Exception {
    public OtherThingsException(String message) {
        super(message);
    }
    public OtherThingsException(Exception e){
        this(e.getMessage());
    }
    public OtherThingsException(String message, Throwable cause) {
        super(message, cause);
    }
}

可能會(huì)拋出的異常寫完了,下面來實(shí)現(xiàn)用戶注冊(cè)的Service
首先還是先寫個(gè)BaseService接口咽袜,用泛型解耦

public interface BaseService<T> {
    void add(T t) throws Exception;
}

用戶注冊(cè)接口
不同對(duì)象的業(yè)務(wù)體系不同丸卷,BaseService并不能完全替代不同對(duì)象的具體行為表現(xiàn)
UserService

public interface UserService extends BaseService<User>{
    void add(User user) throws Exception;
    User findUser(User user) throws Exception;
}
實(shí)例化用戶注冊(cè)接口UserServiceImpl

service包下創(chuàng)建一個(gè)子包,叫serviceImpl询刹,用來存放業(yè)務(wù)層接口實(shí)現(xiàn)類
UserServiceImpl

@Service("userService")
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDao userDao;
    /**
     * 添加用戶谜嫉,一般來說需要檢查用戶為空、用戶名為空凹联、密碼為空
     */
    public void add(User user) throws UserCanNotBeNullException, UserNameCanNotBeNullException, UserPwdCanNotBeNullException, UserAireadyExistException, OtherThingsException {
        //先檢查用戶是否存在
        if (null == user) {
            //拋出用戶為空的自定義異常
            throw new UserCanNotBeNullException("User can not be Null");
        }
        //用戶名不能為空檢查
        if (StringUtils.isEmpty(user.getLoginId())) {
            //拋出用戶名為空的自定義異常
            throw new UserNameCanNotBeNullException("User name can not be Null");
        }
        //用戶密碼不能為空檢查
        if (StringUtils.isEmpty(user.getPwd())) {
            //拋出用戶密碼為空的自定義異常
            throw new UserPwdCanNotBeNullException("User name can not be Null");
        }
        //由于我這個(gè)是管理系統(tǒng)沐兰,根據(jù)業(yè)務(wù)需求來說,我們的用戶基本信息都是不能為空的
        //基本信息包括:姓名蔽挠、年齡住闯、用戶名、密碼澳淑、性別比原、手機(jī)號(hào),年齡大于18
        if ( StringUtils.isEmpty(user.getSex())
                || user.getAge() < 18
                || StringUtils.isEmpty(user.getCellNumber())) {
            //其他綜合異常
            throw new OtherThingsException("Some use's base info can not be null");
        }
        //已經(jīng)存在相同用戶
        if (null != userDao.findOneById(user.getLoginId())) {
            //存在相同的用戶異常
            throw new UserAireadyExistException("Register User Failed杠巡,Because the  user Aiready exist");
        }
        int result = 0; //受影響的行數(shù)默認(rèn)為0
        try {
            result = userDao.add(user);
        } catch (Exception e) {
            System.out.println("添加用戶失敗,用戶已經(jīng)存在");
            //其他用戶添加失敗異常
            throw new OtherThingsException(e);
        }
        if (result > 0)
            System.out.println("添加用戶成功");
    }
    /**
     * 查找用戶
     *
     * @param user 用戶bean
     * @throws Exception
     */
    public User findUser(User user) throws Exception {
        return userDao.findOneById(user.getLoginId());
    }
    /**
     * 用于更新sessionId
     */
    public void updateLoginSession(String sessionId, String loginId) {
        userDao.updateLoginSession(sessionId, loginId);
    }
}

在這里我們用到了StringUtils這個(gè)JAVA的工具類

http://www.reibang.com/p/2eb9e42ecf44
寫完每個(gè)Service后量窘,都需要針對(duì)具體的對(duì)象的行為進(jìn)行單元測(cè)試,UserServiceTest代碼如下:
同樣忽孽,要繼承基礎(chǔ)測(cè)試類

public class UserServiceTest extends BaseTest{
    @Autowired
    private UserServiceImpl userService;
    //此處直接使用UserService的實(shí)現(xiàn)類绑改,主要是方便拋出異常谢床,然后異常出現(xiàn)時(shí)候可以針對(duì)性的處理

    @Test
    public void testAdd() {
        User user = new User();
        user.setLoginId("20171");
        user.setName("意識(shí)流1");
        user.setPwd("123456");
        user.setSex("不知道");
        user.setDuty("老大");
        user.setCellNumber("12345678910");
        user.setAge(10);
        try {
            userService.add(user);
        } catch (UserCanNotBeNullException e) {
            //用戶不能為空異常拋出
            e.printStackTrace();
        } catch (UserNameCanNotBeNullException e) {
            //用戶名不能為空
            e.printStackTrace();
        } catch (UserPwdCanNotBeNullException e) {
            //用戶密碼不能為空
            e.printStackTrace();
        } catch (UserAireadyExistException e) {
            //用戶存在拋出
            e.printStackTrace();
        } catch (OtherThingsException e) {
            //其他綜合異常或是不能處理的異常
            e.printStackTrace();
        }
    }
    @Test
    public void testFindUser() throws Exception {
        User user = new User();
        user.setLoginId("20171");
        User result = null; //受影響的行數(shù)默認(rèn)為0
        try {
            result = userService.findUser(user);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("查找用戶失敗");
        }
        if (null!=result)
            System.out.println("查找用戶成功\n"+result.toString());
    }
}

同樣的厘线,我們的Service的測(cè)試代碼執(zhí)行后识腿,我們可以在mysql中看到具體的數(shù)據(jù)變化

主要參考于大牛Clone丶記憶的SSM集成之路

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市造壮,隨后出現(xiàn)的幾起案子渡讼,更是在濱河造成了極大的恐慌,老刑警劉巖耳璧,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件成箫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旨枯,警方通過查閱死者的電腦和手機(jī)蹬昌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攀隔,“玉大人皂贩,你說我怎么就攤上這事±バ冢” “怎么了明刷?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)满粗。 經(jīng)常有香客問我辈末,道長(zhǎng),這世上最難降的妖魔是什么映皆? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任挤聘,我火速辦了婚禮,結(jié)果婚禮上劫扒,老公的妹妹穿的比我還像新娘檬洞。我一直安慰自己,他們只是感情好沟饥,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布添怔。 她就那樣靜靜地躺著,像睡著了一般贤旷。 火紅的嫁衣襯著肌膚如雪广料。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天幼驶,我揣著相機(jī)與錄音艾杏,去河邊找鬼。 笑死盅藻,一個(gè)胖子當(dāng)著我的面吹牛购桑,可吹牛的內(nèi)容都是我干的畅铭。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼勃蜘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼硕噩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缭贡,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤炉擅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后阳惹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谍失,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年莹汤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了快鱼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡体啰,死狀恐怖攒巍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荒勇,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布闻坚,位于F島的核電站沽翔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窿凤。R本人自食惡果不足惜仅偎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雳殊。 院中可真熱鬧橘沥,春花似錦、人聲如沸夯秃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仓洼。三九已至介陶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間色建,已是汗流浹背哺呜。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箕戳,地道東北人某残。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓国撵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玻墅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卸留,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容