本文已参与「新人创作礼」活动,一起开启掘金创作之路
一、SSM各部分负责的功能
SpringMVC:负责MVC设计模式的实现。也就是客户端与Java程序之间的交互
Mybatis:负责数据持久层的实现。也就是Java程序与数据库的交互
Spring:负责管理SpringMVC和Mybatis相关对象的创建和依赖注入,同时将我们写的类交给Spring来管理
二、Maven整合SSM过程
1、创建maven工程
2、在pom,xml中添加相关的依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.11.RELEASE</version>
</dependency>
<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>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.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.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、字符编码过滤器、加载静态资源。
\
<web-app>
<display-name>Archetype Created Web Application</display-name>
<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>
<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的整合
\<beans xmlns="www.springframework.org/schema/bean…
xmlns:xsi="www.w3.org/2001/XMLSch…
xsi:schemaLocation="www.springframework.org/schema/bean…
www.springframework.org/schema/spri…
xmlns:context="www.springframework.org/schema/cont…
xmlns:p="www.springframework.org/schema/p">\
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"/>
<property name="password" value="123456"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/develop"/>
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="initialPoolSize" value="5"/>
<property name="maxPoolSize" value="10"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:com/chen/repository/*.xml"></property>
<property name="configLocation" value="classpath:mybatisConfig.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.chen.repository"/>
</bean>
</beans>
5、在mybatisConfig.xml中配置一些Mybatis的辅助信息,比如打印SQL等。
\ \<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.chen.entity"/>
</typeAliases>
</configuration>
6、配置springmvc.xml
\<beans xmlns="www.springframework.org/schema/bean…
xmlns:xsi="www.w3.org/2001/XMLSch…
xmlns:mvc="www.springframework.org/schema/mvc"…
xmlns:context="www.springframework.org/schema/cont…
xmlns:p="www.springframework.org/schema/p"\
xsi:schemaLocation="www.springframework.org/schema/bean…
www.springframework.org/schema/spri…
www.springframework.org/schema/mvc\
www.springframework.org/schema/spri…
www.springframework.org/schema/cont…
www.springframework.org/schema/spri…
<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文件
\ \<mapper namespace="com.chen.repository.CustomerRepository">
<select id="findAll" resultType="Customer">
select * from customer;
</select>
</mapper>
10、编写mapper文件与mapping做映射
public interface CustomerRepository {
public List findAll();
}
11、编写服务类接口,方便管理
public interface CustomerService {
public List findAll();
}
12、编写服务类接口实现类
@Service
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerRepository customerRepository;
@Override
public List 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="java.sun.com/jsp/jstl/co…
\ ****\ \
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版本以下即可解决
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
但是此时要注意修改spring.xml中的数据库驱动信息
<property name="driverClass" value="com.mysql.cj.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即可