首先准备环境 对图书的CRUD
新建一个maven项目 添加web支持 添加pom.xml依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
创建一张图书的表
编写环境所需要的相关包
首先编写实体类 pojo
package com.cong.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;
}
编写mapper接口也叫dao层
利用注解开发 就不用了编写mapper的映射文件了 后面mybatis的核心文件也不要 了
全权交给spring配置文件去做
package com.cong.dao;
import com.cong.pojo.Books;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface BooksMapper {
// z增加一本书
@Insert("insert into books (bookName,bookCounts,detail) values (#{bookName},#{bookCounts},#{detail})")
int addBook(Books books);
//删除一本书
@Delete("delete from books where bookName=#{bookName}")
int delete(Books books);
//更新修改一本书
@Update("update books set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail} where bookID=#{bookID}")
int update(Books books);
//查询一本书
@Select("select * from books where bookName=#{bookName}")
Books queryBookById(String bookName);
//查询全部的书
@Select("select * from books")
List<Books> queryAllBook();
}
编写service接口
package com.cong.service;
import com.cong.pojo.Books;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface BooksService {
// z增加一本书
int addBook(Books books);
//删除一本书
int delete(Books books);
//更新一本书
int update(Books books);
//查询一本书
Books queryBookById(String bookName);
//查询全部的书
List<Books> queryAllBook();
}
创建service的实现类
利用注解
package com.cong.service.impl;
import com.cong.dao.BooksMapper;
import com.cong.pojo.Books;
import com.cong.service.BooksService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BooksServiceImpl implements BooksService {
// 调用dao层
@Autowired
private BooksMapper booksMapper;
@Override
public int addBook(Books books) {
return booksMapper.addBook(books);
}
@Override
public int delete(Books books) {
return booksMapper.delete(books);
}
@Override
public int update(Books books) {
return booksMapper.update(books);
}
@Override
public Books queryBookById(String bookName) {
Books books = booksMapper.queryBookById(bookName);
return books;
}
@Override
public List<Books> queryAllBook() {
return booksMapper.queryAllBook();
}
}
创建Controller层
这里包含了所有方法 用到那个说那个
package com.cong.controller;
import com.cong.pojo.Books;
import com.cong.service.BooksService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@org.springframework.stereotype.Controller
public class Controller {
//测试
@RequestMapping(value = "/test", produces = "application/json;charset=utf-8")
@ResponseBody
public String test() {
return "成功";
}
//调用service层
@Autowired
private BooksService booksService;
//查询书籍功能
@RequestMapping("/allBook")
public String findAll(Model model) {
List<Books> booksList = booksService.queryAllBook();
model.addAttribute("booksList", booksList);
System.out.println(booksList.toString());
return "allBooks";
}
//跳转到书籍添加界面
@RequestMapping("/addBook")
public String add() {
return "addBooks";
}
//添加书籍
@RequestMapping("/addBookOne")
public String addBook(Books books, Model model) {
int book = booksService.addBook(books);
System.out.println("添加了一本书名叫:" + book);
return "redirect:/allBook";//重定向到查询所有的状态
}
//跳转到修改书籍页面
@RequestMapping("/update")
public String update(String bookName, Model model) {
Books books = booksService.queryBookById(bookName);
model.addAttribute("books", books);
return "updateBooks";
}
//修改书籍 根据 相应的名字查询
@RequestMapping("/updateBook")
public String updateBook(Books books, Model model) {
int update = booksService.update(books);
return "redirect:/allBook";//重定向到查询所有的状态
}
//删除一本书 根据名字删除
@RequestMapping("/delete")
public String delete(Books books, Model model) {
int delete = booksService.delete(books);
return "redirect:/allBook";//重定向到查询所有的状态
}
}
准备配置文件的编写
1.applicationContext.xml
包括了 整合dao层和service层 添加了
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 导入springmvc的配置文件-->
<import resource="classpath:springmvc-servlet.xml"/>
<!-- 开启注解 dao和service层-->
<!--配置注解扫描-->
<context:component-scan base-package="com.cong">
<!-- 除去对controller层的扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 整合dao mapper 层 -->
<!--扫描mapper所在的包 为mapper创建实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cong.dao"/>
</bean>
<!--加载jdbc.properties文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源对象 这里用的是德鲁伊 Druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--配置sessionFactory-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- spring整和service层 -->
<!--声明式事务控制-->
<!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务增强-->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--事务的aop织入-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.cong.service.impl.*.*(..))"/>
</aop:config>
</beans>
编写spring-MVC的配置文件
包括静态资源过滤器 视图解析器 乱码问题
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 下面所有东西就不用动了 以后也不用动了 -->
<context:component-scan base-package="com.cong.controller"/>
<!-- 让Spring mvc 不处理静态资源-->
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<!-- 视图解析器 -->
<!-- 视图解析器 :DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
环境配好了 接下里该写实现了
实现查询所有的图书 Controller层
//调用service层
@Autowired
private BooksService booksService;
//查询书籍功能
@RequestMapping("/allBook")
public String findAll(Model model) {
List<Books> booksList = booksService.queryAllBook();
model.addAttribute("booksList", booksList);
System.out.println(booksList.toString());
return "allBooks";
}
service层
@Override
public List<Books> queryAllBook() {
return booksMapper.queryAllBook();
}
dao层
//查询全部的书
@Select("select * from books")
List<Books> queryAllBook();
查询出所有的书籍 转跳到展示书籍页面
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: lsc1999
Date: 2022/1/25
Time: 20:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>书籍展示页面</title>
</head>
<body>
<h1>展示账户数据列表</h1>
<table border="1">
<tr>
<th>书籍id</th>
<th>书籍名称</th>
<th>书籍数量</th>
<th>书籍描述</th>
<th>操作</th>
</tr>
<c:forEach items="${booksList}" var="account">
<tr>
<td>${account.bookID}</td>
<td>${account.bookName}</td>
<td>${account.bookCounts}</td>
<td>${account.detail}</td>
<td>
<a href="${pageContext.request.contextPath}/update?bookName=${account.bookName}">修改 </a>
|
<a href="${pageContext.request.contextPath}/delete?bookName=${account.bookName}">删除 </a>
</td>
</tr>
</c:forEach>
<form action="/index.jsp" method="post">
<input type="submit" value="返回首页">
</form>
<br>
<br>
<a href="${pageContext.request.contextPath}/addBook">书籍添加</a>
<br>
<br>
</table>
</body>
</html>
实现添加书籍页面功能
首先进入首页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
hello
<br>
<h2><a href="${pageContext.request.contextPath}/allBook" >进入书籍展示界面</a></h2>
<br>
<br>
<h2><a href="${pageContext.request.contextPath}/addBook" >进入书籍添加界面</a></h2>
</body>
</html>
转跳到添加书籍页面
controller层
//跳转到书籍添加界面
@RequestMapping("/addBook")
public String add() {
return "addBooks";
}
添加书籍页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/addBookOne" method="post">
<label>书籍名称</label><br>
<input type="text" name="bookName"/>
<br>
<br>
<label>书籍数量</label><br>
<input type="text" name="bookCounts"/>
<br>
<br>
<label>书籍描述</label><br>
<input type="text" name="detail"/>
<br>
<br>
<h3><input type="submit" value="提交"></h3>
</form>
</body>
</html>
添加的功能
//添加书籍
@RequestMapping("/addBookOne")
public String addBook(Books books, Model model) {
int book = booksService.addBook(books);
System.out.println("添加了一本书名叫:" + book);
return "redirect:/allBook";//重定向到查询所有的状态
}
添加完成之后跳转到 重新查新的首页 用的是重定向
修改和删除书籍的功能
从前端修改一本书 首先的获取这本书
<c:forEach items="${booksList}" var="account">
<tr>
<td>${account.bookID}</td>
<td>${account.bookName}</td>
<td>${account.bookCounts}</td>
<td>${account.detail}</td>
<td>
<a href="${pageContext.request.contextPath}/update?bookName=${account.bookName}">修改 </a>
|
<a href="${pageContext.request.contextPath}/delete?bookName=${account.bookName}">删除 </a>
</td>
</tr>
</c:forEach>
这样就查到了 并且修改 完后之后也返回到重新查询的首页
//修改书籍 根据 相应的名字查询
@RequestMapping("/updateBook")
public String updateBook(Books books, Model model) {
int update = booksService.update(books);
return "redirect:/allBook";//重定向到查询所有的状态
}
//删除一本书 根据名字删除
@RequestMapping("/delete")
public String delete(Books books, Model model) {
int delete = booksService.delete(books);
return "redirect:/allBook";//重定向到查询所有的状态
}
修改书籍页面
<%--
Created by IntelliJ IDEA.
User: lsc1999
Date: 2022/1/25
Time: 22:05
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改书书籍页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/updateBook" method="post">
<%-- 前端传递隐藏域 ${books.bookID} 没有这个就提交失败--%>
<input type="hidden" name="bookID" value="${books.bookID}">
<label>书籍名称</label><br>
<input type="text" name="bookName" value="${books.bookName}"/>
<br>
<br>
<label>书籍数量</label><br>
<input type="text" name="bookCounts" value="${books.bookCounts}"/>
<br>
<br>
<label>书籍描述</label><br>
<input type="text" name="detail" value="${books.detail}"/>
<br>
<br>
<h3><input type="submit" value="修改提交"></h3>
</form>
</body>
</html>
删除功能 就没什么说的了 直接删