写在前面:
公司一直都是使用ssh框架(Struts2,Spring,Hibernate)来开发,但是现在外面的公司大多数都是使用的ssm框架,所以也有必要多学习一下外面的新技术。这里就快速搭建一个小的demo来入门了解一下。
ssm的分别表示:SpringMVC、Spring、Mybatis。
由于只是想快速搭建一个ssm框架,所以这里也没有对SpringMVC、Spring、Mybatis的概念以及内部原理去做过多的深究,因为个人觉得还是要先学会使用轮子。一开始就去看一些太多理念或者原理,也不会很理解,当然了,理念的东西在开始做之前还是要稍微的了解一下的。
比如就要知道SpringMVC对应着ssh中的Struts2,都是web层,主要用于接收用户发送的请求,与给予响应。
再者就是Spring,它是一个大大的容器,用来管理各种实体类,以及配置数据库事务等。它的两大特性主要是IOC与AOP。
IOC:Inversion of Control,控制反转,让Spring容器去管理装载bean,即把java类的初始化交给spring容器去执行,需要用时直接引用。
AOP:Aspect Oriented Programming,面向切面编程。通过动态代理或cglib代理把重复的具有相同功能的代码横向独立出来或横向插入。
图中可以看到方法1,方法2,方法3中都有相同的代码A,B,把代码A,B提取出来,只留下不同的代码。将代码A,B进行统一管理。
面向切面场景举例:事务管理
现在有两个方法,方法一:开启事务,更新表里的数据,提交事务;方法二:开启事务,删除表里面的数据,提交事务。
代码是伪代码,也是借用斌哥做的ppt上的图。这两个方法都有相同的功能代码(开启事务,提交事务)。将事务开启,与事务的提交单独抽取出来,然后统一管理。这就是aop的作用。
最后,Mytabis是一个持久层框架,它可以使用简单的XML文件或注解来配置和映射原生信息,将接口(Mapper层)和java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。它是可以直接在xml文件里写sql语句的。
与之都是ORM(Object Relational Mapping,对象关系映射)框架的Hibernate,却是使得程序员可以直接以面向对象的方式来操纵数据库,一般使用hql语句,虽然也可以使用sql语句,但是使用sql语句的灵活度不如Mybatis。两者的区别也不是几句话就能说清楚的,但是基本的还是要了解。
对三个框架有个基本的认知后,下面就开始整合。这里使用Maven来创建web项目,这里如何创建就不细说了可以参考之前的博客https://www.cnblogs.com/eleven258/p/9842633.html。
准备工作:
首先我们需要创建数据库,并创建对应的表,这里只创建一个简单的测试表,然后插入一条数据。
DROP TABLE IF EXISTS `user_t`; CREATE TABLE `user_t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(40) NOT NULL, `password` varchar(255) NOT NULL, `age` int(4) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; /*Data for the table `user_t` */ insert into `user_t`(`id`,`user_name`,`password`,`age`) values (1,'蚊子','abcd',23);
然后将对应所需要的一些文件夹,包名都建好。
开始SSM整合:
1.使用maven引入所需jar包
pom.xml配置文件
<properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <maven.compiler.source>1.7maven.compiler.source> <maven.compiler.target>1.7maven.compiler.target> <spring.version>4.0.2.RELEASEspring.version> <mybatis.version>3.2.6mybatis.version> <slf4j.version>1.7.7slf4j.version> <log4j.version>1.2.17log4j.version> properties> <dependencies> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>4.11version> <scope>testscope> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-coreartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-webartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-oxmartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-txartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-jdbcartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-webmvcartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-aopartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-context-supportartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-testartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <version>${mybatis.version}version> dependency> <dependency> <groupId>org.mybatisgroupId> <artifactId>mybatis-springartifactId> <version>1.2.2version> dependency> <dependency> <groupId>javaxgroupId> <artifactId>javaee-apiartifactId> <version>7.0version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.30version> dependency> <dependency> <groupId>commons-dbcpgroupId> <artifactId>commons-dbcpartifactId> <version>1.2.2version> dependency> <dependency> <groupId>jstlgroupId> <artifactId>jstlartifactId> <version>1.2version> dependency> <dependency> <groupId>log4jgroupId> <artifactId>log4jartifactId> <version>${log4j.version}version> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>1.1.41version> dependency> <dependency> <groupId>org.slf4jgroupId> <artifactId>slf4j-apiartifactId> <version>${slf4j.version}version> dependency> <dependency> <groupId>org.slf4jgroupId> <artifactId>slf4j-log4j12artifactId> <version>${slf4j.version}version> dependency> <dependency> <groupId>org.codehaus.jacksongroupId> <artifactId>jackson-mapper-aslartifactId> <version>1.9.13version> dependency> <dependency> <groupId>commons-fileuploadgroupId> <artifactId>commons-fileuploadartifactId> <version>1.3.1version> dependency> <dependency> <groupId>commons-iogroupId> <artifactId>commons-ioartifactId> <version>2.4version> dependency> <dependency> <groupId>commons-codecgroupId> <artifactId>commons-codecartifactId> <version>1.9version> dependency> dependencies>
配置好后,点击右侧的Maven Projects,点击重新导入按钮,等待引入相关的jar包。
2.配置spring与mybatis的整合
首先配置jdbc.properties
jdbc.driverClass = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/ssm?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8
jdbc.username = root
jdbc.password = 123456
建立spring-mybatis.xml文件并配置,此文件是完成spring与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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <context:component-scan base-package="com.ssm" /> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClass}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="initialSize" value="0">property> <property name="maxActive" value="20">property> <property name="maxIdle" value="20">property> <property name="minIdle" value="1">property> <property name="maxWait" value="60000">property> bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:mapping/*.xml">property> bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.ssm.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">property> bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> bean> beans>
3.配置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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <context:component-scan base-package="com.ssm.controller "/> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8value> list> property> bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> list> property> bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> bean> beans>
4.配置web.xml文件
xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Applicationdisplay-name> <context-param> <param-name>contextConfigLocationparam-name> <param-value>classpath:spring-mybatis.xmlparam-value> context-param> <filter> <filter-name>encodingFilterfilter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class> <async-supported>trueasync-supported> <init-param> <param-name>encodingparam-name> <param-value>UTF-8param-value> init-param> filter> <filter-mapping> <filter-name>encodingFilterfilter-name> <url-pattern>/*url-pattern> filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class> listener> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListenerlistener-class> listener> <servlet> <servlet-name>SpringMVCservlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> <init-param> <param-name>contextConfigLocationparam-name> <param-value>classpath:spring-mvc.xmlparam-value> init-param> <load-on-startup>1load-on-startup> <async-supported>trueasync-supported> servlet> <servlet-mapping> <servlet-name>SpringMVCservlet-name> <url-pattern>/url-pattern> servlet-mapping> <welcome-file-list> <welcome-file>/index.jspwelcome-file> welcome-file-list> web-app>
5.log4j的配置,(这里就不再贴对应的配置文件了),让其能在控制台输出信息,如果需要可以去查看之前的资料https://www.cnblogs.com/eleven258/p/7380396.html
到这一步,所需要的配置文件已经全部配置完毕。目录结构图如下:
6.使用Mybatis Generator自动创建代码
这个可以用写好的配置文件,根据数据库表来自动的创建对应的实体类,对应的mapping.xml文件以及对应的mapper接口(dao层)。
第一步,首先在pom.xml文件中添加插件mybatis-generator-maven-plugin
<plugin> <groupId>org.mybatis.generatorgroupId> <artifactId>mybatis-generator-maven-pluginartifactId> <version>1.3.2version> <configuration> <verbose>trueverbose> <overwrite>trueoverwrite> configuration> plugin>
第二步,在src/main/resources 目录下建立名为 generatorConfig.xml的配置文件,作为mybatis-generator-maven-plugin 插件的执行目标,模板如下:
xml version="1.0" encoding="UTF-8"?> DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <classPathEntry location="D:\my_maven_local_repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar"/> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="true"/> <property name="suppressAllComments" value="true"/> commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ssm" userId="root" password="123456"> jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> javaTypeResolver> <javaModelGenerator targetPackage="com.ssm.bean" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> javaModelGenerator> <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> sqlMapGenerator> <javaClientGenerator type="XMLMAPPER" targetPackage="com.ssm.dao" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> javaClientGenerator> <table tableName="user_t" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">table> context> generatorConfiguration>
第三步,在Intellij IDEA添加一个“Run运行”选项,使用maven运行mybatis-generator-maven-plugin插件 :
其中Command line输入的是 mybatis-generator:generate -e
如果添加成功,则会在run 选项中有“generator” 选项,如下:
然后点击运行,如果运行成功的话,会在控制台看到BUILD SUCCESS,如果有错误的话,由于添加了-e 选项,会把具体的详细错误信息打印出来的,根据错误信息修改即可。
这时你的目录下面就多了刚自动创建生成的文件了
这里要特别注意下,最好是将XXXMapper.xml文件放在resources路径下,因为在测试的时候我把自动生成的mapper.xml文件放在src/main/java下一直扫描不到.所以这里最好注意下。对应的参考连接https://blog.csdn.net/zhwyj1019/article/details/79088073
7.到这里我们就可以去编写代码啦,首先我们,编写业务层的代码
UserService接口
public interface UserService { public User getUserById(int id); }
UserServiceImpl.java
@Service("userService") public class UserServiceImol implements UserService{ //引入mapper接口 @Resource private UserMapper userMapper; @Override public User getUserById(int id) { //这里调用的方法是与UserMapper.xml文件中对应的id名是一致的 return userMapper.selectByPrimaryKey(id); } }
8.编写对应的Controller层的代码
@Controller("UserController") @RequestMapping("/user") public class UserController { //引入service接口 @Resource private UserService userService; @RequestMapping("/showUser") public String test(HttpServletRequest request, Model model){ String id = request.getParameter("id"); User user = userService.getUserById(Integer.parseInt(id)); model.addAttribute("user",user); return "showUser"; } }
9.编写对应的jsp页面,这里简单的测试下showUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>测试title> head> <body> ${user.userName} body> html>
10.部署项目,启动,在浏览器地址栏输入:http://localhost:8080/ssmDemo/user/showUser?id=1 回车,可以看到,出现名字,成功啦~~~~
到这里ssm三大框架的快速整合就完成了,对于使用generator插件自动生成的代码,可以自己下去生成看看对应的内容,这里就不再把代码贴上来了 。
这里附上完整的项目结构目录:
还有值得注意的是,对于jdbc文件的配置,在参考资料的时候,写的是username,前面没有加jdbc,这个时候会报错的,因为会变成系统管理员的名字,所以这里也要注意下。
参考资料:
https://blog.csdn.net/zhshulin/article/details/37956105------SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
https://www.cnblogs.com/liaojie970/p/7058543.html------IDEA 中使用MyBatis-generator 自动生成MyBatis代码
https://blog.csdn.net/zhwyj1019/article/details/79088073------spring boot 整合mybatis org.apache.ibatis.binding.BindingException: Invalid bound state
还有也要看看斌哥附上的学习资料
https://blog.csdn.net/litianxiang_kaola/article/details/79169148
https://blog.csdn.net/bieleyang/article/details/77862042
https://www.cnblogs.com/dongying/p/4142476.html
https://www.cnblogs.com/1880su/p/7965461.html