SSM整合(Spring + SpringMVC + MyBatis)
准备数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int (11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL COMMENT '用户名' , `password` varchar(255) NOT NULL COMMENT '密码' , `real_name` varchar(255) NOT NULL COMMENT '真实名' , `sex` varchar(255) DEFAULT NULL COMMENT '性别' , `birthday` date DEFAULT NULL COMMENT '生日' , `phone` varchar(255) NOT NULL COMMENT '电话' , `utype` tinyint(1) DEFAULT NULL COMMENT '用户类型' , `addtime` datetime DEFAULT NULL COMMENT '添加时间' , `adduser` varchar(255) DEFAULT NULL COMMENT '添加者' , PRIMARY KEY (`id`), UNIQUE KEY `phone` (`phone`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user` values(1, 'qzcsbj1' , '62f7f5673e94eca261b8fce7ae7863a4' , 'qzcsbj1' , '男' , '2018-09-06' , '13800000001' ,0,now(), 'qzcsbj' ); insert into `user` values(2, 'qzcsbj2' , '62f7f5673e94eca261b8fce7ae7863a4' , 'qzcsbj2' , '女' , '2018-09-07' , '13800000002' ,1,now(), 'qzcsbj' ); insert into `user` values(3, 'qzcsbj3' , '62f7f5673e94eca261b8fce7ae7863a4' , 'qzcsbj3' , '男' , '2018-09-08' , '13800000003' ,0,now(), 'qzcsbj' ); insert into `user` values(4, 'qzcsbj4' , '62f7f5673e94eca261b8fce7ae7863a4' , 'qzcsbj4' , '女' , '2018-09-09' , '13800000004' ,1,now(), 'qzcsbj' ); insert into `user` values(5, 'qzcsbj5' , '62f7f5673e94eca261b8fce7ae7863a4' , 'qzcsbj5' , '女' , '2018-09-10' , '13800000005' ,0,now(), 'qzcsbj' ); |
创建一个maven工程
选择webapp
输入项目信息(坐标)
配置mvn
点击“Finish”
结构
上面有些目录没有,比如java、resources等,需要我们手工创建,创建后如下图:
添加pom依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | <!--集中定义版本号--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <springmvc.version>4.3.14.RELEASE</springmvc.version> <spring.version>4.3.14.RELEASE</spring.version> <mybatis.version>3.4.6</mybatis.version> <mybatis.spring.version>1.3.1</mybatis.spring.version> <mysql.version>5.1.47</mysql.version> <druid.version>1.1.10</druid.version> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-io.version>1.3.2</commons-io.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springmvc.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</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-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> </dependencies> |
pom的build中添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <plugins> <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!--tomcat插件--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/</path> <port>8080</port> </configuration> </plugin> </plugins> |
创建实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | package com.qzcsbj.pojo; import java.io.Serializable; import java.util.Date; /** * @公众号 : 全栈测试笔记 * @博客 : www.cnblogs.com/uncleyong * @微信 : ren168632201 * @描述 : <> */ public class User implements Serializable { private static final long serialVersionUID = 5753660691492463802L; private Integer id; private String username; private String password; private String realName; private String sex; private Date birthday; private String phone; private String utype; private String addtime; private String adduser; public User() { } public User(String username, String password, String realName, String sex, Date birthday, String phone, String utype,String adduser, String addtime) { this .username = username; this .password = password; this .realName = realName; this .sex = sex; this .birthday = birthday; this .phone = phone; this .utype = utype; this .adduser = adduser; this .addtime = addtime; } public Integer getId() { return id; } public void setId(Integer id) { this .id = id; } public String getUsername() { return username; } public void setUsername(String username) { this .username = username; } public String getPassword() { return password; } public void setPassword(String password) { this .password = password; } public String getRealName() { return realName; } public void setRealName(String realName) { this .realName = realName; } public String getSex() { return sex; } public void setSex(String sex) { this .sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this .birthday = birthday; } public String getPhone() { return phone; } public void setPhone(String phone) { this .phone = phone; } public String getUtype() { return utype; } public void setUtype(String utype) { this .utype = utype; } public String getAddtime() { return addtime; } public void setAddtime(String addtime) { this .addtime = addtime; } public String getAdduser() { return adduser; } public void setAdduser(String adduser) { this .adduser = adduser; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\ '' + ", password='" + password + '\ '' + ", realName='" + realName + '\ '' + ", sex='" + sex + '\ '' + ", birthday=" + birthday + ", phone='" + phone + '\ '' + ", utype='" + utype + '\ '' + ", addtime=" + addtime + ", adduser='" + adduser + '\ '' + '}' ; } } |
创建mapper层
UserMapper
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.qzcsbj.mapper; import com.qzcsbj.pojo.User; /** * @公众号 : 全栈测试笔记 * @博客 : www.cnblogs.com/uncleyong * @微信 : ren168632201 * @描述 : <> */ public interface UserMapper { public User getUserById(Integer id); } |
UserMapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?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.qzcsbj.mapper.UserMapper" > <resultMap id= "userMap" type= "com.qzcsbj.pojo.User" > <id column= "id" property= "id" /> <result column= "real_name" property= "realName" /> </resultMap> < select id= "getUserById" resultMap= "userMap" > SELECT * from user where id=#{id} </ select > </mapper> |
mybatis和spring整合
log4j.properties
1 2 3 4 5 6 7 8 9 10 | log4j.rootLogger = INFO,console log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System. out log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern = %d{**:mm:ss SSS} [%t] %-5p method: %l----%m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG |
jdbc.properties
1 2 3 4 | jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql: //192.168.117.180:3306/gift?useUnicode=true&characterEncoding=utf-8&useSSL=true jdbc.username=root jdbc.password=qzcsbj |
applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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" xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" > <context:component-scan base -package= "com.qzcsbj.*" /> <context:property-placeholder location= "classpath:jdbc.properties" /> <bean id= "ds" class = "com.alibaba.druid.pool.DruidDataSource" > <property name= "driverClassName" value= "${jdbc.driver}" /> <property name= "username" value= "${jdbc.username}" /> <property name= "password" value= "${jdbc.password}" /> <property name= "url" value= "${jdbc.url}" /> </bean> <bean id= "sessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" > <property name= "dataSource" ref = "ds" /> <property name= "mapperLocations" value= "classpath:com/qzcsbj/mapper/*.xml" /> <property name= "typeAliasesPackage" value= "com.qzcsbj.pojo" /> </bean> <bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name= "basePackage" value= "com.qzcsbj.mapper" /> </bean> </beans> |
测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package com.qzcsbj.test; import com.qzcsbj.mapper.UserMapper; import com.qzcsbj.pojo.User; 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; /** * @公众号 : 全栈测试笔记 * @博客 : www.cnblogs.com/uncleyong * @微信 : ren168632201 * @描述 : <> */ @RunWith(SpringJUnit4ClassRunner. class ) @ContextConfiguration( "classpath:applicationContext.xml" ) public class TestSSM { @Autowired UserMapper userMapper; @Test public void testFindById(){ User user = userMapper.getUserById(1); System. out .println(user); } } |
报错
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.qzcsbj.mapper.UserMapper.getUserById
下面没有UserMapper.xml
pom中加入:
1 2 3 4 5 6 7 8 | <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> |
结果:
创建service层
UserService
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.qzcsbj.service; import com.qzcsbj.pojo.User; /** * @公众号 : 全栈测试笔记 * @博客 : www.cnblogs.com/uncleyong * @微信 : ren168632201 * @描述 : <> */ public interface UserService { public User getUserById(Integer id); } |
UserServiceImlp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package com.qzcsbj.service.impl; import com.qzcsbj.mapper.UserMapper; import com.qzcsbj.pojo.User; import com.qzcsbj.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @公众号 : 全栈测试笔记 * @博客 : www.cnblogs.com/uncleyong * @微信 : ren168632201 * @描述 : <> */ @Service public class UserServiceImpl implements UserService { @Autowired UserMapper userMapper; @Override public User getUserById(Integer id) { return userMapper.getUserById(id); } } |
测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package com.qzcsbj.test; import com.qzcsbj.mapper.UserMapper; import com.qzcsbj.pojo.User; import com.qzcsbj.service.UserService; 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; /** * @公众号 : 全栈测试笔记 * @博客 : www.cnblogs.com/uncleyong * @微信 : ren168632201 * @描述 : <> */ @RunWith(SpringJUnit4ClassRunner. class ) @ContextConfiguration( "classpath:applicationContext.xml" ) public class TestSSM { @Autowired UserService userService; @Test public void testFindById(){ User user = userService.getUserById(1); System. out .println(user); } } |
结果:
spring和springmvc整合
创建Controller层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package com.qzcsbj.controller; import com.qzcsbj.pojo.User; import com.qzcsbj.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; /** * @公众号 : 全栈测试笔记 * @博客 : www.cnblogs.com/uncleyong * @微信 : ren168632201 * @描述 : <> */ @Controller public class UserController { @Autowired UserService userService; @RequestMapping( "/showEmployee" ) public String showEmployee(Long id,Model model){ User user = userService.getUserById(id); model.addAttribute( "user" , user); return "user" ; } } |
需要视图解析器,springmvc.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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" xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" > <context:component-scan base -package= "com.qzcsbj.controller" /> <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name= "prefix" value= "/WEB-INF/jsp/" /> <property name= "suffix" value= ".jsp" /> </bean> </beans> |
WEB-INF下创建jsp目录,再创建视图:user.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <%@ page contentType= "text/html;charset=UTF-8" language= "java" isELIgnored= "false" %> <html> <head> <title>Title</title> </head> <body> <table width= "100%" border=1> <tr> <td>用户id</td> <td> ${user.id } </td> </tr> <tr> <td>用户名</td> <td> ${user.username} </td> </tr> <tr> <td>真实名</td> <td>${user.realName}</td> </tr> <tr> <td>电话</td> <td>${user.phone} </td> </tr> </table> </body> </html> |
配置SpringMVC的核心控制器
web.xml中
1 2 3 4 5 6 7 8 9 10 11 12 13 | <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> <load- on -startup>1</load- on -startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*. do </url-pattern> </servlet-mapping> |
spring监听器配置
1 2 3 4 5 6 7 8 | <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext*.xml</param-value> </context-param> <listener> <listener- class >org.springframework.web.context.ContextLoaderListener</listener- class > </listener> |
测试
先执行clean,再执行complie,然后执行下面的run
报错
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [springmvc.xml]; nested exception is java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be opened because it does not exist
pom中加入:
1 2 3 4 5 6 7 8 | <resource> <directory>src/main/resources</directory> <includes> <include>** /*.xml</include> <include>**/ *.properties</include> </includes> <filtering> false </filtering> </resource> |
clean后再compile
运行
访问:http://localhost:8080/
访问:http://localhost:8080/getUser.do?id=1
访问:http://localhost:8080/getUser.do?id=2
原文会持续更新,原文地址:https://www.cnblogs.com/uncleyong/p/17063781.html
__EOF__

关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?