Spring MVC + Spring + MyBatis集成
将Spring和MyBatis进行整合,从而使用Spring依赖注入以减少代码的耦合,使用SpringMVC处理请求并作出响应。使用MyBatis更加简捷地完成数据库操作。
1. SSM整合思路分析
三层 | 表现层 | 业务层 | 持久层 |
---|---|---|---|
框架 | SpringMVC | Spring | MyBatis |
包 | Spring freamwork | spring-webmvc包 | mybatis核心包mysql驱动包连接池包 druidmybatis-spring支持包 |
配置文件 | spring-mvc.xml | applicationContext.xml | mybatis.xml关于mybatis的配置 |
- 单独使用MyBatis框架
- MyBatis整合Spring-需要Mapper实现类
- MyBatis整合Spring-Mapper接口扫描
- MyBatis整合Spring-加入Spring事务管理
- 整合SpringMVC-基本整合
- 整合SpringMVC-完成业务层调用
2.使用Maven搭建SSM项目
3. 创建项目所需包
在项目中创建所需包,如下:
#控制器包
com.zhibang.controller
#业务逻辑层包
com.zhibang.service
com.zhibang.service.impl
#持久层包
com.zhibang.dao
# vo po pojo
com.zhibang.model 或 com.zhibang.domain
#工具包 apache commons 工具类
com.zhibang.util
……
#jsp页面
Webapps
如图所示:
4. 创建外部配置文件
在resources中创建jdbc.properties配置文件:
#1.配置数据库环境(数据源 DateSource)
#1.1 mysql生产环境数据源 (数据库服务器的IP地址)
#db.driverClass=com.mysql.jdbc.Driver
#db.url=jdbc:mysql://183.12.3.45:3306/test?useUnicode=true&characterEncoding=UTF-8
#db.username=root
#db.pwd=3306
#1.2 oracle数据源
#1.3 mysql测试环境数据源 (本机数据库的IP地址)
db.driverClass=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/t_student?useUnicode=true&characterEncoding=UTF-8
db.username=root
db.pwd=3306
#2.数据库连接池druid参数
pool.maxActive=20
pool.initialSize=5
pool.maxWait=60000
pool.minIdle=10
pool.timeBetweenEvictionRunsMillis=60000
pool.minEvictableIdleTimeMillis=300000
pool.validationQuery=SELECT 'x'
pool.testWhileIdle=true
pool.testOnBorrow=false
pool.testOnReturn=false
pool.maxOpenPreparedStatements=20
pool.removeAbandoned=true
pool.removeAbandonedTimeout=1800
pool.logAbandoned=true
5. 导入依赖包
在pom.xml中导入SSM基本需要使用到的依赖包:
- MySQL数据库驱动包:mysql-connector-java
- 数据库连接池支持包:druid
- Spring及Spring MVC框架包:spring-webmvc
- MyBatis框架核心包:mybatis
- Spring对JDBC的支持包:spring-jdbc
- Spring对MyBatis支持包:mybatis-spring
<!--引入Junit单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--导入Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- 引入JSTL标签类依赖 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 引入MySQL数据库依赖 -->
<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.12</version>
</dependency>
<!--SpringMVC、spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!--Spring对JDBC的支持:因为mybatis-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- 引入MyBatis框架依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--MyBatis和Spring整合支持包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
**可选项:**在pom.xml中配置JDK版本:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
如图所示:
同时在pom.xml中设置加载Java中的静态文件代码(若Mapper.xml文件不在java中):
注意:若将XxxMapper.xml文件存放在resources/mappers中,以下代码可省略
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
修改web.xml的DTD,支持JSP2.0
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
6. 创建Spring核心配置文件
在resources中创建Spring核心配置文件applicationContext.xml,由其配置Spring MVC及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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<!--1. 注解驱动 mvc-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--2. 自动扫描com.zhibang包下所有类中的注解 context-->
<context:component-scan base-package="com.zhibang"></context:component-scan>
<!--3. 配置静态资源访问 -->
<!--静态资源的访问都通过servlet的默认处理器进行处理-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
<mvc:resources mapping="/images/**" location="/images/"></mvc:resources>
<!--4. 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前后缀 -->
<!-- prefix表示jsp路径的前缀,suffix表示jsp路径的后缀 -->
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--5. 加载外部配置文件properties-->
<context:property-placeholder location="classpath*:jdbc.properties"></context:property-placeholder>
<!--6. 配置druid数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--配置数据源四要素-->
<property name="driverClassName" value="${db.driverClass}"></property>
<property name="url" value="${db.url}"></property>
<property name="username" value="${db.username}"></property>
<property name="password" value="${db.pwd}"></property>
<!--配置druid连接池参数-->
<!-- 最大并发连接数 -->
<property name="maxActive" value="${pool.maxActive}" />
<!-- 初始化连接数量 -->
<property name="initialSize" value="${pool.initialSize}" />
</bean>
<!--7. 创建sqlSessionFactory,加载mybatis的配置文件,注入数据源 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--引入数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--加载XxxxxMapper.xml映射文件-->
<property name="mapperLocations" value="classpath*:mappers/*.xml"></property>
<!--为实体包下的类设置别名-->
<property name="typeAliasesPackage" value="com.zhibang.model"></property>
<!--加载mybatis-config.xml-->
<!--<property name="configLocation" value="classpath*:mybatis-config.xml"></property>-->
</bean>
<!--8. 向dao层接口注入sqlSessionFactory-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定SqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<!--指定自动装配的路径:cn.zhibang.dao包下面所有的类(接口)自动装配sqlSessionFactory-->
<property name="basePackage" value="com.zhibang.dao"></property>
</bean>
<!--9. 配置事务管理器 在service的impl中可以使用事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置注解式事务@Transactional 或 非注解式事务<aop:-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>
mybatis-config.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">
<configuration>
<settings>
<!-- 日志开启 -->
<setting name="logImpl" value="LOG4J2"/>
<!-- 二级缓存开启 -->
<setting name="cacheEnabled" value="true"/>
<!-- 禁用懒加载 -->
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
<!--设置别名-->
<typeAliases>
<package name="com.zhibang.ssmname.model"></package>
</typeAliases>
</configuration>
7. 创建持久类
根据数据库表t_student,在com.zhibang.model包中创建映射持久类student。
@Component
public class Student implements Serializable {
private Integer userId;
private String userName;
private String password;
private Integer age;
//封装set/get方法
}
8. 创建Dao层接口
在com.zhibang.dao包中创建student类的接口,编写CRUD方法。
@Repository
public interface StudentMapper {
/**
* 查询
*/
Public List<Student> queryStudent();
}
9. 配置Dao层映射文件
在com.zhibang.model包中创建Student类的Mapper文件:StudentMapper.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.zhibang.dao.StudentMapper">
//写增删改查
<select id="queryStudent" resultType="Student">
select * from ta_student
</select>
</mapper>
10. 创建Service层接口
在com.zhibang.service中创建Service层的接口StudentService,由Biz层继承Dao层接口,如下:
public interface StudentService {
/**
* 查询
* @return
*/
Public List<Student> queryStudent();
}
11. 创建Service层接口实现类
在com.zhibang.service.impl包中创建Service层的实现类StudentServiceImpl,如下:
@Service
public class StudentServiceimpl implements StudentService {
@Autowired
private Student student;
@Override
public List<Student> queryStudent() {
return student.queryStudent();
}
}
12. 配置web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1"
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_3_1.xsd">
<!--欢迎页面-->
<!--<welcome-file-list>-->
<!--<welcome-file>index.jsp</welcome-file>-->
<!--<welcome-file>index.html</welcome-file>-->
<!--<welcome-file>default.jsp</welcome-file>-->
<!--</welcome-file-list>-->
<!--上下文参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<!--spring监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--1.配置前端控制器-->
<servlet>
<servlet-name>ssm</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化参数,只针对DispatcherServlet-->
<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>ssm</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置druid的servlet-->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<!-- 配置请求编码UTF-8(可选)-->
<filter>
<filter-name>encode</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>encode</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
13. 编写Controller
Controller类用于对接View层,对接Biz层。
在com.zhibang.controller包中创建StudentController,如下:
@Controller
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping(value = "/student",method = RequestMethod.GET)
public String queryStudentTest() throws Exception{
System.out.println("正常执行!");
List<Student> models = studentService.queryStudent();
if(models != null){
for (Student st:models
) {
System.out.println(st);
}
return "redirect:list.jsp";
}else {
return "redirect:student";
}
}
}
14. View前端
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生信息</title>
</head>
<body>
<h2>lll</h2>
<a href="student">测试</a>
</body>
</html>
15. 乱码问题
乱码,如图所示:
配置查询数据库里面数据乱码:-Dfile.encoding=UTF-8