1.环境要求
- idea
- MySQL
- Tomcat
- Maven 3.6
要求:
- 需要熟练掌握Mysql数据库,Spring,javaWeb及mybatis知识,简单的前端知识
2. 创建一个数据库表
CREATE DATABASE ssmbuild;
USE ssmbuild;
CREATE TABLE `books`(
`bookID` INT NOT NULL AUTO_INCREMENT COMMENT '书id',
`bookName` VARCHAR(100) NOT NULL COMMENT '书名',
`bookCounts` INT NOT NULL COMMENT '数量',
`detail` VARCHAR(200) NOT NULL COMMENT '描述',
KEY `bookID`(`bookID`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢');
3. 配置依赖
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wang</groupId>
<artifactId>ssmBuild</artifactId>
<version>1.0-SNAPSHOT</version>
<!--依赖: junit, 数据库驱动, 连接池, servlet, jsp, mybatis, mybatis-spring, spring-->
<dependencies>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--数据库连接池: c3p0-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--Servlet JSP jstl 标准标签库(standard)-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<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>
<!--mybatis mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!--Spring(MVC JDBC)-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
<!--静态资源导出-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
4. 准备项目框架
在java目录下新建
- dao
- pojo
- service
- controller
在resource目录下配置mybatis和spring的核心配置文件
- mybatis-config.xml
<?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>
<!--配置数据源, 交给Spring去做-->
<!--设置别名-->
<typeAliases>
<typeAlias type="com.ding.pojo.Books" alias="Books"/>
</typeAliases>
<!--映射Mapper-->
<mappers>
<mapper resource="com/ding/dao/BookMapper.xml" />
</mappers>
</configuration>
- applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-dao.xml"/>
<import resource="sping-service.xml"/>
<import resource="spring-mvc.xml"/>
</beans>
- 在resource目录下写数据库的配置文件database.properties
jdbc.driver = com.mysql.jdbc.Driver
# 如果使用的是MySQL8.0+, 增加一个时区的配置: &serverTimezone=Asia/Shanghai
jdbc.url = jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
jdbc.username = root
jdbc.password = 123456
5. Mybatis层
1. 编写实体类
package com.wang.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;
}
2. 编写Mapper接口和xml
1. Mapping接口
package com.wang.dao;
import com.wang.pojo.Books;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BookMapping {
//增加一本书
int addBook(Books books);
//删除一本书
int deleteBookById(@Param("bookID") int id);
//更新一本书
int updateBook(Books books);
//查询一本书
Books queryBookById(@Param("bookID") int id);
//查询全部的书
List<Books> queryAllBook();
}
2. Mapping.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wang.dao.BookMapping">
<insert id="addBook" parameterType="Books">
insert into ssmbuild.books (bookName, bookCounts, detail)
VALUES (#{bookName}, #{bookCounts}, #{detail});
</insert>
<delete id="deleteBookById" parameterType="_int">
delete from ssmbuild.books where bookID = #{bookID};
</delete>
<update id="updateBook" parameterType="Books">
update ssmbuild.books
set bookName = #{bookName}, bookCounts = #{bookCounts}, detail = #{detail}
where bookID = #{bookID};
</update>
<select id="queryBookById" resultType="Books">
select * from ssmbuild.books where bookID = #{bookID};
</select>
<select id="queryAllBook" resultType="Books">
select * from ssmbuild.books;
</select>
</mapper>
注意
编写接口时, 属性为基本类型时要加上@Param("")注解, 同时此注解可以解决属性名与数据库的字段名不一致的问题
3. 编写Service层
1. 接口
import java.util.List;
public interface BookService {
//增加一本书
int addBook(Books books);
//删除一本书
int deleteBookById(int id);
//更新一本书
int updateBook(Books books);
//查询一本书
Books queryBookById(int id);
//查询全部的书
List<Books> queryAllBook();
}
2. 实现类
package com.wang.service;
import com.wang.dao.BookMapper;
import com.wang.pojo.Books;
import java.util.List;
public class BookServiceImpl implements BookService{
//service层 调 dao层: 组合dao
private BookMapping bookMapping;
//添加setter, Spring可以直接注入到mapper
public void setBookMapping(BookMapping bookMapping) {
this.bookMapping = bookMapping;
}
@Override
public int addBook(Books books) {
return bookMapping.addBook(books);
}
@Override
public int deleteBookById(int id) {
return bookMapping.deleteBookById(id);
}
@Override
public int updateBook(Books books) {
return bookMapping.updateBook(books);
}
@Override
public Books queryBookById(int id) {
return bookMapping.queryBookById(id);
}
@Override
public List<Books> queryAllBook() {
return bookMapping.queryAllBook();
}
}
注意
- 此处Service层与Dao层的接口基本一致, 但是这样做实现了分层解耦, 方便之后添加一些业务
- 在Service的实现类中, 调用dao, 同时对导入的dao编写一个Setter, 方便之后的Spring注入
4. 完善Mybatis核心配置文件
<?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>
<!--配置数据源, 交给Spring去做-->
<!--设置别名-->
<typeAliases>
<typeAlias type="com.wang.pojo.Books" alias="Books"/>
</typeAliases>
<!--映射Mapper-->
<mappers>
<mapper resource="com/wang/dap/BookMapping.xml"/>
</mappers>
</configuration>
6. Spring层
1. 配置Spring-dao.xml
<?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"
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">
<!--1. 关联数据库配置文件-->
<context:property-placeholder location="classpath:database.properties"/>
<!--2. 连接池
dbcp: 半自动化操作, 不能自动连接
c3p0: 自动化操作(自动化的加载配置文件, 并且可以自动配置到对象中!)
druid:
hikari: SpringBoot 2.X自带的
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--从properties中取出四个要素-->
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--c3p0连接池的私有属性-->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<!--关闭连接后不自动commit-->
<property name="autoCommitOnClose" value="false"/>
<!--获取连接超时时间-->
<property name="checkoutTimeout" value="10000"/>
<!--当获取失败重新尝试次数-->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!--3. SQLSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--引用数据源-->
<property name="dataSource" ref="dataSource"/>
<!--绑定Mybatis的配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--4. 配置dao接口扫描包, 动态的实现了Dao接口可以注入到Spring容器中!-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入sqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--要扫描的dao包-->
<property name="basePackage" value="com.wang.dao"/>
</bean>
</beans>
注意
- 关于Spring包扫描后的类的名字
- 如果连着两个大写的字母开头,则扫描进来的bean就是大写开头的;
如果大写开头,后面跟小写,则扫描进来的是小写开头的
- 如果连着两个大写的字母开头,则扫描进来的bean就是大写开头的;
- Spring-dao.xml要放在applicationContext的同一个上下文中, 可以在项目结构的module中配置, 也可以在applicationContext中导入
2. 配置Spring-service.xml
<?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"
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">
<!--1. 扫描Service下的包-->
<context:component-scan base-package="com.wang.service"/>
<!--2. 将我们的所有业务类注入到Spring, 可以通过配置或者注解实现-->
<bean id="BookServiceImpl" class="com.wang.service.BookServiceImpl">
<!--由于在BookServiceImpl中添加了bookMapper的实现类; 同时, 我们在Spring-dao中设置了自动扫描dao下的包, 因此我们可以直接注入-->
<property name="bookMapping" ref="bookMapping"/>
</bean>
<!--3. 声明式事务配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--4. aop事务支持(要使用aop要导入织入包)-->
</beans>
注意
- Spring-service.xml要放在applicationContext的同一个上下文中, 可以在项目结构的module中配置, 也可以在applicationContext中导入
3. 配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-dao.xml"/>
<import resource="sping-service.xml"/>
<import resource="spring-mvc.xml"/>
</beans>
7. SpringMVC层
1. 添加web框架
2. 编写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">
<!--DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--乱码过滤-->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Session: 配置Session过期时间为15分钟-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
注意
- 在DispatcherServlet中的url-pattern为 /
- 在filter中的url-pattern为 */
3. 配置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:mvc="http://www.springframework.org/schema/mvc"
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/mvc
http://www.springframework.org/schema/cache/spring-mvc.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1.注解驱动-->
<mvc:annotation-driven/>
<!-- 2.静态资源过滤-->
<mvc:default-servlet-handler/>
<!-- 3.扫描包: controller-->
<context:component-scan base-package="com.wang.controller"/>
<!-- 4.视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 5.如果要使用Jackson, 要配置统一处理乱码的问题!-->
</beans>
注意
- 配置时的约束注意结尾为mvc, 同时, .xsd中间也要改成mvc
- 视图解析器配置前缀时注意开头和结尾的 /
- 如果要使用JackSon, 在此处配置解决乱码问题
5. 添加库并配置Tomcat
在项目结构下的Artfact中, 添加一个lib目录, 将所有的库放入这个lib目录下
8. 如果出现bean不存在的排错思路#
- 查看这个bean是否注入成功! ==> idea中能跳转则成功
- Junit单元测试, 看我们的代码是否能查询出结果!
- 如果上面都没有问题, 则问题一定不在我们的底层, 是Spring出了问题!
- SpringMVC, 整合的时候没有调用我们的service层的bean:
- applicationContext.xml 没有注入bean
- web.xml中, 我们也绑定过配置文件! 看配置文件是否绑全!(applicationContext.xml)
9. 查询全部书籍#
1. 在controller中添加功能
@Controller
@RequestMapping("/book")
public class BookController {
//controller层 调 service 层
//这里使用Qualified, 指定了注入BookServiceImpl, 避免了自动装配注入对象模糊的问题
@Autowired
@Qualifier("BookServiceImpl")
private BookService bookService;
//查询全部的书籍, 并且返回到一个书籍展示页面
@RequestMapping("/allBook")
public String list(Model model) {
List<Books> list = bookService.queryAllBook();
model.addAttribute("list", list);
return "allBook";
}
//跳转到增加书籍页面
@RequestMapping("/toAddBook")
public String toAddPage() {
return "addBook";
}
//添加书籍的请求
//由于提交了表单, 可以接收到一个Books对象
@RequestMapping("/addBook")
public String addBook(Books books) {
bookService.addBook(books);
//重定向到allBook查询
return "redirect:/book/allBook";
}
//跳转到修改页面
//在前端中提交了id数据, 这里可以接收到(使用老版的方法)
//Model用来将其带给前端
@RequestMapping("/toUpdateBook")
public String toUpdatePage(int id, Model model) {
Books books = bookService.queryBookById(id);
model.addAttribute("queryResult", books);
return "updateBook";
}
//修改书籍
@RequestMapping("/updateBook")
public String updateBook(Books books) {
bookService.updateBook(books);
return "redirect:/book/allBook";
}
//删除书籍
@RequestMapping("/deleteBook/{bookID}")
public String deleteBook(@PathVariable("bookID") int id) {
bookService.deleteBookById(id);
return "redirect:/book/allBook";
}
}
注意
-
在jsp中添加了点击会跳转到/book/toAddBook的按钮, 这里会进一步跳转到addBook页面
-
/book/addBook是添加书籍的地址, 表单要提交到这里来处理!
-
添加之后, 要重定向到查询全部书籍, 使用 return "redirect:/book/allBook";
因做后端,前端部分暂时省略,详情请查看(转自):https://www.cnblogs.com/wang-sky/p/13647103.html