为什么存在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);
}
}