一.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 Application</display-name>
<!--SpringIOC配置文件路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mybatis-config.xml</param-value>
</context-param>
<!--初始化IOC容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置DispatcherServlet-->
<!--spring会根据servlet-name的配置,找到Springmvc.xml配置,加载到web工程中的配置-->
<servlet>
<servlet-name>myssm</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--服务器启动期间初始化-->
<param-value>classpath:spring/spring-mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--为servlet或者filter设置启用异步支持,http://ydlmlh.iteye.com/blog/2062788-->
<async-supported>true</async-supported>
</servlet>
<!--servlet拦截配置-->
<servlet-mapping>
<servlet-name>myssm</servlet-name>
<!-- 此处可以可以配置成*.do,对应struts的后缀习惯.所有后缀.do结尾的都会被他拦截 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
二.spring-mvc-config.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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!--使用注解驱动,没有就不能扫描@Controller,就会出现404--> <mvc:annotation-driven/> <!--https://www.cnblogs.com/dflmg/p/6393416.html--> <mvc:default-servlet-handler/> <!--定义扫描装载的包--> <context:component-scan base-package="com.*"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--定义视图解析器--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/> </beans>
2.1<mvc:default-servlet-handler/>定义能拦截所有的地址
三.spring-mybatis-config.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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 这里排除扫描Controller:https:https://blog.csdn.net/Evan_Leung/article/details/50664939--> <context:component-scan base-package="com.*"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 引入jdbc配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"/> </bean> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <!--初始化连接大小 --> <property name="initialSize" value="${initialSize}"/> <!--连接池最大数量--> <property name="maxActive" value="${maxActive}"/> <!--连接池最大空闲 --> <property name="maxIdle" value="${maxIdle}"/> <!--连接池最小空闲 --> <property name="minIdle" value="${minIdle}"/> <!--获取连接最大等待时间 --> <property name="maxWait" value="${maxWait}"/> </bean> <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <!--对MyBatis和Spring进行集成,把sqlSessionFactory交给Spring管理,通常情况下--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 引入数据源 --> <property name="dataSource" ref="dataSource"/> <!-- 自动扫描mapping.xml文件 --> <!--mapperLocations:它表示我们的Mapper文件存放的位置,当我们的Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。--> <property name="mapperLocations" value="classpath:com/hly/ssm/mapping/*.xml"/> <!--别名--> <property name="typeAliasesPackage" value="com.hly.ssm.pojo"/> </bean> <!-- DAO层接口所在包名,Spring会自动查找其下的类,代替手工编写数据访问的代码 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.hly.ssm.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!--采用实体dao调用方式调用,在dao里面可以用注解@Resource(name="sqlSessionTemplate")方式得到或用ao继承SQLSessionDaoSupport再采用setter方式对dao进行注入--> <!--Mybatis-Spring为我们提供了一个实现了SqlSession接口的SqlSessionTemplate类,它是线程安全的,可以被多个Dao同时使用。同时它还跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的。而且它还可以自己管理Session的提交和关闭。当使用了Spring的事务管理机制后,SqlSession还可以跟着Spring的事务一起提交和回滚。--> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory"> </constructor-arg> </bean> <!-- 开启事务,事物管理器 --> <!--这是管理事务的。你一个service可能写多条操作sql语句。当第一条成功了。第二条报错了。如果你没有事务。那么第一条sql语句就会生效。有了事务就可以回滚。保证同时成功或失败。最典型的就是银行的取钱。--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启@Transactional实现注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> </beans>
3.1排除扫描Controller,spring和springMVC是父子容器,子容器可以访问父容器对象,父容器不能访问子容器对象,如果在spring中直接扫描所有的包,不配置spring要扫面Controller,就会出现404,所以,要么在springMVC里面配置扫描Controller,要么排除spring扫描Controller。
3.2.SqlSessionFactoryBean:在Mybatis中对数据库的所有操作都是基于一个SqlSession的,而SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。但是Mybatis-Spring给我们封装了一个SqlSessionFactoryBean,在这个bean里面还是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。通过SqlSessionFactoryBean我们可以通过对其指定一些属性来提供Mybatis的一些配置信息。所以接下来我们需要在Spring的applicationContext配置文件中定义一个SqlSessionFactoryBean。
在定义SqlSessionFactoryBean的时候,dataSource属性是必须指定的,它表示用于连接数据库的数据源。当然,我们也可以指定一些其他的属性,下面简单列举几个:
1.mapperLocations:它表示我们的Mapper文件存放的位置,当我们的Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。
2. configLocation:用于指定Mybatis的配置文件位置。如果指定了该属性,那么会以该配置文件的内容作为配置信息构建对应的SqlSessionFactoryBuilder,但是后续属性指定的内容会覆盖该配置文件里面指定的对应内容。
3. typeAliasesPackage:它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。
4.typeAliases:数组类型,用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名,前提是该类上没有标注@Alias注解,否则将使用该注解对应的值作为此种类型的别名。plugins:数组类型,用来指定Mybatis的Interceptor。
5.typeHandlersPackage:用来指定TypeHandler所在的包,如果指定了该属性,SqlSessionFactoryBean会自动把该包下面的类注册为对应的TypeHandler。多个package之间可以用逗号或者分号等来进行分隔。
6.typeHandlers:数组类型,表示TypeHandler。3.3.SqlSessionTemplate:在配置好SqlSessionFactory之后,我们便可以配置SqlSessionTemplate了。Mybatis-Spring为我们提供了一个实现了SqlSession接口的SqlSessionTemplate类,它是线程安全的,可以被多个Dao同时使用。同时它还跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的。而且它还可以自己管理Session的提交和关闭。当使用了Spring的事务管理机制后,SqlSession还可以跟着Spring的事务一起提交和回滚。
参考:https://blog.csdn.net/wangxy799/article/details/50856438
3.4.MapperScannerConfigurer:
1.MapperFactoryBean的出现为了代替手工使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码,使用动态代理实现。
2.比如下面这个官方文档中的配置:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>3.org.mybatis.spring.sample.mapper.UserMapper是一个接口,我们创建一个MapperFactoryBean实例,然后注入这个接口和sqlSessionFactory(mybatis中提供的SqlSessionFactory接口,MapperFactoryBean会使用SqlSessionFactory创建SqlSession)这两个属性。
之后想使用这个UserMapper接口的话,直接通过spring注入这个bean,然后就可以直接使用了,spring内部会创建一个这个接口的动态代理。
当发现要使用多个MapperFactoryBean的时候,一个一个定义肯定非常麻烦,于是mybatis-spring提供了MapperScannerConfigurer这个类,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。
四.项目代码:
4.1.首先创建pojo类型:
public class User { private String userId; private String userNickName; private String userPassword;
4.2数据查询dao文件夹的接口:
package com.hly.ssm.dao; import com.hly.ssm.pojo.User; /** * @author :hly * @date :2018/5/13 */ public interface UserDao { public User selectUserById(String userId); }
4.3数据查询映射文件
<?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.hly.ssm.dao.UserDao"> <sql id="selectUser" >user_register_id as userId ,user_nickname as userNickName ,user_password as userPassword</sql> <select id="selectUserById" parameterType="string" resultType="user"> SELECT <include refid="selectUser"/> FROM [user] WHERE user_register_id = #{userId} </select> </mapper>
namespace是dao文件夹里面的接口类的名字
4.4.Service文件夹里面的Service接口类
package com.hly.ssm.service; import com.hly.ssm.pojo.User; /** * @author :hly * @date :2018/5/13 */ public interface UserService { public User selectUserById(String userId); }
4.5.ServiceImpl文件夹里实现Service文件夹接口类的java文件
package com.hly.ssm.serviceImpl; import com.hly.ssm.dao.UserDao; import com.hly.ssm.pojo.User; import com.hly.ssm.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author :hly * @date :2018/5/13 */ @Service("userService") public class UserServiceImpl implements UserService { @Autowired UserDao userDao; @Override public User selectUserById(String userId) { return userDao.selectUserById(userId); } }
@Autowired注入dao层接口,返回数据库查询到的值
注解:
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
4.6.Controller类,传递逻辑视图到前端
package com.hly.ssm.controller; import com.hly.ssm.pojo.User; import com.hly.ssm.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** * @author :hly * @date :2018/5/13 */ @Controller @RequestMapping("/") public class UserController { @Autowired UserService userService = null; @RequestMapping("/") public ModelAndView index(){ User user = userService.selectUserById("1"); ModelAndView mvUser = new ModelAndView(); //jsp文件名字 mvUser.setViewName("index"); mvUser.addObject("user",user); return mvUser; } }
注入UserService根据Id到数据库查询出数据。
4.7项目结构:
完整项目在博主的Git上,地址是https://gitee.com/Sirius_hly/SSM