环境要求:
环境:
IDEA
MySQL 5.7.19
Tomcat 9
Maven 3.6
要求:
需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;
简单的数据库环境创建:
CREATE DATABASE ssmbuild
USE ssmbuild
CREATE TABLE IF NOT EXISTS books(
`bookid` INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘书id‘,
`bookname` VARCHAR(10) NOT NULL COMMENT ‘书名‘,
`bookcounts` INT(4) NOT NULL COMMENT ‘书数量‘,
`detail` VARCHAR(20) NOT NULL COMMENT ‘描述‘,
PRIMARY KEY (`bookid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO books(`bookname`,`bookcounts`,`detail`)
VALUES(‘Java‘,1,‘从入门到放弃‘),
(‘MySQL‘,10,‘从删库到跑路‘),
(‘Linux‘,5,‘从进门到进牢‘)
使用maven创建项目,并导入如下依赖:
<dependencies>
<!--以下依赖必须要有-->
<!--数据库连接驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--数据源jar 与下面c3p0作用一致-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!--spring-mybatis整合jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--servlet jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<!--mybatis jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--spring jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!--数据库源jar包,可以使用其他源-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--spring aop切面jar包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<!--jsp jar包-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!--以下jar非必需-->
<!--调试jar包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--日志 jar包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--注解jar包,实体类省去get,set代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<!--json转换jar包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
<!--jstl jar包-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--便准包-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
并且配置maven资源过滤:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
首先POJP实体类的创建,属性和数据库表的字段匹配:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
private int bookId;
private String bookName;
private int bookCount;
private String detail;
}
数据库连接层的配置:dao层接口创建,配置对应mapper文件(sql语句),配置mybtis文件,使用spring配置数据库源和连接数据库:
1,dao层接口(bookDao)的创建
package com.hys.dao;
import com.hys.pojo.Book;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface bookDao {
public void addBook(Book book);
public void deleteBookById(@Param("bookId") int id);
public void updateBook(Book book);
public Book queryBookById(@Param("bookId") int id);
public List<Book> queryBooks();
}
2,配置对应mapper文件(bookDao.xml),即调取bookDao接口的方法,配置对应sql语句
<mapper namespace="com.hys.dao.bookDao">
<select id="addBook" parameterType="book">
insert into ssmbuild.books(bookname, bookcount, detail) VALUES (#{bookName},#{bookCount},#{detail})
</select>
<delete id="deleteBookById" parameterType="int">
delete from ssmbuild.books where bookid=#{bookId}
</delete>
<update id="updateBook" parameterType="book">
update ssmbuild.books
set bookname=#{bookName},bookcount=#{bookCount},detail=#{detail}
where bookid=#{bookId}
</update>
<select id="queryBookById" resultType="book">
select * from ssmbuild.books where bookid=#{bookId}
</select>
<select id="queryBooks" resultType="book">
select * from ssmbuild.books
</select>
</mapper>
3,mybtis文件(mybatis-config.xml)配置,这里配置很简单,因为和spring整合,主要配置在spring文件
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="com.hys.pojo"/>
</typeAliases>
</configuration>
4,spring文件(dao-beans.xml)配置,配置数据源,注册sqlseesion工厂类,注册自动扫描类MapperScannerConfigurer,这个类动态代理实现bookDao接口实例创建
<!--spring文件获取配置文件属性,值的配置-->
<context:property-placeholder location="classpath:db.properties"/>
<!--连接数据库源,这里使用c3p0-->
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<property name="autoCommitOnClose" value="false"/>
<property name="checkoutTimeout" value="100000"/>
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!--声明事务支持 dataSource 确定要了要对哪个数据源进行事务支持-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="sourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--生成sqlseeion工厂,并且关联mybatis文件-->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 自动扫描,动态创建dao层接口实例,只要其他类实现了dao层接口,就可以直接使用该接口的方法,service层可以直接调用!
省去了,额外创建一个具体类供给service层类调用!
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--必须有以下两个属性-->
<property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"/>
<property name="basePackage" value="com.hys.dao"/>
</bean>
service层类的构建已经文件配置
1,创建service层接口(serviceBook),以及对应实现类(serviceBookImp),srevice主要是调用dao层接口(bookDao)
serviceBook:
public interface serviceBook {
public void addBook(Book book);
public void deleteBookById(int id);
public void updateBook(Book book);
public Book queryBookById(int id);
public List<Book> queryBooks();
}
serviceBookImp
public class serviceBookImp implements serviceBook{
private bookDao bookDao;
public void setBookDao( bookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void addBook(Book book) {
bookDao.addBook(book);
}
@Override
public void deleteBookById(int id) {
bookDao.deleteBookById(id);
}
@Override
public void updateBook(Book book) {
bookDao.updateBook(book);
}
@Override
public Book queryBookById(int id) {
return bookDao.queryBookById(id);
}
@Override
public List<Book> queryBooks() {
return bookDao.queryBooks();
}
}
service层的spring文件(service-beans.xml)配置,主要是注册这个类serviceBookImp,这里实际可以使用注解进行操作
<bean class="com.hys.service.serviceBookImp" id="serviceBookImp">
<property name="bookDao" ref="bookDao"/>
</bean>
controller层类创建以及对应spring文件
controller层类(bookController)的创建, 主要是连接前端以及调取service层(serviceBookImp)
这个类的通过set 注入了serviceBookImp
每个方法对应前端的请求
@Controller
//连接前端,父路径/book
@RequestMapping("/book")
public class bookController {
private serviceBook serviceBook;
//自动装配
@Autowired
@Qualifier("serviceBookImp")
public void setServiceBook(serviceBookImp serviceBookImp) {
this.serviceBook = serviceBookImp;
}
//连接前端 ,子路径/getallbook
@RequestMapping("/getAllBook")
public String getAllBooks(Model model) throws JsonProcessingException {
List<Book> books = serviceBook.queryBooks();
model.addAttribute(books);
return "allbooks";
}
@RequestMapping("/toUpdate")
public String toUpdateBook(int id,Model model) throws JsonProcessingException {
Book book = serviceBook.queryBookById(id);
model.addAttribute(book);
return "updatebook";
}
@RequestMapping("/update")
public String updateBook(int bookId,String bookName,int bookCount ,String detail) throws JsonProcessingException {
//serviceBook.addBook(new Book(4,"航海王",10,"伟大世界"));
serviceBook.updateBook(new Book(bookId,bookName,bookCount,detail));
return "redirect:/book/getAllBook";
}
@RequestMapping("/toDelete")
public String toDeleteBook(int id,Model model) throws JsonProcessingException {
serviceBook.deleteBookById(id);
return "redirect:/book/getAllBook";
}
@RequestMapping("/toAddBook")
public String toAddBook() throws JsonProcessingException {
return "addBook";
}
@RequestMapping("/addBook")
public String addBook(Book book) throws JsonProcessingException {
serviceBook.addBook(book);
return "redirect:/book/getAllBook";
}
}
对应spring文件(mvc-beans.xml)的配置:
<!--扫描对应包下的自动注册的注解-->
<context:component-scan base-package="com.hys.controller"/>
<!--过滤静态资源-->
<mvc:default-servlet-handler/>
<!--实现注解配置 -->
<mvc:annotation-driven/>
<context:annotation-config/>
<!--视图解析器,controller层方法返回的string会进行解析-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
spring文件都已配置,很多网站都配置在一起了,这里分层分开配,比较清晰,最后整合这些配置文件到一个文件(applicationContext.xml):
<import resource="classpath:service-beans.xml"/>
<import resource="classpath:dao-beans.xml"/>
<import resource="classpath:mvc-beans.xml"/>
web.xml配置
web.xml是配置servlet的,springmvc只要需要一个servlet,前端控制器,如下
同时也配了过滤器,防止乱码,使用了spring自带的过滤器
<!--前端控制器,分发所有前端的请求,已经返回响应给前端-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--过滤器-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最后是前端页面的配置,很简单,前端知识太菜了。。~这些前端页面是如何跳转的,请查看对应jsp的跳转指向,以及controller类(bookController)的代码
index.jsp 首页,有一个查看所有书籍的跳转:
<body>
<div style="font-size: 30px;margin: auto;text-align: center">
<a style="text-decoration: none" href="${pageContext.request.contextPath}/book/getAllBook" >书籍跳转 </a>
</div>
</body>
allbooks.jsp 如下,可以增加书籍,已经带现有书籍的修改以及删除
<body>
<h1>
<a style="text-decoration: none;font-size: 20px;color: orange" href="${pageContext.request.contextPath}/book/toAddBook" >增加书籍</a>
</h1>
<table >
<thead>
<tr>编号 </tr>
<tr>书名 </tr>
<tr>  数量 </tr>
<tr> 描述 </tr>
<tr> 操作</tr>
</thead>
<c:forEach var="book" items="${bookList}" >
<tr>
<td>${book.bookId} </td>
<td>${book.bookName} </td>
<td>${book.bookCount} </td>
<td>${book.detail} </td>
<td>
<a href="${pageContext.request.contextPath}/book/toUpdate?id=${book.bookId}" >修改</a>
</td>
<td> | </td>
<td>
<a href="${pageContext.request.contextPath}/book/toDelete?id=${book.bookId}">删除</a>
</td>
</tr>
</c:forEach>
</table>
</body>
对应页面如下:
updatebook.jsp页面代码如下:
<body>
<form action="${pageContext.request.contextPath}/book/update" method="get">
<input type="hidden" name="bookId" value="${book.bookId}">
<input type="text" name="bookName" value="${book.bookName}" required>
<input type="text" name="bookCount" value="${book.bookCount}" required>
<input type="text" name="detail" value="${book.detail}" required>
<input type="submit" value="确认更新书籍">
</form>
</body>
页面如下:
addBook.jsp添加书籍页面代码如下:
<body>
<form action="${pageContext.request.contextPath}/book/addBook" method="get">
<input type="text" name="bookName" value="" required>
<input type="text" name="bookCount" value="" required>
<input type="text" name="detail" value="" required>
<input type="submit" value="确认增加书籍">
</form>
</body>
页面:
原文:https://www.cnblogs.com/carry-huang/p/15232901.html