目录
五、SSM整合
1 基础springmvc文件:
pom.xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--通过spring框架,直接封装对象为JSON类型数据-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
<!--用于文件上传:-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- 阿里云 oss存储文件,如果java版本在9以上,还需要添加别的依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.0</version>
</dependency>
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">
<!-- 新创建的xml头部一定要是4.0版本的,如果不是可以去官网复制-->
<display-name>Archetype Created Web Application</display-name>
<!-- 利用字符编码过滤器设置字符编码格式-->
<filter>
<!-- Spring框架提供的字符编码过滤器,起名为CharacterEncodingFilter-->
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- 设置字符编码格式为UTF-8 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<!-- 强行设置编码格式-->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- /*代表所有的文件都要经过字符编码过滤器,包括jsp文件-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>lwl</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 如果是一个maven项目:那这里的classpath:就是要去main下面的resources里面去寻找对应的文件-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>lwl</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc.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"
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 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.lwl.controller"></context:component-scan>
<!--
因为DispatcherServlet请求映射配置为"/",所以这里需要开放页面静态资源
-->
<mvc:default-servlet-handler/>
<!--注解驱动-->
<mvc:annotation-driven >
<!-- 全局配置时间转换器 -->
<mvc:message-converters>
<!-- jackson 2.5.x -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"></constructor-arg>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 文件上传需要用到的bean,这里的代码不需要修改-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
</beans>
2 Spring+Spring整合
①先加入springmvc需要用到的jar包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<!-- 声明一下spring版本号,避免spring和springmvc的版本号差异出现异常-->
<spring.version>5.3.1</spring.version>
</properties>
<dependencies>
<!-- ****************************************** -->
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<!-- 调用的时候要使用$符号来进行调用-->
<version>${spring.version}</version>
</dependency>
<!-- 如果依赖的库中没有web模块,也要把web模块添加进来-->
<!--springMVC核心模块,也要保证版本一致性-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
②编写spring的配置文件
web.xml:
<!--
识别spring的配置文件,因为spring默认的配置文件是在webapp下的WEB-INF中,默认的名字为applicationContext.xml
这里为了符合maven的开发规范,所以要配置到resources中,所以需要起一个别名
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
spring.xml:
<context:component-scan base-package="com.lwl.mapper,com.lwl.service,com.lwl.exceptionhandler"></context:component-scan>
③配置监听器
<!-- 这里和spring整合时,一定要加监听器,监听Spring框架-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这样就把spring和springmvc整合在一起了,可以简单运行一下试试效果。
3 mybatis整合
①加入mybatis和数据库mysql要用到的jar包
<!-- mybatis的包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- mybatsi-spring整合的包 -->
<dependency>
<groupId>org.singledog</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.3</version>
</dependency>
<!-- mysql的jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据源: 数据库连接池,第三方数据库连接池,druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.13</version>
</dependency>
<!-- spring-jdbc也会被调用-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
②在spring.xml中配置连接池数据源、sql工厂、以及扫描接口
<!--
设置数据源
驱动里面的,name="driverClassName"是固定的值
-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test_zzz_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"></property>
<property name="username" value="你的数据库名字"></property>
<property name="password" value="你的数据库密码"></property>
<!--初始化值-->
<!-- <property name="initialSize" value="3" />-->
<!--最小空余的数量-->
<!-- <property name="minIdle" value="3" />-->
<!--最大连接数量-->
<!-- <property name="maxActive" value="20" />-->
<!--最长等待时间-->
<!-- <property name="maxWait" value="60000" />-->
<!--配置监控器-->
<!--<property name="filters" value="stat,wall" />-->
</bean>
sql工厂:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 对应mapper文件的位置,扫描包下所有的xml文件 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
扫描接口:
<!--
识别mybatis的接口,为mybatis接口创建代理类,并且把代理类交给spring管理
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lwl.mapper"></property>
<!-- 下面这个属性可以省略,他会自动匹配-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
这样mybatis也整合好了
4 测试整合效果:
SSM中controller-->service-->dao(mapper),所以写逻辑时,可以先从controller写起。
这里还使用了不使用分页插件的方法来进行分页
实体类(User)对应数据库表(t_user)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
}
分页使用到的数据写为实体类:
@Datapublic class MyPage {
/**
* layui传递过来的当前的页数
*/
private Integer page = 1;
/**
* layui传递过来的每页显示几条数据
*/
private Integer limit = 10;
}
Controller:
@Controller
public class UserController {
@Autowired
private UserServiceImpl userService;
@GetMapping("findAll")
@ResponseBody
public List<User> findAll(MyPage page){
return userService.findAll(page);
}
}
service接口及service实现类:
public interface IUserService {
List<User> findAll(MyPage page);
}
//标记为业务处理层,以便Controller进行调用
@Service
public class UserServiceImpl implements IUserService{
@Autowired//按照类型进行注入
private UserMap userMap;
@Override
public List<User> findAll(MyPage page) {
int start = (page.getPage() - 1) * page.getLimit();
return userMap.findAll(start,page.getLimit());
}
}
dao(mapper)接口及对应的mapper映射文件
//将该接口注入交给spring来进行管理,因为有代理类,所以注解才能写在接口上面,表明是一个持久层的数据
// 这里注入之后,才可以在服务层进行调用
@Repository
public interface UserMap {
List<User> findAll(@Param("start") Integer start, @Param("limit")Integer limit);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lwl.mapper.UserMap">
<select id="findAll" resultType="com.lwl.entity.User">
select * from t_user limit #{start},#{limit}
</select>
</mapper>
然后运行可以看到结果
5 分页插件
①加入需要的jar包
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
②在spring.xml中的sqlsessionfactory中配置分页插件
sqlSessionFactory这个bean中有plugins属性,所以插件需要放在这里
<!-- sqlSessionFactory这个bean中有plugins属性,所以插件需要放在这里-->
<!-- 分页插件-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor"></bean>
</array>
</property>
③分页插件的使用
插件的使用一般都是在service层
Controller层:
@Controller
public class UserController {
@Autowired
private UserServiceImpl userService;
@GetMapping("findAll")
@ResponseBody
public PageInfo findAll(MyPage page){
return userService.findAll(page);
}
service层:
PageInfo findAll(MyPage page);
@Autowired//按照类型进行注入
private UserMap userMap;
@Override
public PageInfo findAll(MyPage page) {
PageHelper.startPage(page.getPage(), page.getLimit());
List<User> all = userMap.findAll();
PageInfo pageInfo = new PageInfo(all);
return pageInfo;
}
dao层:
@Repository
public interface UserMap extends Mapper<User> {
List<User> findAll();
}
<select id="findAll" resultType="com.lwl.entity.User">
select * from t_user
</select>
6 日志信息
日志信息有两种方法:
1)使用mybatis自带的日志信息打印(推荐)
①创建mybatisConfig.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">
<!-- *****************************这里整个就是配置文件************************* -->
<!--配置文件的头部,一般是固定的,而且需要引入mybatis的jar包,这里才不会报错-->
<configuration>
<!-- 这里是mybatis自带的设置打印执行的SQL语句-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
② 在sqlSessionFactory中进行配置
<!-- mybatis自带的打印日志插件-->
<property name="configLocation" value="classpath:mybatisConfig.xml"></property>
利用上面的案例进行测试即可
2)使用log4j2.xml进行打印日志信息
①加入jar包
<!-- web容器中需要添加log4j-web -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.11.1</version>
</dependency>
②创建log4j2.xml文件进行编写
这里注意,这个文件名是不可以修改的
这里只需要修改的是要扫描的dao层接口包:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置LoggerConfig,即Appenders的日志级别为WARN -->
<Configuration status="WARN">
<!-- Appenders支持配置多个Appender,支持向不同的目标输送日志,本例为配置向控制台输出 -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<!-- Loggers支持配置多个Logger,可引用不同的目标Appender,也可根据业务需求定制特定要求的Appender -->
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
<!--展示sql语句 name里面添加的是dao接口所在的包-->
<logger name="com.lwl.mapper" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
</Loggers>
</Configuration>
利用上面的案例进行测试即可
7 通用Mapper插件
①加入jar包
<!-- 通用的mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
②在spring.xml中修改配置文件
把org.mybatis.spring.mapper.MapperScannerConfigurer换成tk.mybatis.spring.mapper.MapperScannerConfigurer
<!--
识别mybatis的接口,为mybatis接口创建代理类,并且把代理类交给spring管理
在SSM中配置通用的Mapper使用的tk.mybatis.spring.mapper.MapperScannerConfigurer
而不是org.mybatis.spring.mapper.MapperScannerConfigurer,注意区分
-->
<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">-->
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lwl.mapper"></property>
<!-- 下面这个属性可以省略,他会自动匹配-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
③设置dao接口的对应的数据库表
// 在SSM中配置通用的Mapper使用的包是tk.mybatis.mapper.common.Mapper;
// 而不是org.apache.ibatis.annotations.Mapper;
@Repository
public interface UserMap extends Mapper<User> {
List<User> findAll();
}
设置对应的实体类表
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "t_user")
public class User {
@Id
private Integer id;
private String username;
private String password;
}
对通用Mapper插件进行测试
Controller层:
@GetMapping("queryAllByMapper")
@ResponseBody
public List<User> findAllByMapper(){
return userService.findAllbyMapper();
}
service层:
List<User> findAllbyMapper();
@Autowired//按照类型进行注入
private UserMap userMap;
@Override
public List<User> findAllbyMapper() {
return userMap.selectAll();
}