整合Mybatis、Spring、SpringMVC
简单概述一下SSM它们各个的实现方式跟总结,方便更好的理解整合原理。
Mybatis
1.我们的Mybatis简单来说就是用来操作数据库写一些语句配mapping操作数据库,第一步就是导入依赖,然后再resource文件下创建一个mybatis.config ,正常使用就是把我们以前使用jdbc连接数据库的代码写上,驱动、账号、密码配置,然后我们写一个接口写一个查询的方法,然后创建一个Mybatis-Config.xml 再mapper中配置好语句设置好返回类型跟参数,然后就是通过sqlsessionfuctory来执行语句。
Spring
1.如果说Mybatis操作数据库的话,我们的Spring就类似于操作实体类一样,Spring中有俩种思想,俩种模式,一个是IOC反转思想,一个是AOP面向切面编程。在IOC反转思想就是,我们通过设置给属性或者对象设置set,然后我们在用户层调用set直接设置对象然后get就可以获取到在spring中我们直接把实现接口bean上通过测试就可以获取这个接口的实现方法或者属性。
SpringMVC
1.前面俩个一个是操作数据库一个是类似操作实体类,SpringMVC就是操作视图层,通过Controller,SpringMVC在SSM整个项目中占据重要地位,我们导入SpringMVC依赖然后,建一个普通项目并且添加web,然后我们配置web下面的xml中注册DispatcherServlet,然后配置下面的init-param绑定resource下面的配置文件,我们里面的配置要写在里面所以要前后交互需要将俩个配置文件进行关联,然后给对应的selvt创建对应的mapping 设置/意思是使所有页面都会走到这个地方,然后我们在resource下面设置自动扫描,设置注解驱动,设置静态资源过滤,设置视图解析器,然后我们通过注解就可以跟我们设置的jsp页面进行交互。
SSM整合总流程(细致)
第一步创建一个项目,添加web,并且设置成如下的目录格式:
第二步导入所有需要的依赖
<dependencies>
<!-- mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
<!-- Mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
第三步展示数据库
第四步创建实体类封装使其的所有属性跟数据库的字段对应
package com.xs.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;
}
第五步在Dao层写增删改查的接口并且映射到Mapper中
package com.xs.dao;
import com.xs.pojo.books;
import java.util.List;
public interface Modelbooks {
//增加一本书
int InsertBook(books books);
//删除一本书
int DeleteBookById(int id);
//修改一本书
int UpdateBook(books books);
//查找一本书
books SelectBookById(int id);
//查找所有的书
List<books> SelectBooks();
}
映射到mapper文件
<?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.xs.dao.Modelbooks">
<!-- 增加一本书-->
<insert id="InsertBook" parameterType="com.xs.pojo.books">
insert into books (bookName, bookCounts, detail)
values (#{bookName}, #{bookCounts}, #{detail});
</insert>
<!-- 删除一本书-->
<delete id="DeleteBookById" parameterType="int">
delete
from books
where bookid = #{id};
</delete>
<!-- 修改一本书-->
<update id="UpdateBook" parameterType="com.xs.pojo.books">
update books
set bookName=#{bookName},
bookCounts=#{bookCounts},
detail=#{detail}
where bookid = #{bookid}
</update>
<!-- 查找一本书-->
<select id="SelectBookById" parameterType="int" resultType="com.xs.pojo.books">
select *
from where bookid=#{id};
</select>
<!-- 查找所有的书-->
<select id="SelectBooks" resultType="com.xs.pojo.books">
select *
from books;
</select>
</mapper>
然后创建Mybatis-config.xml把mapper配置到文件中
<?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>
<mappers>
<mapper resource="com/xs/dao/ModelbooksMapper.xml"/>
</mappers>
</configuration>
第六步 Spirng整合Mybatis连接数据库
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 关联数据库配置文件-->
<context:property-placeholder location="classpath:database.properties"/>
<!-- 链接c3p0数据库连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<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下的所有包 我们不用再继承实体类了 不用配bean之后 service直接就可以获取到-->
<property name="basePackage" value="com.xs.dao"/>
</bean>
</beans>
第七步创建Service层业务层,用业务层调用Dao层,里面也写着同样的方法
然后我们通过Spring中的IOC反转中的Set格式,通过业务层创建Dao层对象然后把Dao层的增删改查的方法都实现了个复用过程返回给Service中的方法,然后我们通过调用Service就可以调用Dao层的方法。
package com.xs.service;
import com.xs.dao.Modelbooks;
import com.xs.pojo.books;
import java.util.List;
public class bookServiceImpl implements bookService{
//我们的业务层调DAO层
private Modelbooks modelbooks;
public void setModelbooks(Modelbooks modelbooks) {
this.modelbooks = modelbooks;
}
@Override
public int InsertBook(books books) {
return modelbooks.InsertBook(books);
}
@Override
public int DeleteBookById(int id) {
return modelbooks.DeleteBookById(id);
}
@Override
public int UpdateBook(books books) {
return modelbooks.UpdateBook(books);
}
@Override
public books SelectBookById(int id) {
return modelbooks.SelectBookById(id);
}
@Override
public List<books> SelectBooks() {
return modelbooks.SelectBooks();
}
}
第八步配置Spring-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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 插入自动扫描-->
<context:component-scan base-package="com.xs.service"/>
<bean id="bookServiceImpl" class="com.xs.service.bookServiceImpl">
<property name="modelbooks" ref="modelbooks"/>
</bean>
<!-- 声明式事务配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
</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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.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.xs.Controller"/>
<!--注解驱动-->
<mvc:annotation-driven/>
<!-- 静态资源过滤-->
<mvc:default-servlet-handler/>
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
第十步,(重要),一些隐形的bug存在其中
把三个配置文件导入到一个总AppactionContext.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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<import resource="classpath:spring-dao.xml"/>
<import resource="classpath:spring-Service.xml"/>
<import resource="classpath:springmvc-servlet.xml"/>
</beans>
然后把web下面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">
<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:AppactionContext.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
第十一步在Controller中创建Controller测试类
package com.xs.Controller;
import com.xs.pojo.books;
import com.xs.service.bookService;
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.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired//自动装配
@Qualifier("bookServiceImpl")
private bookService bookService;
@RequestMapping("/cxbook")
public String getTest(Model model){
List<books> books = bookService.SelectBooks();
model.addAttribute("list",books);
return "/test";
}
}
第十一步运行测试
总结:
此整合的核心在,我们配置了dao的配置连接数据库,并且设置了自动扫描dao包下的类使我们Spring-service配置bean的时候连接上数据库,所以当我们调用这个配置的bean的时候就可以直接获取数据库的连接。此处就是这处比较难理解。还有就是我们通过service层创建了跟dao层同样的方法接口,然后创建一个实现类继承接口继承方法,然后通过IOC反转set个dao层的接口对象,然后通过return的方式将dao层接口对象中的方法返回给service层的方法,这样就是实现了我们调用service中的方法就等于调用了dao层的方法并且通过走Mpper执行sql语句,实际上就是业务层调dao层的方式,任何项目都要遵循业务层调dao层的原则。