dao层和service层
dao层:dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查
DAO接口
为每个DAO声明接口的好处在于:
可以在尚未实现具体DAO的时候编写上层代码,如Service里对DAO的调用
可以为DAO进行多实现,例如有JDBCDAO实现,MyBatisDAO实现,而不需要更改上层代码,只需要简单的在Spring的IoC配置里修改一下注入的DAO实现
service层:service层叫服务层,被称为服务,肯定是相比之下比较高层次的一层结构,相当于将几种操作封装起来
Service接口
可以在尚未实现具体Service情况下编写上层改代码,如Controller对Service的调用
Spring无论是AOP还是事务管理的实现都是基于动态代理的,而动态代理的实现依赖于接口,所以必须有接口的定义才能使用这些功能
可以对Service进行多实现
第一步:
先使用workbench创建数据库
第二步:
从底层出发把DAO实现功能
package cn.edu.mju.project2.dao;
import cn.edu.mju.project2.entity.Band;
import cn.edu.mju.project2.entity.User;
import cn.edu.mju.project2.utils.Pager;
import java.util.List;
public interface IUserDao{
public User findByLoginName(String loginName);
public boolean insert(User user);
public boolean update(User user);
public boolean delete(Integer id);
public User findByid(Integer id);
public List<User> find(User user);
public Pager paginate(int page, int pagesize, Band band);
}
package cn.edu.mju.project2.dao.impl;
import cn.edu.mju.project2.dao.IUserDao;
import cn.edu.mju.project2.entity.Band;
import cn.edu.mju.project2.entity.User;
import cn.edu.mju.project2.utils.Pager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
public class UserDao implements IUserDao {
@Override
public User findByLoginName(String loginName) {
User user = null;
try {
Connection conn = MySqlDbUtil.getConnect();
String sql = "SELECT * FROM user WHERE login_name=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, loginName);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
user = new User(rs.getInt("id"), rs.getString("login_name"),
rs.getString("login_pwd"), rs.getByte("gender"),
rs.getString("phone"), rs.getString("salt"), rs.getByte("status"));
}
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
@Override
public boolean insert(User user) {
boolean result = false;
try {
Connection conn = MySqlDbUtil.getConnect();
String sql = "INSERT INTO user(login_name,login_pwd,salt,gender,phone,status) " +
"VALUES(?,?,?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getLoginName());
pstmt.setString(2, user.getLoginPwd());
pstmt.setString(3, user.getSalt());
pstmt.setByte(4, user.getGander());
pstmt.setString(5, user.getPhone());
pstmt.setByte(6, user.getStatus());
int i = pstmt.executeUpdate();
if (i > 0) {
return true;
}
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@Override
public boolean update(User user) {
return false;
}
@Override
public boolean delete(Integer id) {
return false;
}
@Override
public User findByid(Integer id) {
return null;
}
@Override
public List<User> find(User user) {
return null;
}
@Override
public Pager paginate(int page, int pagesize, Band band) {
return null;
}
}
第二步:
在service层实现功能
package cn.edu.mju.project2.service;
import cn.edu.mju.project2.entity.User;
public interface IUserService {
public User login(String loginName, String loginPwd);
public boolean save(User user);
public boolean delete(Integer id);
}
package cn.edu.mju.project2.service.impl;
import cn.edu.mju.project2.dao.IUserDao;
import cn.edu.mju.project2.dao.impl.UserDao;
import cn.edu.mju.project2.entity.User;
import cn.edu.mju.project2.service.IUserService;
import cn.edu.mju.project2.utils.EncrypUtil;
import cn.edu.mju.project2.utils.StrUtil;
public class UserService implements IUserService {
IUserDao dao = new UserDao();
@Override
public User login(String loginName, String loginPwd) {
User user = dao.findByLoginName(loginName);
if(user != null) {
String source = loginPwd + user.getSalt();
String encryStr = EncrypUtil.md5(source);
if(encryStr.equals(user.getLoginPwd())){
user.setLoginPwd(null);
user.setSalt(null);
return user;
}
}
return null;
}
@Override
public boolean save(User user) {
if(user == null){
return false;
}
user.setSalt(StrUtil.randString(32));
user.setLoginPwd(EncrypUtil.md5(user.getLoginPwd() + user.getSalt()));
if(user.getId() == null) {
return dao.insert(user);
}else{
return dao.update(user);
}
}
@Override
public boolean delete(Integer id) {
return false;
}
}
第三步:
用户密码加密
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class EncrypUtil {
public static String md5(String source){
String ret = null;
if(source != null && !"".equals(source)) {
try {
byte[] secretBytes = MessageDigest.getInstance("md5").digest(source.getBytes());
String md5Val = new BigInteger(1,secretBytes).toString(16);
for(int i = 0; i<32 - md5Val.length(); i++){
md5Val = "0" + md5Val;
}
ret = md5Val;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
return ret;
}
}
第四步:
测试,查看是否成功插入数据
package service;
import cn.edu.mju.project2.entity.User;
import cn.edu.mju.project2.service.IUserService;
import cn.edu.mju.project2.service.impl.UserService;
import org.junit.Test;
public class TestUserService {
@Test
public void test(){
IUserService service=new UserService();
User user=new User();
user.setLoginName("admin");
user.setLoginPwd("1234");
user.setGander((byte)1);
user.setPhone("138000000");
// user.setLoginName("loginName");
user.setStatus((byte)9);
System.out.println(service.save(user));
}
}
测试成功