MyBatis第五课 银行账户管理系统网站开发

Posted 笔触狂放

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis第五课 银行账户管理系统网站开发相关的知识,希望对你有一定的参考价值。

概念

本文是根据Jsp以及Servlet课程,结合MyBatis框架的综合运用,开发一个小项目网站,使用MVC+三层架构的项目搭建方式来编写本文文章。

1.数据库的创建

本文使用mysql数据搭建数据库的平台,开发软件使用Navicat软件。打开软件后,创建数据库名称为mydb,在该数据库中创建表account,表的字段为:

请阅读者根据该图创建数据库表,并添加模拟数据

2.搭建网站项目配置环境以及创建MVC架构

打开idea开发软件,新建动态网站项目,并将mybatis框架的配置文件导入项目,将所需要的架包放入lib文件夹,该过程如果有初学者还未掌握的,请查看

【MyBatis】第一课 MyBatis的框架的搭建和使用_笔触狂放的博客-CSDN博客

本篇文章进行搭建好项目。

然后将项目按照MVC+三层架构的方式搭建项目

 

3.完成首页jsp文件

在web文件夹下,新建index.jsp文件,如果存在该文件,则不需再创建。在该文件中编写html代码,完成简单的html页面。

index.jsp代码如下


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>首页</title>
  </head>
  <body>
  <%--快捷键tab,代码自动补全--%>
  <div align="center">
    <h1>银行账户管理系统</h1>
    <a href="addAccount.jsp">开户</a>&nbsp;&nbsp;<a href="AccountListServlet">查询</a>
  </div>
  </body>
</html>

 将项目进行初步运行,部署在tomcat服务器上,配置tomcat的运行步骤,初学者如果还未掌握请查阅【Java】Idea软件配置tomcat以及创建web项目步骤_笔触狂放的博客-CSDN博客_tomcat怎么添加web项目

本篇文章的介绍。

4.新增账户信息

在controoler控制层中 新建Servlet类AccountServlet,因Servlet属于tomcat服务器的api架包,需先导入jsp-api.jar,servlet-api.jar包才能使用。

即AccountServlet代码如下:

package com.account.controller;

import com.account.service.AccountServiceImp;
import com.account.service.IAccountService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

@WebServlet(urlPatterns = "/AccountServlet")
public class AccountServlet extends HttpServlet 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        //接收浏览器提交了六个数据
        Map<String, String[]> infos = request.getParameterMap();
        //把数据提交给业务逻辑层做处理
        IAccountService service=new AccountServiceImp();
        int i = service.addAccount(infos);
        if (i>0)
            //说明新增了一个账户,跳转回首页
            response.sendRedirect("index.jsp");
        
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        this.doPost(request, response);
    

 该控制层需要访问业务逻辑层,接口文件为IAccountService,实现类为AccountServiceImp

 IAccountService.java

package com.account.service;

import java.util.List;
import java.util.Map;

/**
 * 业务逻辑层
 */
public interface IAccountService 
    //添加账户
    int addAccount(Map<String,String[]> map);
   


AccountServiceImp.java

package com.account.service;

import com.account.dao.IAccountDao;
import com.account.util.DBUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 业务逻辑层,对数据进行处理和加工
 */
public class AccountServiceImp implements IAccountService 
    //alt+enter
    @Override
    public int addAccount(Map<String, String[]> map) 
        Map<String,Object> m=new HashMap<>();
        for (Map.Entry<String,String[]> e:map.entrySet()) 
            m.put(e.getKey(),e.getValue()[0]);
        
        int i = DBUtil.dao.add(m);
        //做事务的提交
        DBUtil.sqlSession.commit();
        return i;
    

    

工具类代码如下:

DBUtils.java

package com.account.util;

import com.account.dao.IAccountDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class DBUtil 

    public static SqlSession sqlSession=null;
    public static IAccountDao dao=null;

    static 
        //要加载MyBatis框架
        //1.将主配置文件转换成输入流
        try 
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSession = new SqlSessionFactoryBuilder().build(is).openSession();
            dao = sqlSession.getMapper(IAccountDao.class);
         catch (IOException e) 
            e.printStackTrace();
        
    

 在dao层中新建IAccountDao

 IAccountDao.java代码如下

package com.account.dao;

import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 * 使用MyBatis框架作为dao层,用于操作sql语句做增删改查
 */
public interface IAccountDao 

    //执行添加账户的操作
    @Insert("insert into account values(#id,#password,#name,#personid,#balance,#opendate)")
    int add(Map<String,Object> map);



打开主配置文件mybatis-config.xml,将dao层中的java注解的mybatis的接口文件完整包的路径加入主配置文件

接着可以运行项目至tomcat服务器上

最后能回到首页,说明添加成功了,可以刷新数据库表中的数据,观察是否数据已添加成功。 

5.查询账户信息功能

通过点击首页的查询超链接,向AccountListServlet发送get请求,

 AccountListServlet收到请求后,向业务逻辑层发送执行任务,并将返回值存储起来

package com.account.controller;

import com.account.service.AccountServiceImp;
import com.account.service.IAccountService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

@WebServlet(urlPatterns = "/AccountListServlet")
public class AccountListServlet extends HttpServlet 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        //收到浏览器的请求,完成获得数据库中所有账户信息
        IAccountService service=new AccountServiceImp();
        List<Map<String, Object>> accounts = service.getAccounts();
        //将查询出来的所有账户信息存储起来
        request.getSession().setAttribute("accounts",accounts);
        //跳转至展示列表信息的页面
        response.sendRedirect("showList.jsp");
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        this.doPost(request, response);
    

 业务逻辑层中IAccountService代码如下:

//获得所有账户信息
    List<Map<String,Object>> getAccounts();

业务逻辑层中AccountServiceImp代码如下:

 @Override
    public List<Map<String, Object>> getAccounts() 
        return DBUtil.dao.getAccounts();
    

数据访问层中IAccountDao代码如下:

//查询所有账户信息
    @Select("select * from account")
    List<Map<String,Object>> getAccounts();

在控制层接收到查询的数据后,发送到页面上进行展示在表格上

<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>账户信息列表</title>
</head>
<body>
<%--获得所有账户信息--%>
<% List<Map<String,Object>> accounts=(List<Map<String,Object>>)session.getAttribute("accounts");%>
<div align="center">
    <table border="1" style="border-collapse: collapse;text-align: center;width: 1000px;">
        <tr>
            <th>账号</th>
            <th>密码</th>
            <th>姓名</th>
            <th>身份证号</th>
            <th>余额</th>
            <th>开户日期</th>
            <th>操作</th>
        </tr>
        <% for (int i = 0; i <accounts.size() ; i++) %>
        <tr>
            <td><%=accounts.get(i).get("id")%></td>
            <td><%=accounts.get(i).get("password")%></td>
            <td><%=accounts.get(i).get("name")%></td>
            <td><%=accounts.get(i).get("personid")%></td>
            <td ><%=accounts.get(i).get("balance").toString()%></td>
            <td><%=accounts.get(i).get("opendate")%></td>
            <td><a href="updateAccount.jsp?index=<%=i%>">修改</a>&nbsp;<a href="DeleteServlet?id=<%=accounts.get(i).get("id")%>">删除</a></td>
        </tr>
        <%%>
    </table>
</div>
</body>
</html>

显示效果如下:

6.完成修改账户信息功能

通过点击账户信息列表上的修改超链接,将当期那要修改的账户信息对应的下标发送到修改页面,并在修改页面上获得下标值,以及从session中获得列表数据信息,根据下标从列表集合中获得要修改的账户信息,展示在修改页面上。

updateAccount.jsp代码如下:
<%@ page import="java.util.Map" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>更新账户</title>
</head>
<body>
<%--获得要修改的账户信息对应的下标--%>
<% int index=Integer.parseInt(request.getParameter("index"));%>
<%--从session中获得所有账户信息--%>
<% List<Map<String,Object>> accounts=(List<Map<String,Object>>)session.getAttribute("accounts");%>
    <div align="center">
        <form action="UpdateServlet" method="post">
            <table border="1" style="text-align: center;border-collapse: collapse">
                <tr>
                    <td colspan="2"><h3>修改账户</h3></td>
                </tr>
                <tr>
                    <td>账号</td>
                    <td><input type="text" name="id" value="<%=accounts.get(index).get("id")%>"></td>
                </tr>
                <tr>
                    <td>密码</td>
                    <td><input type="password" name="password" value="<%=accounts.get(index).get("password")%>"></td>
                </tr>
                <tr>
                    <td>姓名</td>
                    <td><input type="text" name="name" value="<%=accounts.get(index).get("name")%>"></td>
                </tr>
                <tr>
                    <td>身份证号</td>
                    <td><input type="text" name="personid" value="<%=accounts.get(index).get("personid")%>"></td>
                </tr>
                <tr>
                    <td>余额</td>
                    <td><input type="number" name="balance" value="<%=accounts.get(index).get("balance")%>"></td>
                </tr>
                <tr>
                    <td>开户日期</td>
                    <td><input type="text" name="opendate" value="<%=accounts.get(index).get("opendate")%>"></td>
                </tr>
                <tr>
                    <td colspan="2"><input type="submit" value="修改"></td>
                </tr>
            </table>
        </form>
    </div>
</body>
</html>

效果图如下:

 当用户修改信息后,将修改后的数据进行提交给控制层的UpdateServlet,在修改中账号不能被修改,账号作为主键id,是唯一的,也是修改执行的判断条件。

UpdateServlet代码如下:

package com.account.controller;

import com.account.service.AccountServiceImp;
import com.account.service.IAccountService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

@WebServlet(urlPatterns = "/UpdateServlet")
public class UpdateServlet extends HttpServlet 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        Map<String, String[]> parameterMap = request.getParameterMap();
        //发送给业务逻辑层
        IAccountService service=new AccountServiceImp();
        int i = service.update(parameterMap);
        if (i>0)
            //修改成功,同步刷新浏览器
            response.sendRedirect("AccountListServlet");
        
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        this.doPost(request, response);
    

UpdateServlet将接收到浏览器提交的修改的数据后,一并封装发送给业务逻辑层进行处理

IAccountService代码如下:
//修改账户信息
    int update(Map<String,String[]> map);
AccountServiceImp代码如下:
@Override
    public int update(Map<String, String[]> map) 
        Map<String,Object> m=new HashMap<>();
        for (Map.Entry<String,String[]> e:map.entrySet()) 
            m.put(e.getKey(),e.getValue()[0]);
        
        int i = DBUtil.dao.update(m);
        DBUtil.sqlSession.commit();
        return i;
    

数据访问层中IAccountDao对应的执行的方法如下:

//修改账户信息
    @Update("update account set password=#password,name=#name," +
            "personid=#personid,balance=#balance," +
            "opendate=#opendate where id=#id")
    int update(Map<String,Object> map);

在修改成功之后,控制层将跳转调度至账户信息列表页面,显示修改后的数据信息。

7.完成删除账户信息功能

点击账户信息列表中的“删除”超链接,将要删除的账户信息的账号作为删除的条件发送给控制层DeleteServlet,控制层接收到数据后,将数据发送给业务逻辑层进行处理

package com.account.controller;

import com.account.service.AccountServiceImp;
import com.account.service.IAccountService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = "/DeleteServlet")
public class DeleteServlet extends HttpServlet 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        //获得浏览器通过点击删除,发送过来的账户账号
        String id = request.getParameter("id");
        //传给业务逻辑层,要求业务逻辑层完成删除功能
        IAccountService service=new AccountServiceImp();
        int i = service.delete(Integer.parseInt(id));
        if (i>0)
            //删除成功,刷新浏览器页面
            response.sendRedirect("AccountListServlet");
        
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        this.doPost(request, response);
    

 IAccountService代码如下:
//删除账户
    int delete(int id);
AccountServiceImp代码如下:
 @Override
    public int delete(int id) 
        int i = DBUtil.dao.delete(id);
        DBUtil.sqlSession.commit();
        return i;
    

 数据访问层中IAccountDao对应的执行的方法如下:

//删除账户
    @Delete("delete from account where id=#id")
    int delete(@Param("id")int id);

在执行完成之后,控制层判断是否执行删除成功,删除成功后,账户信息列表页面应同步刷新。

总结

本篇文章使用Java注解的方式配置MyBatis框架作为持久层操作数据库连接,以MVC三层架构的方式搭建项目环境,配合Jsp+Servlet的方式完成了整个项目简单的增删改查的功能,对于初学者来说是一个非常适合的综合练习的案例,欢迎读者进行访问和学习,熟练掌握技术,把眼前的路铺平,远处的路才能走的更稳。

以上是关于MyBatis第五课 银行账户管理系统网站开发的主要内容,如果未能解决你的问题,请参考以下文章

第五课作业

第五课_课后习题解答

C++ 第五章 个人银行账户管理程序案例

基于Spring MVC + Spring + MyBatis的银行账户信息管理系统

基于Spring MVC + Spring + MyBatis的银行账户信息管理系统

hadoop第五课:java开发Map/Reduce