数据库
建库
#建库 if not exists:判断有没有 default charset:默认字符集 collate utf8_general_ci:排序规则
create database if not exists ssm default charset utf8mb4 collate utf8mb4_general_ci;
建表
create table if not exists books(
b_id int(11) not null auto_increment comment '书籍id',
b_name varchar(64) not null comment '书名',
b_describe varchar(200) comment '描述',
b_content longtext comment '内容',
primary key (b_id)
)engine=InnoDB default charset=utf8mb4 comment '书籍表';
创建web项目
![]()
配置
导包
<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.5</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<!-- 偷懒优化代码神器 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
<scope>provided</scope>
</dependency>
<!-- 一个一个导太麻烦,直接导入spring-webmvc包会将 aop、beans、context、core、web、webmvc等包一次导入 -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<!-- mybatis支持 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!-- 数据库驱动 向下兼容,最新的没啥问题 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<!-- spring整合mybatis包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<!-- 阿里druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<!-- springjdbc支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<!-- spring对事务的支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.5</version>
</dependency>
</dependencies>
pojo
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Books {
private Integer bId;
private String bName;
private String bDescribe;
private String bContent;
}
jdbc.properties
#名称与连接池字段命一样会报错 mysql8.0需要配置时区:serverTimezone=Asia/Shangh
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456
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>
<settings>
<!-- 开启驼峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<!-- 自动扫描pojo包,配置别名 -->
<package name="com.qc.pojo"/>
</typeAliases>
</configuration>
mapper
package com.qc.mapper;
import com.qc.pojo.Books;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author c
* @create: 2021-03-30 14:08
*/
@Repository
public interface BooksMapper {
/**
* 增加书籍
*/
public int addBook(Books books);
/**
* 删除书籍
*/
public int deleteBook(Integer bId);
/**
* 修改书籍
*/
public int updateBook(Books books);
/**
* 根据书籍id查询书籍
*/
public Books checkBook(Integer bId);
/**
* 查询所有书籍
*/
public List<Books> allBook();
}
mapper.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.qc.mapper.BooksMapper">
<!-- 增加书籍 -->
<insert id="addBook" parameterType="Books">
insert into books(b_id,b_name,b_describe,b_content) value(default,#{bName},#{bDescribe},#{bContent})
</insert>
<!-- 删除书籍 -->
<delete id="deleteBook" parameterType="integer">
delete from books
<where>
b_id = #{bId}
</where>
</delete>
<!-- 修改书籍 -->
<update id="updateBook" parameterType="Books">
update books
<set>
<if test="bName!=null">b_name = #{bName},</if>
<if test="bDescribe!=null">b_describe = #{bDescribe},</if>
<if test="bContent!=null">b_content = #{bContent},</if>
</set>
<where>
b_id = #{bId}
</where>
</update>
<!-- 根据id查询书籍 -->
<select id="checkBook" parameterType="integer" resultType="Books">
select b_id,b_name,b_describe,b_content from books
<where>
b_id = #{bId}
</where>
</select>
<select id="allBook" resultMap="allBook">
select b_id,b_name,b_describe,b_content from books
</select>
<resultMap id="allBook" type="Books">
</resultMap>
</mapper>
service
package com.qc.service;
import com.qc.pojo.Books;
import java.util.List;
/**
* @author c
* @create: 2021-03-30 16:12
*/
public interface BooksService {
/**
* 增加书籍
*/
public int addBook(Books books);
/**
* 删除书籍
*/
public int deleteBook(Integer bId);
/**
* 修改书籍
*/
public int updateBook(Books books);
/**
* 根据书籍id查询书籍
*/
public Books checkBook(Integer bId);
/**
* 查询所有书籍
*/
public List<Books> allBook();
}
service 实现
package com.qc.service.impl;
import com.qc.mapper.BooksMapper;
import com.qc.pojo.Books;
import com.qc.service.BooksService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* @author c
* @create: 2021-03-30 16:13
*/
@Service
//设置多个异常,出现这些异常就回滚事务
@Transactional(rollbackFor ={RuntimeException.class,Exception.class})
public class BooksServiceImpl implements BooksService {
@Resource
private BooksMapper booksMapper;
@Override
public int addBook(Books books) {
return booksMapper.addBook(books);
}
@Override
public int deleteBook(Integer bId) {
return booksMapper.deleteBook(bId);
}
@Override
public int updateBook(Books books) {
return booksMapper.updateBook(books);
}
@Override
//Transactional(readOnly = true)设置事务为只读
@Transactional(readOnly = true)
public Books checkBook(Integer bId) {
return booksMapper.checkBook(bId);
}
@Override
@Transactional(readOnly = true)
public List<Books> allBook() {
return booksMapper.allBook();
}
}
spring-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 加入context、aop、tx 约束 -->
<!-- 加载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>
<!-- spring整合mybatis后,由spring来创建sqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" >
<!-- 需要连接池,注入我们上面配置的连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 加载mybatis配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 加载mapper文件 /*.xml:匹配所有的mapper.xml-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- 配置mapper在那个包 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.qc.mapper"/>
</bean>
<!-- 开启扫描注解,扫描所有包下的注解 mapper在上面配置了,所以不用扫描,web快在mvc配置里单独扫描-->
<context:component-scan base-package="com.qc.service"/>
<!-- 配置声明式事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
spring-mvc.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: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/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解驱动 -->
<mvc:annotation-driven>
<!-- 返回json会乱码,处理乱码 -->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="utf-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--静态资源过滤-->
<mvc:default-servlet-handler/>
<!-- 单独扫描controller包下的注解 -->
<context:component-scan base-package="com.qc.controller"/>
<!-- 试图解析器:配置了这个 在controller只需要输入html(jsp等)名称,就会自动补全为:/WEB-INF/jsp/xx.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- web.xml初始化了这个文件,但是没有初始化spring-config.xml 我们导入它,程序在初始化的时候就会去加载 -->
<import resource="spring-config.xml"/>
</beans>
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"
metadata-complete="true">
<!-- 注册DispatcherServlet -->
<servlet>
<servlet-name>ssm</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- init-param:初始化参数 配置springmvc的配置文件,在启动的时候初始化 -->
<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>ssm</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 默认的配置DispatcherServlet屏蔽了html页面的访问,如果需要使用html你需要加上如下: -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!-- 编码过滤 -->
<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>
controller
package com.qc.controller;
import com.qc.pojo.Books;
import com.qc.service.BooksService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @author c
* @create: 2021-03-30 16:07
*/
@Controller
public class BooksController {
//注入booksService 用@Resource好像比@Autowired好一点(谁知道呢)
@Resource
private BooksService booksService;
/**
*
* @param books
* @return String
* 增加书籍
*/
@PostMapping("/addBook")
@ResponseBody
public String addBook(Books books){
int i = booksService.addBook(books);
if (i<0){return "增加失败";}
return "成功";
}
/**
* @param bId
* @return String
* restfull风格
* 删除书籍
*/
@PostMapping("/deleteBook/{bId}")
@ResponseBody
public String deleteBook(@PathVariable Integer bId){
int i = booksService.deleteBook(bId);
if (i<0){return "删除失败";}
return "删除成功";
}
/**
* @param books
* @return String
* 修改书籍
*/
@PostMapping("/updateBook")
@ResponseBody
public String updateBook(Books books){
int i = booksService.updateBook(books);
if (i<0){return "修改失败";}
return "修改成功";
}
/**
* @param bId
* @return Books
* restfull风格
* 根据id查询书籍信息
*/
@RequestMapping("/checkBook/{bId}")
@ResponseBody
public String checkBook(@PathVariable Integer bId){
Books books = booksService.checkBook(bId);
return books.toString();
}
/**
* @param model
* @return List<Books></>
* 查询所有书籍信息
*/
@RequestMapping("/allBook")
public String checkBook(Model model){
List<Books> books = booksService.allBook();
System.out.println(books);
model.addAttribute("books",books);
return "list";
}
}
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${books}
</body>
</html>
结果
懒得整了,就这样。