MyBatis学习(四)MyBatis整合SpringMVC
文章目录
示例工程:mybatis-mvc
本文档是本人在学习过程中的笔记,记录学习的过程,版权所有,转载请注明出处
1、环境搭建
1.1、新建Maven的web工程
1)使用IDEA新建一个maven的
web
工程,这里一定要是Web工程2)手工新建src/main/java和src/main/resources文件夹以及src/test目录
3)工程的结构图如下:
├── docs
│ └── db.sql
├── mybatis-mvc.iml
├── pom.xml
├── README.md
└── src
├── main
│ ├── java
│ │ └── com
│ ├── resources
│ │ └── config
│ └── webapp
│ ├── index.jsp
│ └── WEB-INF
└── test
├── java
│ └── com
└── resources
1.2、配置pom文件
1)由于开发的是web应用,因此需要引入servlet-api相关的jar包
2)我们在jsp页面上需要使用的jstl相关的标签,这里也需要引入jstl的jar包,
3)pom.xml的部分内容如下:
- pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>4.3.26.RELEASE</spring.version>
<spring.data.jpa.version>1.3.5.RELEASE</spring.data.jpa.version>
</properties>
<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!-- 引入mysql的数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- 引入MyBatis的maven jar包 -->
<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.3</version>
</dependency>
<!-- 数据库连接池策略 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring.data.jpa.version}</version>
</dependency>
<!-- 引入web开发包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
1.3、新建数据库实体、Mapper、mapper.xml
1)我们这里使用前例中的数据库相关的内容,将相关资源copy过来,如下图:
1.4、详细代码
详细代码如下所示
StudentInfoDo
package com.iambest.study.entity;
import java.util.Objects;
/**
* StudentInfoDo数据实体</br>
*
* <b>映射的是t_student_info数据库表的字段</b>
*
*/
public class StudentInfoDo {
private String id;
private String name;
private Integer age;
private String sex;
private String phone;
private String email;
private String rsv1;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getRsv1() {
return rsv1;
}
public void setRsv1(String rsv1) {
this.rsv1 = rsv1;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
StudentInfoDo that = (StudentInfoDo) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return "StudentInfoDo{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
", rsv1='" + rsv1 + '\'' +
'}';
}
}
StudentInfoMapper
package com.iambest.study.mapper;
import com.iambest.study.entity.StudentInfoDo;
import java.util.List;
/**
* 数据库Dao层
*/
public interface StudentInfoMapper {
/**
* 登记学生信息
* @param studentInfoDo
*/
public void addStudentInfo(StudentInfoDo studentInfoDo);
/**
* 更新学生信息
* @param studentInfoDo
*/
public void updateById(StudentInfoDo studentInfoDo);
/**
* 根据ID删除
* @param id
*/
public void deleteById(String id);
/**
* 根据ID进行查询
* @param id
* @return 查询的数据实体
*/
public StudentInfoDo selectById(String id);
/**
* 查询所有的记录
* @return
*/
public List<StudentInfoDo> findAll();
}
StudentInfoMapper.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.iambest.study.mapper.StudentInfoMapper">
<!-- 登记数据库表 -->
<insert id="addStudentInfo" parameterType="com.iambest.study.entity.StudentInfoDo">
insert into t_student_info (id,name,age,sex,phone,email,rsv1)
values
(#{id},#{name},#{age},#{sex},#{phone},#{email},#{rsv1})
</insert>
<!-- 根据ID更新数据库 -->
<update id="updateById" parameterType="com.iambest.study.entity.StudentInfoDo">
update t_student_info set NAME=#{name},AGE=#{age},SEX=#{sex},PHONE=#{phone},
EMAIL=#{email},RSV1=#{rsv1} where ID=#{id}
</update>
<!-- 根据ID进行删除 -->
<delete id="deleteById" parameterType="java.lang.String">
delete from t_student_info where ID=#{id}
</delete>
<!-- 根据ID查询 -->
<select id="selectById" resultType="com.iambest.study.entity.StudentInfoDo">
select id,name,age,sex,phone,email,rsv1 from t_student_info where ID=#{id}
</select>
<select id="findAll" resultType="com.iambest.study.entity.StudentInfoDo">
select id,name,age,sex,phone,email,rsv1 from t_student_info
</select>
</mapper>
2、整合SpringMVC并实现页面显示
2.1、配置Spring的核心配置文件
我们将MyBatis与SpringMVC进行整合需要解决以下的几个问题:
1)配置数据源的连接池策略,这里我们使用的是dbcp
2)配置sqlSessionFactory
3)配置MapperScannerConfigurer,开启Mapper接口扫描,指定要扫描的包路径
4)开启Spring的注解扫描
5)开启RequestMapping自动映射
6)配置视图层的请求转发
7)配置web.xml文件,加入Spring的核心控制器
spring-mvc.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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/scmema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
<!-- 引用我们的数据库的配置文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:config/db.properties"/>
</bean>
<!-- 配置数据源 -->
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
<!-- 配置sqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<!-- 扫描下面路径下的所有xml文件 -->
<property name="mapperLocations" value="classpath:config/mapper/*.xml"/>
</bean>
<!-- 开启Mapper接口扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.iambest.study.mapper"/>
</bean>
<!-- 开启spring的注解扫描,自动扫描Controller组件 -->
<context:component-scan base-package="com.iambest.study.controller;com.iambest.study.service"/>
<!-- 开启RequestMapping自动映射 -->
<mvc:annotation-driven/>
<!-- 配置请求转发 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.2、编写Service层
1)我们这里按照通用的分层方式,编写Service层的代码,实现查找所有学生信息的功能
代码如下:
StudentInfoService
package com.iambest.study.service;
import com.iambest.study.entity.StudentInfoDo;
import com.iambest.study.mapper.StudentInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentInfoService {
@Autowired
private StudentInfoMapper mapper;
public List<StudentInfoDo> findAll(){
return mapper.findAll();
}
}
2.3、编写Controller
1)编写Controller,来实现请求的处理,在处理完成后将数据返回到页面上
controller的代码如下:
StudentController
package com.iambest.study.controller;
import com.iambest.study.entity.StudentInfoDo;
import com.iambest.study.service.StudentInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
/**
*
* 学生信息控制器
*
* @author zhangwei
* @date 2020-06-03
* @since 1.0.0
* @version 1.0.0
*/
@Controller
@RequestMapping("/studentinfo")
public class StudentController {
@Autowired
private StudentInfoService studentInfoService;
@RequestMapping("/student_list.do")
public String find(Model model) {
List<StudentInfoDo> list = studentInfoService.findAll();
model.addAttribute("students",list);
return "student_list";
}
}
2.4、编写jsp页面
1)我们在spring-mvc.xml文件中已经配置了视图层的映射规则,因此我们这里需要在WEB-INF目录下新建一个名称为student_list.jsp的文件
2)在页面上,我们使用JSTL表达式循环展示后台的数据
student_list.jsp的内容如下:
- student_list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html>
<head>
<title>学生信息列表</title>
</head>
<body>
<table width="60%" border="1" cellpadding="2" cellspacing="0" align="center">
<tr>
<th>ID</th>
<th>NAME</th>
<th>AGE</th>
<th>SEX</th>
<th>PHONE</th>
<th>EMAIL</th>
<th>RSV1</th>
</tr>
<c:forEach items="${students}" var="student">
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
<td>${student.age}</td>
<td>${student.sex}</td>
<td>${student.phone}</td>
<td>${student.email}</td>
<td>${student.rsv1}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
2.5、配置Web.xml文件
1)在web.xml中我们需要配置Spring的核心控制器DispatcherServlet
2)为了防止出现乱码的情况,需要配置一个字符过滤器
内容如下:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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">
<display-name>mybatis-mvc</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置spring的核心容器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/config/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 拦截所有的.do请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 配置字符集过滤器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
2.6、部署到Tomcat并运行
1)在IDEA中配置好tomcat,并将我们的应用部署到Tomcat中,我会在另一篇文章中说明怎么配置
2)启动Tomcat,运行我们的webapp项目
Tomcat启动成功,控制台输出如下:
1)这时我们访问页面,内容展示如下,表示成功: