githb链接:
代码直接下载SSM.zip,其中smbms.zip为所有的代码!
超市管理系统
主要是三个大模块的操作,分别是用户管理页面、供应商管理页面和订单管理,主要是进行数据的增删改查(CRUD),所以这里主要以 用户管理页面进行数据的增删改,主要是理解三层架构Servlet、Service和Dao层的操作关系,方便上手后面的框架SSM、Springboot这些的。
整体的流程与代码编写思路:
建议是从后往前写,便于调试与debug,先编写Dao层,主要负责与数据库交互,编写sql语句等。Servicce主要负责调用Dao层,而Servlet也是主要调用Service和前端的一些数据交互,比如resquet和response等
一、增加用户数据
1、编写UserDao层的接口
//增加用户
public int add(Connection connection,User user);
2、编写UserDao层的接口实现类
@Override
public int add(Connection connection,User user) {
PreparedStatement pstm = null;
int updateRows = 0;
if(connection!=null){
//SQL语句,插入数据的操作 ?表示占位符
String sql = "insert into smbms_user (userCode,userName,userPassword," +
"userRole,gender,birthday,phone,address,creationDate,createdBy) " +
"values(?,?,?,?,?,?,?,?,?,?)";
//参数
Object[] params = {user.getUserCode(), user.getUserName(), user.getUserPassword(),
user.getUserRole(), user.getGender(), user.getBirthday(),
user.getPhone(), user.getAddress(), user.getCreationDate(), user.getCreatedBy()};
updateRows = BaseDao.execute(connection, pstm, sql, params);
//关闭数据资源
BaseDao.closeResource(null,pstm,null);
}
return updateRows;
}
//增加用户
3、编写UserService层的借口
//增加用户信息
public boolean add(User user);
4、编写UserService层的接口实现类
@Override
public boolean add(User user) {
boolean flag = false;
Connection connection = null;
try{
connection = BaseDao.getConnection();//获得链接
connection.setAutoCommit(false);//开启jdbc事物管理
int updateRows = userDao.add(connection,user);
connection.commit();//如果成功直接提交即可
if(updateRows>0){
flag = true;
System.out.printf("add success!");
}else {
System.out.printf("add failed!");
}
}catch (Exception e){
//添加失败就回滚
e.printStackTrace();
try{
connection.rollback();//如果出错就回滚
}catch (SQLException e1){
e1.printStackTrace();
}
}finally {
//关闭资源
BaseDao.closeResource(connection,null,null);
}
return flag;
}
5、编写Servlet
//增加新用户
private void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
//debug用的
System.out.printf("+++++++开始添加了哦----");
//从前端页面获取增加的数据字段
String userCode = req.getParameter("userCode");
String userName = req.getParameter("userName");
String userPassword = req.getParameter("userPassword");
String gender = req.getParameter("gender");
String birthday = req.getParameter("birthday");
String phone = req.getParameter("phone");
String address = req.getParameter("address");
String userRole = req.getParameter("userRole");
//数据存到user中
User user = new User();
user.setUserCode(userCode);
user.setUserName(userName);
user.setUserPassword(userPassword);
user.setAddress(address);
try {
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
} catch (ParseException e) {
e.printStackTrace();
}
user.setGender(Integer.valueOf(gender));
user.setPhone(phone);
user.setUserRole(Integer.valueOf(userRole));
user.setCreationDate(new Date());
user.setCreatedBy(((User) req.getSession().getAttribute(Constants.USER_SESSION)).getId());
UserService userService = new UserServiceImpl();
if (userService.add(user)) {//添加成功
resp.sendRedirect(req.getContextPath() + "/jsp/user.do?method=query");
} else {//添加失败
req.getRequestDispatcher("useradd.jsp").forward(req, resp);
}
}
二、增加数据存在的问题
这里存在一个问题,就是对于增加的用户是否已经存在,如果已经存在的话,就会报错,所以还需要对输入的用户进行查找操作。
1、userDao层接口判断
//查找用户是否已经存在
public User getUsercode(Connection connection,String userCode);
2、userDao层接口的实现类
@Override
public User getUsercode(Connection connection, String userCode) {
PreparedStatement pstm = null;
ResultSet rs = null;
User user = null;
try {
if (null != connection) {
String sql = "select * from smbms_user where userCode=?";//sql的查询语句
Object[] params = {userCode};
rs = BaseDao.execute(connection, pstm, rs, sql, params);
//反复调用ResultSet的next()方法并读取每一行结果。
System.out.println("我想看看rs是什么" + rs + "你好吗?");
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUserCode(rs.getString("userCode"));
user.setUserName(rs.getString("userName"));
user.setUserPassword(rs.getString("userPassword"));
user.setGender(rs.getInt("gender"));
user.setBirthday(rs.getDate("birthday"));
user.setPhone(rs.getString("phone"));
user.setAddress(rs.getString("address"));
user.setUserRole(rs.getInt("userRole"));
user.setCreatedBy(rs.getInt("createdBy"));
user.setCreationDate(rs.getTimestamp("creationDate"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getTimestamp("modifyDate"));
}
}
BaseDao.closeResource(null, pstm, rs);//关闭资源
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return user;//返回结果
}
3、Service层接口判断
//判断用户是否已经存在
public User getUsercode(String userCode);
4、Service层接口的实现类
//判断用户是否存在
@Override
public User getUsercode(String userCode) {
Connection connection = null;
User user = null;
try {
connection = BaseDao.getConnection();
//通过业务层调用对应的具体数据库操作
user = userDao.getUsercode(connection, userCode);
} catch (Exception e) {
e.printStackTrace();
} finally {
BaseDao.closeResource(connection, null, null);
}
return user;
}
5、Servlet实现
//判断usrcode是否可用
private void userCodeExist(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//判断用户账号是否可用
String userCode = req.getParameter("userCode");
String userPassword = req.getParameter("userPassword");
HashMap<String, String> resultMap = new HashMap<String, String>();
//System.out.printf("==测试+++"+userCode);
if (userCode == null || userCode.equals("")) {
//userCode == null || userCode.equals("")
resultMap.put("userCode", "exist");
} else {
UserService userService = new UserServiceImpl();
User user = userService.getUsercode(userCode);
System.out.println("==测试++"+user);
if (null != user) {
resultMap.put("userCode", "exist");
} else {
resultMap.put("userCode", "notexist");
}
}
//把resultMap转为json字符串以json的形式输出
//配置上下文的输出类型
resp.setContentType("application/json");
//从response对象中获取往外输出的writer对象
PrintWriter outPrintWriter = resp.getWriter();
//把resultMap转为json字符串 输出
outPrintWriter.write(JSONArray.toJSONString(resultMap));
outPrintWriter.flush();//刷新
outPrintWriter.close();//关闭流
}
三、 删除用户数据
1、userDao层的接口
//删除用户
public int deleteUserById(Connection connection,Integer usrid);
2、userDao层的接口实现类
//根据用户的id删除用户的信息
@Override
public int deleteUserById(Connection connection, Integer usrid) {
//return 0;
//写sql语句,根据usrid删除用户
PreparedStatement pstm = null;
int flag = 0;
if(connection!=null){
String sql = "delete from smbms_user where id=?";
Object []params = {usrid};
flag = BaseDao.execute(connection,pstm,sql,params);
BaseDao.closeResource(null,pstm,null);
}
return flag;
}
3、Service层的接口
//根据用户的id删除用户的信息
public boolean delusrbyid(Integer usrid);
4、Service层的接口实现类
//删除用户
@Override
public boolean delusrbyid(Integer usrid) {
Connection connection = null;
boolean flag = false;
try{
connection = BaseDao.getConnection();//获取链接
//判断需要删除的用户是否合法
if (userDao.deleteUserById(connection, usrid) > 0) {
flag = true;
}
}catch (Exception e){
e.printStackTrace();
}finally {
BaseDao.closeResource(connection,null,null);
}
return flag;
}
5、Servlet实现
//删除用户的信息
private void delusrbyid(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String usrid = req.getParameter("uid");
Integer delId = 0;
try {
delId = Integer.parseInt(usrid);
} catch (Exception e) {
// TODO: handle exception
delId = 0;
}
HashMap<String, String> resultMap = new HashMap<String, String>();
if (delId <= 0) {
resultMap.put("delResult", "notexist");
} else {
UserService userService = new UserServiceImpl();
if (userService.delusrbyid(delId)) {
resultMap.put("delResult", "true");
} else {
resultMap.put("delResult", "false");
}
}
//把resultMap转换成json对象输出
resp.setContentType("application/json");
PrintWriter outPrintWriter = resp.getWriter();
outPrintWriter.write(JSONArray.toJSONString(resultMap));
outPrintWriter.flush();
outPrintWriter.close();
}
四、修改用户数据
1、userDao层的接口
/**
* 修改用户信息
*/
int modify(Connection connection, User user) throws Exception;
2、userDao层的接口实现类
@Override
public int modify(Connection connection, User user) throws Exception {
int flag = 0;
PreparedStatement pstm = null;
if (null != connection) {
String sql = "update smbms_user set userName=?," +
"gender=?,birthday=?,phone=?,address=?,userRole=?,modifyBy=?,modifyDate=? where id = ? ";
Object[] params = {user.getUserName(), user.getGender(), user.getBirthday(),
user.getPhone(), user.getAddress(), user.getUserRole(), user.getModifyBy(),
user.getModifyDate(), user.getId()};
flag = BaseDao.execute(connection, pstm, sql, params);
BaseDao.closeResource(null, pstm, null);
}
return flag;
}
3、Service层的接口
/**
* 修改用户信息
*/
public boolean modify(User user);
4、Service层接口的实现类
// 根据userCode查询出User
@Override
public User selectUserCodeExist(String userCode,String userPassword) {
Connection connection = null;
User user = null;
try {
connection = BaseDao.getConnection();
user = userDao.getLoginUser(connection, userCode,userPassword);
System.out.printf("你好啊"+user+"wohao");
} catch (Exception e) {
e.printStackTrace();
} finally {
BaseDao.closeResource(connection, null, null);
}
return user;
}
5、Servlet实现
//修改用户数据并保存
private void modify(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String id = req.getParameter("uid");
String userName = req.getParameter("userName");
String gender = req.getParameter("gender");
String birthday = req.getParameter("birthday");
String phone = req.getParameter("phone");
String address = req.getParameter("address");
String userRole = req.getParameter("userRole");
User user = new User();
user.setId(Integer.valueOf(id));
user.setUserName(userName);
user.setGender(Integer.valueOf(gender));
try {
user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
user.setPhone(phone);
user.setAddress(address);
user.setUserRole(Integer.valueOf(userRole));
user.setModifyBy(((User) req.getSession().getAttribute(Constants.USER_SESSION)).getId());
user.setModifyDate(new Date());
UserService userService = new UserServiceImpl();
if (userService.modify(user)) {
resp.sendRedirect(req.getContextPath() + "/jsp/user.do?method=query");
} else {
req.getRequestDispatcher("usermodify.jsp").forward(req, resp);
}
}
五、查找用户数据
查找的操作相对复杂,具体可以直接看代码,都有比较详细的注释,这里查找用到了两张表,所以操作的时候需要注意一下。
有三种查询的方式,可以直接根据用户名查询,或者是根据用户角色查询数据,再或者是根据用户名和用户角色一起查找!
1、根据用户查找
2、根据角色查找
3、根据用户名和用户角色共同查找
记录时间:2021年1月30日