mybatis實現簡易圖書管理系統

一、圖書管理系統實現的功能介紹

這裏我們要實現普通用戶和系統管理員的登錄、借書還書功能、購買圖書功能、展示所有圖書的狀態(借出、借出時間是否超期、超期後產生的滯納金的計算等等)。我這裏最初實現的是登錄和查詢功能。

二、數據庫表結構的創建

首先,我們需在在數據庫中建幾張所需要的表,如下圖所示。
在這裏插入圖片描述
建好表之後,需要往表裏面插入相應的值。這裏我就不作具體演示,具體的建表語句和插入數據的語句如下:

CREATE TABLE IF NOT EXISTS tb_book(
 book_id INT(11) PRIMARY KEY AUTO_INCREMENT,
 book_name VARCHAR(20),
 price DOUBLE(15,2),
 store INT(11),
 des VARCHAR(50),
 book_type VARCHAR(20)
 )
INSERT INTO tb_library VALUES(1,'高等數學',35.00,20,'大學必修課,很難的','數學'),
(2,'高分子',25.00,30,'反正比高中的分子結構要難','化學'),
(3,'機器人制作',55.00,10,'與科技接軌','科技'),
(4,'走進江蘇',29.00,20,'認識江蘇','人文'),
(5,'新視野英語',15.00,50,'學習新視野,穩過四六級','英語'),
(6,'喀斯特地貌',16.00,30,'瞭解自然的地貌','地理');

CREATE TABLE IF NOT EXISTS tb_borrow(
 book_id INT(11),
 borrow_id INT(11),
 borrow_date DATE,
 back_date DATE,
 delay_money DOUBLE(15,2)
)

CREATE TABLE IF NOT EXISTS tb_user(
 user_id INT(11) PRIMARY KEY AUTO_INCREMENT,
 user_name VARCHAR(10),
 pwd VARCHAR(20),
 grade INT(11),
 phone VARCHAR(11),
 user_type VARCHAR(10)
)

INSERT INTO tb_user VALUES(1,'admin','admin',1,'15269584852','管理員'),
(2,'lily','lily',2,'13215469850','學生'),
(3,'mark','mark',2,'15269847593','學生'),
(4,'green','green',3,'13265987485','學生'),
(5,'black','black',3,'18569598784','學生');

CREATE TABLE IF NOT EXISTS tb_bookType(
 type_id INT(11) PRIMARY KEY AUTO_INCREMENT,
 type_name VARCHAR(10),
 default_date INT(11),
 delay_money_per_day DOUBLE(15,2)
)
INSERT INTO tb_booktype VALUES(1,'科技',7,2.50),
(2,'地理',10,1.20),
(3,'人文',7,1.50),
(4,'數學',15,3.00),
(5,'英語',15,3.50),
(6,'化學',10,2.80);

建好表結構以後,接下來就需要進入idea的一些設置

三、idea的環境搭建

idea環境搭建我這裏就不多做贅述,可以參考我上一篇的來進行配置。我們直接開始進行代碼部分,首先來做一下登錄模塊。

四、實現登錄功能

首先進行dao層的搭建,再此之前,我們可以把實體類都建好,如下圖:
在這裏插入圖片描述
實體類裏的getter、setter方法,有參無參構造以及tospring方法的重寫,全都碼一遍。下面再開始dao層的搭建。
在dao層,需要建一個UserDao接口,裏面放一個獲取用戶信息的方法:

public interface UserDao {
    User getUserByNameAndPwd(@Param("name") String name,@Param("pwd") String pwd);
}

然後建一個UserDao.xml文件進行配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kgc.kb07.dao.user.UserDao">
    <select id="getUserByNameAndPwd" resultType="user">
        select * from tb_user where user_name=#{name} and pwd=#{pwd};
    </select>
</mapper>

這裏面的內容也很簡單,直接就寫一個查詢語句,根據用戶名和密碼,返回一個user對象,當然這裏的user是在mybatis.xml
文件中設置好的別名。
接下來在service層同樣建一個UserService接口,裏面也只是放一個方法:

public interface UserService {
    User login(String user_name,String pwd);
}

下面在service層實現類中,就需要進行具體的需求分析判斷了:

public class UserServiceImpl implements UserService {
    Logger logger=Logger.getLogger(UserServiceImpl.class);
    private SqlSession session;
    @Override
    public User login(String user_name, String pwd) {
        session= MapperConfig.getSession(true);
        User user=session.getMapper(UserDao.class).getUserByNameAndPwd(user_name,pwd);
        session.close();
        if(user==null){
            logger.error("查不到該用戶!");
            return null;
        }
        return user;
    }
}

通過session對象來調用dao層的方法,這裏的session對象的獲取方法,也是在工具類中設置好的,前一篇都有講解具體設置步驟。
service層獲取到用戶對象之後,就要和前端頁面進行交互,就需要一個servlet進行連接,首先建一個UserServlet類,
繼承一下HttpServlet,重寫一下里面的service方法,然後要在web.xml中進行相關配置。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>cn.kgc.kb07.servlet.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/login.do</url-pattern>
    </servlet-mapping>
    <servlet>
</web-app>
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user_name=req.getParameter("user_name");
        String pwd=req.getParameter("pwd");
        UserService service=new UserServiceImpl();
        User user=service.login(user_name,pwd);
        if(user!=null){
            if(user.getUser_type().equals("管理員")){
                req.getSession().setAttribute("user",user);
                resp.sendRedirect("manage.jsp");
            }else if(user.getUser_type().equals("學生")) {
                req.getSession().setAttribute("user", user);
                resp.sendRedirect("choose.jsp");
            }
        }else {
            req.getSession().setAttribute("msg","用戶不存在!");
            resp.sendRedirect("index.jsp");
        }
    }
}

這裏的servlet層直接根據頁面返回的用戶名和密碼,通過service層判斷是否可以查詢的到,如果查詢不到,就跳回原界面,進行再次輸入;如果查詢的到,需要根據用戶的類型,學生和管理員分別進入不同頁面。
登錄頁面也很簡單,直接使用c標籤獲取servlet層的返回結果。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>圖書館首頁</title>
  </head>
  <body>
  <c:if test="${user==null}">
    <c:out value="${msg}"></c:out>
  <form action="login.do" method="post">
    <p>用戶名:<input type="text" name="user_name"></p>
    <p>密碼:<input type="password" name="pwd"></p>
    <p><input type="submit"></p>
  </form>
  </c:if>
  </body>
</html>

這裏是用戶登錄不成功返回的首頁,進行繼續登錄。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>選擇頁面</title>
</head>
<body>
<p><input type="button" value="購書" onclick="window.location.href='buy.jsp'"></p>
<p><input type="button" value="借書" onclick="window.location.href='borrow.jsp'"></p>
<p><input type="button" value="還書" onclick="window.location.href='back.jsp'"></p>
</body>
</html>

這是學生登錄後可以進行的操作,學生可以選擇購書、借書、還書操作(此功能暫不實現)。

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>管理員頁面</title>
</head>
<body>
<c:if test="${lists==null}">
<form action="show.do" method="post">
    <p>書名:<input type="text" name="book_name">
        用戶名:<input type="text" name="user_name">
        圖書類型:<input type="text" name="book_type">
        <input type="submit" value="查詢"></p>
</form>
</c:if>
<c:if test="${lists!=null}">
    <c:forEach items="${lists}" var="list">
        <p>${list.book_id}</p>
    </c:forEach>
</c:if>
</body>
<script>
</script>
</html>

這裏管理員的頁面,可以根據不同屬性進行圖書的查詢(這裏是根據圖書的名稱,借書人的名字,圖書的類來查詢)。
接下來,我們要對此功能進行實現。

五、圖書的查詢展示

同樣進行相同的操作,在dao層建一個BookDao的接口,裏面放一個方法:

public interface BookDao {
    List<Book> show(@Param("book_name") String book_name,
                      @Param("user_name") String user_name,
                      @Param("book_type") String book_type);
}

再建一個BookDao.xml文件再進行配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kgc.kb07.dao.book.BookDao">
    <select id="show" resultType="book">
        SELECT b1.*,b2.`borrow_id`,u.user_name  //這裏爲了方便展示,將user_name和borrow_id寫做book的屬性,所以返回值類型是book就可以
	FROM tb_book b1,tb_borrow b2,tb_user u
	WHERE b1.`book_id`=b2.`book_id`
	AND b2.`borrow_id`=u.`user_id`
        <if test="book_name!=null and book_name!=''">
        and b1.book_name like concat('%',#{book_name},'%')
        </if>
        <if test="user_name!=null and user_name!=''">
         and u.user_name like concat('%',#{user_name},'%')
        </if>
        <if test="book_type!=null and book_type!=''">
        and b1.book_type like concat('%',#{book_type},'%')
        </if>
    </select>
</mapper>

這裏使用動態Sql實現模糊查詢的功能。
同樣service層和實現類進行相同的操作:

public interface BookService {
    List<Book> showBooks(String book_name,String user_name,String book_type);
}
public class BookServiceImpl implements BookService {
    Logger logger=Logger.getLogger(UserServiceImpl.class);
    private SqlSession session;
    @Override
    public List<Book> showBooks(String book_name,String user_name,String book_type) {
        session= MapperConfig.getSession(true);
        List<Book> lists=session.getMapper(BookDao.class).show(book_name,user_name,book_type);
        session.close();
        if(lists==null) {
            return null;
        }
        return lists;
    }

}

接着就是web.xml和servlet層的配置:

<servlet>
    <servlet-name>bookServlet</servlet-name>
    <servlet-class>cn.kgc.kb07.servlet.BookServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>bookServlet</servlet-name>
    <url-pattern>/show.do</url-pattern>
</servlet-mapping>
public class BookServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        String book_name=req.getParameter("book_name");
        String user_name=req.getParameter("user_name");
        String book_type=req.getParameter("book_type");
        BookService service=new BookServiceImpl();
        List<Book>lists =service.showBooks(book_name,user_name,book_type);
        if(lists==null){
            req.getSession().setAttribute("msg","查不到該書信息");
            resp.sendRedirect("error.jsp");
        }else {
            req.getSession().setAttribute("lists",lists);
            req.getSession().setAttribute("book_name",book_name);
	    req.getSession().setAttribute("user_name",user_name);
	    req.getSession().setAttribute("book_type",book_type);
            resp.sendRedirect("manage.jsp");
        }
    }

這裏面對請求和響應都進行一下字符編碼的配置,防止出現中文亂碼。
這樣獲取到lists對象後,就可以在頁面進行展示了。
manage.jsp的頁面爲:

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>管理員頁面</title>
</head>
<body>
<c:if test="${lists==null}">
<form action="show.do" method="post">
    <p>書名:<input type="text" name="book_name">
        用戶名:<input type="text" name="user_name">
        圖書類型:<input type="text" name="book_type">
        <input type="submit" value="查詢"></p>
</form>
</c:if>
<c:if test="${lists!=null}">
<p>書名:<input type="text" value="${book_name}">
    借書人:<input type="text" value="${user_name}">
    圖書類型:<input type="text" value="${book_type}">
</p>
    <table border="1">
        <tr>
            <th>圖書編號</th>
            <th>圖書名稱</th>
            <th>圖書價格</th>
            <th>圖書類型</th>
            <th>圖書庫存</th>
            <th>圖書描述</th>
            <th>借書人姓名</th>
        </tr>
    <c:forEach items="${lists}" var="list">
        <tr>
            <td>${list.book_id}</td>
            <td>${list.book_name}</td>
            <td>${list.price}</td>
            <td>${list.book_type}</td>
            <td>${list.store}</td>
            <td>${list.des}</td>
            <td>${list.user_name}</td>
        </tr>
    </c:forEach>
    </table>
</c:if>
</body>
<script>
</script>
</html>

同樣也是採用c標籤的形式獲取servlet層傳過來的對象,使用c:forEach來循環打印結果。
這裏我們使用模糊查詢,來顯示圖書信息:
書名:高 借書人:不填 圖書類型:學
直接在Mysql中可以查到的結果是:
在這裏插入圖片描述
可以看到顯示兩條信息,在頁面中,我們實際來看一下效果:
在這裏插入圖片描述
可以看到頁面中也是顯示兩條結果,證明我們的頁面代碼沒有任何問題。
這樣我們就簡單實現了圖書管理系統的登錄和查詢圖書信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章