Dao设计思想

为什么存在Dao设计思想?

       一般来说,在一个数据库访问操作中,都具有数据库中取数据的操作以及取到以后进行判断的操作,此时对于某个方法而言,过于复杂,因为在一个方法中一般要求具有单一的功能,因此需要将这些操作封装起来。

1.Dao设计思想:
   Dao:data Access Object,数据访问对象,在一个系统中,将所有和数据库打交道的操作封装成单独的API,所有需要访问数据库的地方,只需要调用这些API就行了。

Dao需要两样东西:

 1).DAO接口 :主要定义数据库操作中涉及到哪些操作内容

 2).DAO接口的实现类 对接口中定义的方法做一个具体的实现

2.对于原来代码汇中数据访问的代码做了剥离以后,原来的业务逻辑应该保留,此时将具体的业务逻辑写在Service中

Service:用于封装业务逻辑

Service需要两样东西:

Service接口:主要定义当前系统中需要实现哪些业务功能

Service接口的实现类:对Service接口中的方法进行实现

                                                  

DAO接口

package com.sy.jdbc.dao;

import com.sy.jdbc.entity.Account;

import java.util.List;

/**
 * 在该接口中定义所有和Account相关的数据库操作
 */
public interface AccountDao {

    /**
     * Dao中方法的命名应该体现出对数据库进行了何种操作,而不是具体某一个业务(例如不能起名为登录,注册)
     *
     * @return
     */
    Account getAccountByUserName(String userName);

    List<String> getAllUserNames();

    int addAccount(String userName, String userPwd);

    int delAccountByUserName(String userName);

    List<Account> getAccountsByUserName(String userName);
}

 DAO接口实现类

package com.sy.jdbc.dao.impl;

import com.sy.jdbc.dao.AccountDao;
import com.sy.jdbc.entity.Account;
import com.sy.jdbc.utils.DBUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * AccountDao的实现类,实现AccountDao中定义的方法
 */
public class AccountDaoImpl implements AccountDao {
    @Override
    public Account getAccountByUserName(String userName) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Account account = null;
        try {
            con = DBUtils.getConnection();
            ps = con.prepareStatement("select * from t_account where username=?");
            ps.setString(1, userName);
            rs = ps.executeQuery();
            while (rs.next()) {
                //如果能够找到记录,则构建Account对象
                account = new Account();
                account.setUserName(rs.getString("username"));
                account.setUserPwd(rs.getString("userpwd"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(rs, ps, con);
        }
        return account;
    }

    @Override
    public List<String> getAllUserNames() {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<String> userNames = new ArrayList<>();
        try {
            con = DBUtils.getConnection();
            ps = con.prepareStatement("select username from t_account");
            rs = ps.executeQuery();
            while (rs.next()) {
                userNames.add(rs.getString("username"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(rs, ps, con);
        }
        return userNames;
    }

    @Override
    public int addAccount(String userName, String userPwd) {
        Connection con = null;
        PreparedStatement ps = null;
        int r = -1;
        try {
            con = DBUtils.getConnection();
            ps = con.prepareStatement("insert into t_account(username,userpwd) values(?,?)");
            ps.setString(1, userName);
            ps.setString(2, userPwd);
            r = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(null, ps, con);
        }
        return r;
    }

    @Override
    public int delAccountByUserName(String userName) {
        Connection con = null;
        PreparedStatement ps = null;
        int r = -1;
        try {
            con = DBUtils.getConnection();
            ps = con.prepareStatement("delete from t_account where username=?");
            ps.setString(1, userName);
            r = ps.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(null, ps, con);
        }
        return r;
    }

    @Override
    public List<Account> getAccountsByUserName(String userName) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Account> accounts = new ArrayList<>();
        try {
            con = DBUtils.getConnection();
            String sql = "select * from t_account ";
            if (userName != null) {
                sql += "where username=?";
            }
            ps = con.prepareStatement(sql);
            if (userName != null) {
                ps.setString(1, userName);
            }
            rs = ps.executeQuery();
            while (rs.next()) {
                accounts.add(new Account(rs.getString("username"), rs.getString("userpwd")));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(rs, ps, con);
        }
        return accounts;
    }


}

 service接口

package com.sy.jdbc.service;

import com.sy.jdbc.bean.Result;

/**
 * 定义所有和Account操作相关的业务逻辑
 */
public interface AccountService {
    /**
     * Service中定义的方法名一般就是具体某个业务逻辑的名字
     *
     * @param userName
     * @param userPwd
     * @return
     */
    Result login(String userName, String userPwd);

    Result regist(String userName, String userPwd, String userPwdConfirm);

    Result deleteAccount(String userName);

    Result queryAccounts(String userName);
}

service接口实现类

package com.sy.jdbc.service.impl;

import com.sy.jdbc.bean.Result;
import com.sy.jdbc.dao.AccountDao;
import com.sy.jdbc.dao.impl.AccountDaoImpl;
import com.sy.jdbc.entity.Account;
import com.sy.jdbc.service.AccountService;

/**
 * 定义AccountService业务接口的实现类
 */
public class AccountServiceImpl implements AccountService {
    /**
     * 在Service层中可能需要访问数据库,此时的数据库访问不用再去关注底层的jdbc操作
     * 因为jdbc操作已经在dao中封装好了,service层只需要调用这个dao中的方法即可实现对数据库的访问
     */
    private AccountDao accountDao = new AccountDaoImpl();

    @Override
    public Result login(String userName, String userPwd) {
        Result result = new Result();
        Account account = accountDao.getAccountByUserName(userName);
        if (account == null) {
            result.setSuccess(false);
            result.setErrMsg("用户不存在");
            return result;
        } else {
            if (!account.getUserPwd().equals(userPwd)) {
                result.setSuccess(false);
                result.setErrMsg("密码错误");
                return result;
            } else {
                return result;
            }
        }
    }

    @Override
    public Result regist(String userName, String userPwd, String userPwdConfirm) {
        //校验:
        //1.用户名、密码不能为空
        //2.两次输入的密码要保持一致
        //3.用户名不能重复:
        //……
        //将输入的用户信息保存进数据库中
        Result result = new Result();
        if (userName.trim().length() == 0) {
            result.setSuccess(false);
            result.setErrMsg("用户名不能为空");
            return result;
        }
        if (userPwd.trim().length() == 0 || userPwdConfirm.trim().length() == 0) {
            result.setSuccess(false);
            result.setErrMsg("密码不能为空");
            return result;
        }
        if (!userPwd.equals(userPwdConfirm)) {
            result.setSuccess(false);
            result.setErrMsg("两次输入的密码不一致");
            return result;
        }
        if (accountDao.getAllUserNames().contains(userName)) {
            result.setSuccess(false);
            result.setErrMsg("用户名已经存在");
            return result;
        }

        if (accountDao.addAccount(userName, userPwd) > 0) {
            return result;
        } else {
            result.setSuccess(false);
            result.setErrMsg("新增失败");
            return result;
        }

    }

    @Override
    public Result deleteAccount(String userName) {
        //校验:
        //1.用户名是否为空
        //2.用户名是否存在
        //……
        //数据库中删除满足条件的记录
        Result result = new Result();

        if (userName.trim().length() == 0) {
            result.setSuccess(false);
            result.setErrMsg("要删除的用户名不能为空");
            return result;
        }
        if (!accountDao.getAllUserNames().contains(userName)) {
            result.setSuccess(false);
            result.setErrMsg("要删除的用户不存在");
            return result;
        }
        if (accountDao.delAccountByUserName(userName) > 0) {
            return result;
        } else {
            result.setSuccess(false);
            result.setErrMsg("删除失败");
            return result;
        }
    }

    @Override
    public Result queryAccounts(String userName) {
        Result result = new Result();
        result.setData(accountDao.getAccountsByUserName(userName));
        return result;
    }
}

应用

package com.sy.jdbc.homework;

import com.sy.jdbc.bean.Result;
import com.sy.jdbc.entity.Account;
import com.sy.jdbc.service.AccountService;
import com.sy.jdbc.service.impl.AccountServiceImpl;
import com.sy.jdbc.utils.DBUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Client {
    private AccountService accountService = new AccountServiceImpl();

    public static void main(String[] args) {
        Client client = new Client();
        Scanner sc = new Scanner(System.in);

        //1.登录操作
        System.out.println("请先登录:");
        System.out.println("请输入用户名:");
        String userName = sc.nextLine();
        System.out.println("请输入密码:");
        String userPwd = sc.nextLine();
        Result result = client.login(userName, userPwd);
        if (result.isSuccess()) {
            System.out.println("登录成功");
        } else {
            System.out.println(result.getErrMsg());
        }


        //2.注册操作
//        System.out.println("注册操作...");
//        System.out.println("请输入用户名:");
//        String userName = sc.nextLine();
//        System.out.println("请输入与密码:");
//        String userPwd = sc.nextLine();
//        System.out.println("请再次输入密码:");
//        String userPwdConfirm = sc.nextLine();
//        Result result=client.regist(userName, userPwd, userPwdConfirm);
//        if(result.isSuccess()){
//            System.out.println("注册成功");
//        }else{
//            System.out.println(result.getErrMsg());
//        }


        //3.删除操作
//        System.out.println("删除操作");
//        System.out.println("请输入要删除的账户姓名:");
//        String userName = sc.nextLine();
//        Result result = client.deleteAccount(userName);
//        if (result.isSuccess()) {
//            System.out.println("删除成功");
//        } else {
//            System.out.println(result.getErrMsg());
//        }

        //5、实现用户的查询功能,查询全部及根据userName名去查询
        //select * from t_account
        //select * from t_account where userName=?
        //(1)查询所有
//        System.out.println("查询所有...");
//        Result result = client.getAccounts(null);
//        List<Account> accounts = (List<Account>) result.getData();
//        for (Account account : accounts) {
//            System.out.println(account.getUserName() + "\t" + account.getUserPwd());
//        }

        //(2)根据名字进行查询
//        System.out.println("请输入要查询的姓名:");
//        String userName = sc.nextLine();
//        Result result = client.getAccounts(userName);
//        List<Account> accounts = (List<Account>) result.getData();
//        if (accounts.size() == 0) {
//            System.out.println("没有找到符合条件的用户");
//        } else {
//            for (Account account : accounts) {
//                System.out.println(account.getUserName() + "\t" + account.getUserPwd());
//            }
//        }
    }


    /**
     * 查询用户信息
     *
     * @param userName 如果userName没有传值,则查询所有,如果传值,则根据用户名进行查询
     * @return 查询后的用户信息
     */
    public Result getAccounts(String userName) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Account> accounts = new ArrayList<>();
        Result result = new Result();
        try {
            con = DBUtils.getConnection();
            String sql = "select * from t_account ";
            if (userName != null) {
                sql += "where username=?";
            }
            ps = con.prepareStatement(sql);
            if (userName != null) {
                ps.setString(1, userName);
            }
            rs = ps.executeQuery();
            while (rs.next()) {
                accounts.add(new Account(rs.getString("username"), rs.getString("userpwd")));
            }
            result.setData(accounts);
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(rs, ps, con);
        }
        return null;
    }


    /**
     * 根据用户名删除用户
     *
     * @param userName 要被删除的用户名
     * @return 返回删除操作的结果
     */
    public Result deleteAccount(String userName) {
        //校验:
        //1.用户名是否为空
        //2.用户名是否存在
        //……
        //数据库中删除满足条件的记录
        Result result = new Result();

        if (userName.trim().length() == 0) {
            result.setSuccess(false);
            result.setErrMsg("要删除的用户名不能为空");
            return result;
        }
        if (!isUserExist(userName)) {
            result.setSuccess(false);
            result.setErrMsg("要删除的用户不存在");
            return result;
        }


        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = DBUtils.getConnection();
            ps = con.prepareStatement("delete from t_account where username=?");
            ps.setString(1, userName);
            int r = ps.executeUpdate();
            if (r > 0) {
                return result;
            } else {
                result.setSuccess(false);
                result.setErrMsg("删除失败");
                return result;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(null, ps, con);
        }
        return null;


    }


    /**
     * 注册操作
     *
     * @param userName       输入的用户名
     * @param userPwd        输入的密码
     * @param userPwdConfirm 再次输入的密码
     * @return 返回注册操作的结果
     */
    public Result regist(String userName, String userPwd, String userPwdConfirm) {

        return accountService.regist(userName, userPwd, userPwdConfirm);
    }


    /**
     * 登录操作
     *
     * @param userName 用户输入的用户名
     * @param userPwd  用户输入的密码
     * @return 返回登录操作的结果
     */
    public Result login(String userName, String userPwd) {
        return accountService.login(userName, userPwd);
    }


}

猜你喜欢

转载自blog.csdn.net/weixin_43727372/article/details/90905630
今日推荐