接下来我们使用Maven+Spring+MyBatis+SpringMVC完成一个案例,案例需求为在页面可以进行添加学生+查询所有学生!其他小功能如果有想法的读者可以自行添加,作者有更重要的事情需要做哦。
- 使用Maven创建聚合工程,并使用Maven的tomcat插件运行工程
- 使用Spring的IOC容器管理对象
- 使用MyBatis操作数据库
- 使用Spring的声明式事务进行事务管理
- 使用SpringMVC作为控制器封装Model并跳转到JSP页面展示数据
- 使用Junit测试方法
- 使用Log4j在控制台打印日志
- 创建maven父工程,添加需要的依赖和插件
- 创建dao子工程,配置MyBatis操作数据库,配置Log4j在控制台打印日志。
- 创建service子工程,配置Spring声明式事务
- 创建controller子工程,配置SpringMVC作为控制器,编写JSP页面展示数据。
- 每个子工程都使用Spring进行IOC管理
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '几何心凉', '男', '北京');
INSERT INTO `student` VALUES (2, '哈士奇', '女', '上海');
INSERT INTO `student` VALUES (3, 'SXT', '女', '上海');
INSERT INTO `student` VALUES (4, '利比亚', '男', '广州');
SET FOREIGN_KEY_CHECKS = 1;
创建maven父工程mvc_demo4,下面是添加需要的依赖和插件,算了直接放上pom.xml文件
4.0.0
com.example
mvc_demo4
1.0-SNAPSHOT
ssm_dao
ssm_service
ssm_controller
pom
mvc_demo4 Maven Webapp
https://www.example.com
5.2.12.RELEASE
UTF-8
1.7
1.7
org.mybatis
mybatis
3.5.7
mysql
mysql-connector-java
8.0.27
com.alibaba
druid
1.2.8
org.mybatis
mybatis-spring
2.0.6
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-tx
${spring.version}
org.aspectj
aspectjweaver
1.8.7
org.apache.taglibs
taglibs-standard-spec
1.2.5
org.apache.taglibs
taglibs-standard-impl
1.2.5
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
junit
junit
4.12
test
org.springframework
spring-test
${spring.version}
log4j
log4j
1.2.12
org.apache.tomcat.maven
tomcat7-maven-plugin
2.1
8080
/
UTF-8
tomcat7
%1$tH:%1$tM:%1$tS%2 $s%n%4$s: %5$s%6$s%n
目录结构如下图:
Student.java
package com.example.pojo;
public class Student {
private int id;
private String name;
private String sex;
private String address;
public Student() {
}
public Student(int id, String name, String sex, String address) {
this.id = id;
this.name = name;
this.sex = sex;
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student [ " +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
" ]";
}
}
StudentDao.java
package com.example.dao;
import com.example.pojo.Student;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface StudentDao {
// 查询所有学生
@Select("select * from student")
List findAll();
// 添加学生
@Insert("insert into student values(null,#{name},#{sex},#{address})")
void add(Student student);
}
这里有这个日志文件是为了控制输出的时候可以更加直观感受到我们操作流程:
log4j.rootCategory=debug, CONSOLE, LOGFILE
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{MM/dd HH:mm:ss}] %-6r [%15.15t] %-5p %30.30c %x - %m\n
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql:///student
jdbc.username=自己用户名
jdbc.password=自己密码
因为我这里功能不多,就没有使用配置文件开发,只是用了注解,但也放了一个模板在这里
测试类:
import com.example.dao.StudentDao;
import com.example.pojo.Student;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-dao.xml")
public class StudentDaoTest {
@Autowired
private StudentDao studentDao;
@Test
public void testFindAll(){
List all = studentDao.findAll();
all.forEach(System.out::println);
}
@Test
public void testAdd(){
Student student = new Student(0,"SXT","女","上海");
studentDao.add(student);
}
}
OK,测试成功,接着下一步
OK,测试成功,接着下一步
工程目录结构图:
com.example
ssm_dao
1.0-SNAPSHOT
StudentService.java
package com.example.service;
import com.example.dao.StudentDao;
import com.example.pojo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentService {
@Autowired
private StudentDao studentDao;
public List findAllStudent(){
return studentDao.findAll();
}
public void addStudent(Student student){
studentDao.add(student);
}
}
虽然说本项目需求较少,但是该有的配置我们都得整一个,巩固一下也好
目录结构图如下:
controller工程引入service子工程的依赖,并配置ssm父工程
mvc_demo4
com.example
1.0-SNAPSHOT
com.example
ssm_service
1.0-SNAPSHOT
package com.example.controller;
import com.example.pojo.Student;
import com.example.service.StudentService;
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;
@RequestMapping("/student")
@Controller
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("/all")
public String all(Model model){
List allStudent = studentService.findAllStudent();
model.addAttribute("students",allStudent);
return "allStudent";
}
@RequestMapping("add")
public String add(Student student){
studentService.addStudent(student);
// 重定向到查询所有学生
return "redirect:/student/all";
}
}
Spring的总配置文件applicationContext.xml,该文件引入dao和service层的Spring配置文件
在web.xml中配置Spring监听器,该监听器会监听服务器启动,并自动创建Spring的IOC容器,并配置SpringMVC的前端控制器和编码过滤器
Archetype Created Web Application
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
dispatchServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
dispatchServlet
/
encFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
encFilter
/*
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
所有学生
id
姓名
性别
地址
${studnet.id}
${studnet.name}
${studnet.sex}
${studnet.address}
我们直接访问http://localhost:8080/allStudent.jsp即可
我们可以看到的页面是这样的,因为此时下方表格没有传入参数,因此就没有数据,但是只要我们对上方的输入框输入数据提交添加用户就可以刷新下方表格了。
OK,本次专栏就到此告一段落了,希望该专栏可以给各位读者有所帮助,这篇文章也是我写过最长的一篇文章,但绝对是最详细的。
大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。
Maven系列专栏 | Maven工程开发 |
Maven聚合开发【实例详解---5555字】 |
Mybatis系列专栏 | MyBatis入门配置 |
Mybatis入门案例【超详细】 | |
MyBatis配置文件 —— 相关标签详解 | |
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填 | |
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分) | |
Mybatis分页查询——四种传参方式 | |
Mybatis一级缓存和二级缓存(带测试方法) | |
Mybatis分解式查询 | |
Mybatis关联查询【附实战案例】 | |
MyBatis注解开发---实现增删查改和动态SQL | |
MyBatis注解开发---实现自定义映射关系和关联查询 |
Spring系列专栏 | Spring IOC 入门简介【自定义容器实例】 |
IOC使用Spring实现附实例详解 | |
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式 | |
Spring DI简介及依赖注入方式和依赖注入类型 | |
Spring IOC相关注解运用——上篇 | |
Spring IOC相关注解运用——下篇 | |
Spring AOP简介及相关案例 | |
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】 | |
Spring事务简介及相关案例 | |
Spring 事务管理方案和事务管理器及事务控制的API | |
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务 |
SpringMVC系列专栏 | Spring MVC简介附入门案例 |
Spring MVC各种参数获取及获取方式自定义类型转换器和编码过滤器 | |
Spring MVC获取参数和自定义参数类型转换器及编码过滤器 | |
Spring MVC处理响应附案例详解 | |
Spring MVC相关注解运用 —— 上篇 | |
Spring MVC相关注解运用 —— 中篇 |
|
Spring MVC相关注解运用 —— 下篇 | |
Spring MVC多种情况下的文件上传 | |
Spring MVC异步上传、跨服务器上传和文件下载 | |
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】 | |
Spring MVC拦截器和跨域请求 | |
SSM整合案例【C站讲解最详细流程的案例】 |