一、SSM各部分负责的功能
SpringMVC:负责MVC设计模式的实现。也就是客户端与Java程序之间的交互
Mybatis:负责数据持久层的实现。也就是Java程序与数据库的交互
Spring:负责管理SpringMVC和Mybatis相关对象的创建和依赖注入,同时将我们写的类交给Spring来管理
二、Maven整合SSM过程
1、创建maven工程
2、在pom,xml中添加相关的依赖
<dependencies>
<!-- SpringMVC依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.11.RELEASE</version>
</dependency>
<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.11.RELEASE</version>
</dependency>
<!-- Spring AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.0.11.RELEASE</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--Mybatis整合Spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- Mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- C3P0连接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- ServletAPI-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
3、web.xml中配置SpringMVC、Spring、字符编码过滤器、加载静态资源。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 启动Spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置SpringMVC -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置字符编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 加载静态资源-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
</web-app>
4、在spring.xml中配置Mybatis和Spring的整合
<?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/spring-beans.xsd"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p">
<!-- 整合Mybatis -->
<!-- 配置数据库连接池信息-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--数据库用户名-->
<property name="user" value="root"/>
<!--数据库连接密码-->
<property name="password" value="123456"/>
<!--数据库连接url地址-->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/develop"/>
<!--数据库驱动-->
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<!--MySQL驱动版本6.0以下使用-->
<!--<property name="driverClass" value="com.mysql.jdbc.Driver"/>-->
<!--初始化连接数-->
<property name="initialPoolSize" value="5"/>
<!--最大连接数-->
<property name="maxPoolSize" value="10"/>
</bean>
<!-- 配置Mybatis SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源-->
<property name="dataSource" ref="dataSource"/>
<!-- 指定mapper文件的路径 -->
<property name="mapperLocations" value="classpath:com/chen/repository/*.xml"></property>
<!-- 指定mybatis的全局配置文件位置 -->
<property name="configLocation" value="classpath:mybatisConfig.xml"/>
</bean>
<!--配置扫描路径:扫描自定义的mapper接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.chen.repository"/>
</bean>
</beans>
5、在mybatisConfig.xml中配置一些Mybatis的辅助信息,比如打印SQL等。
<?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>
<!--打印SQL-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<!--指定一个报名,Mybatis会在包名下搜索需要的JavaBean-->
<package name="com.chen.entity"/>
</typeAliases>
</configuration>
6、配置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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/spring-context.xsd">
<!-- 启动注解驱动 -->
<mvc:annotation-driven/>
<!-- 扫描业务代码 -->
<context:component-scan base-package="com.chen"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
7、创建数据库表并输入测试数据
8、编写实体类dao与数据表做ORM映射
public class Customer {
private Integer id;
private String name;
private Integer age;
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
9、编写mapping.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="com.chen.repository.CustomerRepository">
<select id="findAll" resultType="Customer">
select * from customer;
</select>
</mapper>
10、编写mapper文件与mapping做映射
public interface CustomerRepository {
public List<Customer> findAll();
}
11、编写服务类接口,方便管理
public interface CustomerService {
public List<Customer> findAll();
}
12、编写服务类接口实现类
@Service
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerRepository customerRepository;
@Override
public List<Customer> findAll() {
return customerRepository.findAll();
}
}
13、编写Controller,映射请求
@Controller
@RequestMapping("/customer")
public class CustomerHandler {
@Autowired
private CustomerService customerService;
@RequestMapping("/findAll")
public ModelAndView findAll(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("showMessage");
modelAndView.addObject("list",customerService.findAll());
System.out.println(customerService.findAll());
return modelAndView;
}
}
14、编写结果展示页面showMessage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:forEach items="${list}" var="customer">
${customer.id}-----${customer.name}--------${customer.age}<br>
</c:forEach>
</body>
</html>
15、将项目部署到tomcat上去
16、启动Tomcat,访问http://localhost:8080/SSMProject_war/customer/findAll
也可以在部署项目的时候修改项目的根路径
重启Tomcat服务器,访问地址http://localhost:8080/SSMProject_war/customer/findAll改为http://localhost:8080/customer/findAll
三、启动服务器运行时可能出现的问题
1、mapper接口与mapping.xml配置文件无效绑定问题。
使用maven或Jenkins打包部署到远程服务器上时出现的绑定错误,异常信息为: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
首先,给定的异常提示信息并不精准,有多个错误原因都会抛出该异常。mybatis出现这个问题,通常是由Mapper interface和对应的xml文件的定义对应不上引起的,这时就需要仔细检查对比包名、xml中的namespace、接口中的方法名称等是否对应。
我之前就因为称忘记在xml标签的id属性中添加方法名或写错方法名而出现这个错误。
出现这个错误时,按以下步骤检查一般就会解决问题: 1:检查xml文件所在package名称是否和Mapper interface所在的包名一一对应; 2:检查xml的namespace是否和xml文件的package名称一一对应; 3:检查方法名称是否对应; 通过使用maven构建项目,并将项目war包部署到Tomcat时里面缺少Mapper对应的xml文件,也就是没有把xml文件打包进去。解决办法是,在pom.xml文件中的build标签中添加如下代码,显示的强制将xml文件打到war包中:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
2、解决无法获取数据库连接 java.sql.SQLException: Connections could not be acquired from the underlying database
由于使用的mysql是5.6.24版本,而在pom.xml中配置的是版本是8.0.11,导致驱动版本与mysql版本不一致出现无法获取sql的底层连接
修改驱动版本为当前MySQL版本以下即可解决
<!-- Mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!-- <version>8.0.11</version>--> <!--注意要与当前mysql版本对应:当前使用mysql版本为5.6.24,使用8.0.11版本驱动导致报错(无法从底层数据库获取连接) 修改为5.1.49版本或以下版本即可解决问题--> <version>5.1.49</version> </dependency>
但是此时要注意修改spring.xml中的数据库驱动信息
<!--数据库驱动-->
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<!--MySQL驱动版本6.0以下使用-->
<!--<property name="driverClass" value="com.mysql.jdbc.Driver"/>-->
MySQL6之后的版本都是要指定时区serverTimezone的
spring: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.0.100:3306/easyexcel?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: 123456
3、控制台输出的SQL语句出现中文乱码
首先修改IDEA的编码格式为UTF-8
其次修改Tomcat的参数编码格式为UTF-8:-Dfile.encoding=UTF-8
然后重启Tomcat即可