使用springMVC和MyBatis搭建图书借阅系统实例
目录
1.准备jar包
配置好tomcat+eclipse环境,配置好MySQL服务
本文中,tomcat 9.0.43+java version 15.0.1
根据需要选择合适版本的jar包
如果是maven
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MyGroup</groupId>
<artifactId>Combined</artifactId>
<version>beta</version>
<packaging>war</packaging>
<name>tst</name>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
</project>
2.创建MySQL数据库
数据库的名字叫“d”。
use d;
drop table if EXISTS records;
drop table if EXISTS booklist;
drop table if EXISTS userlist;
CREATE TABLE booklist(
id int(10) primary key auto_increment,
name VARCHAR(40) not null,
rent bit(1) DEFAULT 0,
comment VARCHAR(500)
);
CREATE TABLE userlist(
uid int(10) primary key auto_increment,
name VARCHAR(25) not null UNIQUE,
password VARCHAR(30) not null
);
CREATE TABLE records(
rid int(10) primary key auto_increment,
bid int(10) not null,
uid int(10) not null,
name VARCHAR(25) not null,
returningbooks bit(1) not null,
date DATE not null,
FOREIGN KEY (uid) REFERENCES userlist(uid),
FOREIGN KEY (bid) REFERENCES booklist(id)
);
INSERT into booklist values(153245,"my book",DEFAULT,null);
INSERT into booklist values(DEFAULT,"another book",DEFAULT,null);
INSERT into userlist values(8438,"my user","123456");
INSERT into records values(9927584,153245,8438,"my user",0,"2021-03-03");
INSERT into records values(DEFAULT,153245,8438,"my user",1,"2021-03-09");
3.数据库层
pojo和util:
package databaseInterface;
import java.util.List;
public class Book {
private int id;
private String name;
private boolean rent;
private String comment;
private List<Record> records;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isRent() {
return rent;
}
public void setRent(boolean rent) {
this.rent = rent;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public List<Record> getRecords() {
return records;
}
public void setRecords(List<Record> records) {
this.records = records;
}
@Override
public String toString() {
String s = "[Book name: "+name+"] [Book id: "+id+"] comment:: "+comment+" rent: "+ rent ;
if(records!=null) {
s+= "---rentRecords: \n";
for(Record r : records) {
s+=r.toString();
}
}
return s+"\n";
}
}
package databaseInterface;
import java.util.Date;
public class Record {
private int rid;
private int bid;
private int uid;
private String name;
private boolean returningbooks;
private Date date;
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public int getRid() {
return rid;
}
public void setRid(int rid) {
this.rid = rid;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isReturningbooks() {
return returningbooks;
}
public void setReturningbooks(boolean returningbooks) {
this.returningbooks = returningbooks;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
if(isReturningbooks())return "USER "+uid+" HAS RETURNED A BOOK ON DATE "+ date +" record ID "+ rid + " ("+name + "<<<"+bid+")\n";
return "USER "+uid+" HAS BORROWED A BOOK ON DATE "+ date +" record ID "+ rid + " ("+name + ">>>"+bid+")\n";
}
}
package databaseInterface;
public class User {
private int uid;
private String name;
private String password;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package databaseInterface;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class util {
private static SqlSessionFactory factory;
static ThreadLocal<SqlSession> tr;
static {
try {
InputStream is = Resources.getResourceAsStream("batisconf.xml");
factory = new SqlSessionFactoryBuilder().build(is);
tr = new ThreadLocal<>();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSession() {
if(tr.get()==null)tr.set( factory.openSession());
return tr.get();
}
public static void closeSession(SqlSession s) {
if(s==null)return;
if(tr.get()==null)tr.set(s);
else s.close();
}
}
Mybatis Config
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="Book" type="databaseInterface.Book"/><!-- 实体类别名配置 -->
<typeAlias alias="Record" type="databaseInterface.Record"/><!-- 实体类别名配置 -->
<typeAlias alias="User" type="databaseInterface.User"/><!-- 实体类别名配置 -->
</typeAliases>
<environments default="development">
<environment id="development">
<!--使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/d?characterEncoding=utf-8"/>
<!--自己的访问名和密码,这是我的!-->
<property name="username" value="alapaka"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 引入映射配置文件 -->
<mappers>
<package name="mappackage"/>
</mappers>
</configuration>
Mappers将sql语句对应到java函数进行执行,配置Mappers
<?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="mappackage.InterfaceMapper">
<resultMap id="mymap" type="book">
<id property="rid" column="rid"/>
<result property="uid" column="uid"/>
<result property="bid" column="bid"/>
<result property="name" column="name"/>
<result property="returningbooks" column="returningbooks"/>
<result property="date" column="date"/>
</resultMap>
<resultMap id="myRecordMap" type="record">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="rent" column="rent"/>
<result property="comment" column="comment"/>
<collection property="records" select="mappackage.InterfaceMapper.selectRecordByBookId" column="id"></collection>
</resultMap>
<select id="selectByBookId" parameterType="int" resultMap="mymap">
select * from booklist where id = #{bookId}
</select>
<select id="selectBook" parameterType="int" resultMap="mymap">
select * from booklist
<where>
<if test="bookId!=null&&bookId!=0">and id = #{bookId}</if>
<if test="bookName!=null&&bookName!=''">and name = #{bookName}</if>
<if test="rent!=null">and rent = #{rent}</if>
<if test="comment!=null&&comment!=''">and comment = #{comment}</if>
</where>
limit #{start},#{scope}
</select>
<select id="selectRecordByBookId" parameterType="int" resultType="Record">
select * from records where bid = #{bookId}
</select>
<select id="selectUser" resultType="User">
select * from userlist where name=#{username} and password=#{password}
</select>
<select id="selectUserById" resultType="User">
select * from userlist where id=#{id}
</select>
<select id="selectUserByName" resultType="User">
select * from userlist where name=#{username}
</select>
<select id="selectRecord" parameterType="int" resultMap="myRecordMap">
select * from records
<where>
<if test="recordId!=null&&recordId!=0">and rid = #{recordId}</if>
<if test="bookId!=null&&bookId!=0">and bid = #{bookId}</if>
<if test="userId!=null&&userId!=0">and uid = #{userId}</if>
<if test="username!=null&&username!=''">and name = #{username}</if>
<if test="returningBooks!=null">and returningbooks = #{returningBooks}</if>
<if test="date!=null&&date!=''">and date = #{date}</if>
</where>
limit #{start},#{scope}
</select>
<insert id="insertBook">
insert into booklist values(default,#{bookName},default,#{comment})
</insert>
<insert id="insertUser">
insert into userlist values(default,#{username},#{password})
</insert>
<insert id="insertRecord">
insert into records values(default,#{bookId},#{userId},#{username},#{returningBooks},#{date})
</insert>
<update id="updateBook" parameterType="int">
update booklist set rent = #{to_code} where id = #{bookId}
</update>
</mapper>
- .xml文件和.java文件的文件名,文中函数名要匹配,才能生成代理类执行
package mappackage;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import databaseInterface.Book;
import databaseInterface.User;
public interface InterfaceMapper {
List<Book> selectByBookId(@Param("bookId")int id);
List<Book> selectBook(@Param("bookId")int bookId, @Param("bookName")String bookName,
@Param("rent")boolean rent, @Param("comment")String comment, @Param("start")int start, @Param("scope")int scope);
List<Record> selectRecordByBookId(@Param("bookId")int id);
List<databaseInterface.Record> selectRecord(@Param("recordId")int recordId,@Param("bookId")int bookId,@Param("userId")int userId,@Param("username")String userName,
@Param("returningBooks")boolean returnningBooks, @Param("date")String date, @Param("start")int start, @Param("scope")int scope);
List<User> selectUser(@Param("username")String name, @Param("password")String pwd);
List<User> selectUserByName(@Param("username")String name);
List<User> selectUserById(@Param("id")int id);
int insertBook (@Param("bookName")String bookName, @Param("comment")String comment);
int insertUser(@Param("username")String name, @Param("password")String pwd);
int insertRecord(@Param("bookId")int bookId,@Param("userId")int userId,
@Param("username")String username, @Param("returningBooks")boolean returnningBooks, @Param("date")String date);
int updateBook(@Param("bookId")int bookID,@Param("to_code")int i);
}
4.服务层
用springMVC调用controller,配置springMVC和web.xml
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>springmvc123</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 拦截设置 -->
<servlet-mapping>
<servlet-name>springmvc123</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--将字符编码改为utf-8防止乱码,可选-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
springMVC.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="checkService" class="controller.CheckController"></bean>
<bean id="loginService" class="controller.LoginController"></bean>
<bean id="registerService" class="controller.RegisterController"></bean>
<bean id="newBookService" class="controller.NewBookController"></bean>
<bean id="recordService" class="controller.RecordController"></bean>
<bean id="newRecordService" class="controller.NewRecordController"></bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
<property name="urlMap">
<map>
<entry key="getChecked" value-ref="checkService"></entry>
<entry key="getRecords" value-ref="recordService"></entry>
<entry key="login" value-ref="loginService"></entry>
<entry key="reg" value-ref="registerService"></entry>
<entry key="newbook" value-ref="newBookService"></entry>
<entry key="newrecord" value-ref="newRecordService">
<!--前面是url,后面是服务名和上面beans一一对应-->
</entry>
</map>
</property>
</bean>
<mvc:interceptors>
<bean class="interceptor.MyInterceptor"></bean>
</mvc:interceptors>
</beans>
按顺序配置各个controller
CheckController
package controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.session.SqlSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import databaseInterface.Book;
import mappackage.InterfaceMapper;
public class CheckController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
System.out.println("---------------check now---------------------");
//getting paras for SELECT
HttpSession session = arg0.getSession();
int start = (int) session.getAttribute("start");
int scope = (int) session.getAttribute("scope");
//System.out.println(scope);
if(arg0.getParameter("start")!=null&&!arg0.getParameter("start").equals(""))start=Integer.parseInt(arg0.getParameter("start"));
if(arg0.getParameter("scope")!=null&&!arg0.getParameter("scope").equals(""))scope=Integer.parseInt(arg0.getParameter("scope"));
if(arg0.getParameter("p")!=null&&!arg0.getParameter("p").equals(""))start=Integer.parseInt(arg0.getParameter("p"));
//System.out.println(scope);
start-=1;//符合网页访问习惯
if(start<0)start=0;
Integer id = 0;
if(!arg0.getParameter("bookid").equals(""))id = Integer.parseInt( arg0.getParameter("bookid"));
String name = arg0.getParameter("bookname");
boolean rent = false;
if(arg0.getParameter("rent")!=null)rent=true;
String comment = arg0.getParameter("comment");
//SELECT in MySQL :::::::::start page->start No. here
SqlSession ss = databaseInterface.util.getSession();
InterfaceMapper mapper = ss.getMapper(mappackage.InterfaceMapper.class);
List<Book> fls = mapper.selectBook(id, name, rent, comment, start*scope, scope);
/*System.out.println("id"+id);
System.out.println("name"+name);
System.out.println("rent"+rent);
System.out.println("comment"+comment);
System.out.println("start"+start);
System.out.println("scope"+scope);
System.out.println("p"+arg0.getParameter("p"));
System.out.println("n"+arg0.getParameter("n"));*/
//returning to the page
System.out.println(fls.toString());
String s = "";
for(Book i : fls) {
s+=i.toString()+"<br>";
}
if(s.length()==0)s="NO RESULT";
ModelAndView mav = new ModelAndView("page");
mav.addObject("showString", s);
mav.addObject("bookid", id);
mav.addObject("bookname", name);
mav.addObject("start", start+1);
mav.addObject("scope", scope);
mav.addObject("comment", comment);
mav.getModel().remove("rent");
if(rent==true)mav.addObject("rent", 1);
return mav;
/*arg0.setAttribute("showString", s);
arg0.setAttribute("bookid", id);
arg0.setAttribute("bookname", name);
arg0.setAttribute("start", start+1);
arg0.setAttribute("scope", scope);
arg0.removeAttribute("rent");
if(rent==true)arg0.setAttribute("rent", 1);
arg0.setAttribute("comment", comment);
arg0.getRequestDispatcher("/page.jsp").forward(arg0, arg1);
return null;*/
}
//http://localhost:8080/Combined/login.jsp
}
LoginController
package controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.session.SqlSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import databaseInterface.User;
import mappackage.InterfaceMapper;
public class LoginController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
System.out.println("--------------login link success-----------------");
arg0.setAttribute("loginWord", "");
if(arg0.getParameter("logout")!=null&&arg0.getParameter("logout").equals("true")) {
arg0.getSession().invalidate();
ModelAndView mav = new ModelAndView("login");
mav.addObject("loginWord","logout success");
return mav;
//arg0.setAttribute("loginWord", "logout success");
//arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1);
}
SqlSession ss = databaseInterface.util.getSession();
InterfaceMapper mapper = ss.getMapper(mappackage.InterfaceMapper.class);
String name = arg0.getParameter("name");
String pwd = arg0.getParameter("pwd");
List<User> fls = mapper.selectUser(name,pwd);
if(!fls.isEmpty()) {
HttpSession session = arg0.getSession();
session.setAttribute("Uname", name);
arg0.setAttribute("showString", "");
if(session.getAttribute("start")==null){
session.setAttribute("start", 1);
}
if(session.getAttribute("scope")==null){
session.setAttribute("scope", 10);
}
ModelAndView mav = new ModelAndView("main");
return mav;
}
else {
ModelAndView mav = new ModelAndView("login");
mav.addObject("loginWord","incorrect username or password");
return mav;
}
}
//http://localhost:8080/Combined/login.jsp
}
NewBookController
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import mappackage.InterfaceMapper;
public class NewBookController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
System.out.println("-----------register a new book now---------------");
//get parameters for a new book
String name = arg0.getParameter("bookname");
String comment = arg0.getParameter("comment");
ModelAndView mav = new ModelAndView("newbook");
//MySQL insert
SqlSession ss = databaseInterface.util.getSession();
InterfaceMapper mapper = ss.getMapper(mappackage.InterfaceMapper.class);
if(name!=null&&!name.equals("")) {
mapper.insertBook(name, comment);
mav.addObject("show", "new book added");
//arg0.setAttribute("show", "new book added");
}
else {
mav.addObject("show", "invalid book name");
//arg0.setAttribute("show", "invalid book name");
}
ss.commit();
//Analysis and return pages
return mav;
}
}
NewRecordController
package controller;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import databaseInterface.Book;
import databaseInterface