整合
结构图:
依赖:
<dependencies>
<!--spring-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--spring操作数据库-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--注解-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--spring操作数据库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<!--springmvc-->
<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</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!--我的是GBK,此处应为False-->
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
Java
存放主要的业务代码
Pojo
最基础的层,存放元素类。
Books.java:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
private int id;
private String name;
private int counts;
private String detail;
}
Dao
最接近数据库的一层。
BookMapper.java
public interface BookMapper {
// 增加
int addBooks(Books books);
// 查询
Books queryBooks(int id);
// 更新
int updateBooks(Books books);
// 删除
int delBooks(int id);
// 查询所有
List<Books> queryAll();
// 模糊查询
List<Books> queryFuzzy(String string);
}
BookMapper.xml:
<?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="it.dao.BookMapper">
<insert id="addBooks" parameterType="books">
insert into ssmbuild.books values (#{id}, #{name}, #{counts},#{detail})
</insert>
<select id="queryBooks" resultType="books">
select * from ssmbuild.books where id=#{id}
</select>
<update id="updateBooks" parameterType="books">
update ssmbuild.books set name=#{name}, counts=#{counts}, detail=#{detail} where id=#{id}
</update>
<delete id="delBooks">
delete from ssmbuild.books where id=#{id}
</delete>
<select id="queryAll" resultType="books">
select * from ssmbuild.books
</select>
<select id="queryFuzzy" resultType="books">
select * from ssmbuild.books where name like #{string}
</select>
</mapper>
Service
利用一些Dao
的数据库的操作实现一些功能,供Controller
使用。
注意:
- 业务层不需要connection了,为什么呢?因为已经用
SqlSessionFactoryBean
注册完了,创建了SqlSession,这是mybatis的关键,同时把mapper也注入了,就可以getBean("xxxmapper")
了
BookService.java:
public interface BookService {
public int addBooks(Books books);
public Books queryBookById(int id);
public int delBookById(int id);
public int updateBook(Books books);
public List<Books> queryAll();
public List<Books> queryFuzzy(String string);
}
BookServiceImpl.java:
package it.service;
import it.dao.BookMapper;
import it.pojo.Books;
import java.util.List;
import java.awt.*;
import java.awt.print.Book;
// 可以实例化这个对象来才做,通过bean给这个类赋值bookMapper
public class BookServiceImpl implements BookService{
// 设置一个mapper私有成员变量,可以通过这个mapper调用dao的方法
private BookMapper bookMapper;
public void setBookMapper(BookMapper mapper) {
this.bookMapper = mapper;
}
public int addBooks(Books books) {
return bookMapper.addBooks(books);
}
public Books queryBookById(int id) {
return bookMapper.queryBooks(id);
}
public int delBookById(int id) {
return bookMapper.delBooks(id);
}
public int updateBook(Books books) {
return bookMapper.updateBooks(books);
}
public List<Books> queryAll() {
return bookMapper.queryAll();
}
public List<Books> queryFuzzy(String string) {
return bookMapper.queryFuzzy(string);
}
}
Controller
BookController.java:
package it.controller;
import it.pojo.Books;
import it.service.BookService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
@Controller
@RequestMapping("/book")
public class BookController {
// contriller 调 service
// 报错没有获得,但是已经可以跳转了呀
// 答:配置文件搞错了,运行的时候不被包含
@Autowired
@Qualifier("BookServiceImpl")
private BookService bookService;
@RequestMapping("/allbooks")
public String allBooks(Model model){
List<Books> books = bookService.queryAll();
model.addAttribute("booklist", books);
return "allBooks";
}
// 先到修改页面,修改页面显示原本信息
// 修改页面保存修改内容传递给修改方法
@RequestMapping("/getUpdate")
public String getUpdate(int id, Model model){
// 有id是因为要显示原本的内容
Books books = bookService.queryBookById(id);
model.addAttribute("oldMess", books);
return "update";
}
// 接受修改信息,然后跳转回全部页面
@RequestMapping("/doUpdate")
public String updateBook(Books book){
System.out.println("doupdate: " + book);
bookService.updateBook(book);
// 直接重定向
return "redirect:/book/allbooks";
}
@RequestMapping("/addBook")
public String addBook(Books book){
bookService.addBooks(book);
return "redirect:/book/allbooks";
}
// 转到点击跳转页面
@RequestMapping("/toAddPage")
public String toAddPaper(){
return "addBook";
}
// 删除
@RequestMapping(value = "/delBook/{did}", method = RequestMethod.GET)
public String doDel(@PathVariable("did") int id){
bookService.delBookById(id);
return "redirect:/book/allbooks";
}
// 模糊查询
@RequestMapping("/fuzzyQuery")
public String queryFuzzy(String queryName, Model model){
// 把name处理成模糊查询格式
String sql = "%" + queryName + "%";
System.out.println("sql" + sql);
List<Books> books = bookService.queryFuzzy(sql);
for (Books b: books){
System.out.println("books" + b);
}
if (books.size() == 0){
System.out.println("没找到");
model.addAttribute("error", "未查找到内容!");
model.addAttribute("booklist", bookService.queryAll());
return "allBooks";
}
model.addAttribute("booklist", books);
return "allBooks";
}
}
Filter
过滤器,只要解决乱码问题。
encoder.java:
public class encoder implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
filterChain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
}
}
resources
database.properties:
存放连接数据库的配置信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&userUnicode=true&characterEncoding=gbk
username=root
password=1234
mybatis-config.xml:
mybatis
的配置文件,但是大部分内容已经被Spring
架空了 ,一般还保留日志和起别名信息。
<?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="logImpl" value="LOG4J"/>
</settings>
<!--起别名-->
<typeAliases>
<package name="it.pojo"/>
</typeAliases>
</configuration>
spring-dao.xml:
负责处理数据库层的业务,在此处连接数据库的数据源、获取得SqlSessionFactoryBean
,同时通过扫描包来Dao
接口注入到Spring
容器中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!--连接数据库的数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&userUnicode=true&characterEncoding=gbk"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
<!--3. 获得SqlSessionFactoryBean-->
<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, 这里应是ref吧-->
<!--这里的参数是个String,而不是SqlSessionFactoryBean类型-->
<!--看人家方法名也知道了,是通过名字获取的-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--要扫描的包-->
<property name="basePackage" value="it.dao"/>
</bean>
</beans>
spring-mvc.xml:
支持MVC注解、不处理静态资源、自动扫描Controller
包,配置视图解析器。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--支持MVC注解驱动-->
<mvc:annotation-driven/>
<!--不处理静态资源-->
<mvc:default-servlet-handler/>
<!--自动扫描包-->
<context:component-scan base-package="it.controller"/>
<!--视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
spring-service.xml:
扫描Service
下的包,将其中的实现类注入到Spring
容器中,声明事务配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!--1. 扫描service下的包,但是有什么用呢,扫描的是啥?-->
<!--答:扫描是为注解服务的-->
<context:component-scan base-package="it.service"/>
<!--2. 将实现类注入到Spring-->
<bean id="BookServiceImpl" class="it.service.BookServiceImpl">
<property name="bookMapper" ref="bookMapper"/>
</bean>
<!--3. 声明式事务配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
applicationContext.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: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">
<import resource="spring-dao.xml"/>
<import resource="spring-mvc.xml"/>
<import resource="spring-service.xml"/>
</beans>
注意:
要在项目结构中将所有的配置信息组合到一起
Web
注意:
DiapatcherServlet
的name
一定不能是springMVC,会失效,其他都行,不知道为啥,可能跟我某个内容冲突了- 别玩了加
lib
web.xml:
功能就注册DispatchServlet
和过滤器。
<?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">
<!--1. 注册DispatchServlet-->
<servlet>
<!--这个名字就是不能用springMVC,其他都可以 -->
<servlet-name>Springmvc</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>Springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--自定义过滤器-->
<filter>
<filter-name>encoderFilter</filter-name>
<filter-class>it.filter.encoder</filter-class>
</filter>
<filter-mapping>
<filter-name>encoderFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
知识点
- 一个接口有多个实现类,@Qualifier指明@Autowired具体注入哪个实现类
- context:component-scan:扫描是为注解服务的:@Service、@Component、@Controller、@Repository修饰的类中含有@Autowired修饰的成员变量,则创建对象时会从IOC容器中取值为该成员变量赋值
- /**代表拦截所有请求
- 前端到后端要是只穿一个参数,要怎么做?只能通过url吗?不是,参数名一样也能传
- 重定向:如果是直接到jsp,就是
xxx.jsp
,如果是jsp文件夹中的,可以用mapper跳转