Mybatis系列(九)Spring & Mybatis整合
Mybatis系列之Spring & Mybatis整合
引言
前面用了八篇博客简单的向大家介绍了Mybatis的基础知识及简单用例。了解了这些知识后,还差最后一招,我们就可以修炼好独孤九剑,进入到更高一层的武艺境界 --SSM(Spring + Spring MVC + Mybatis)开发阶段了。
关于Spring及Spring MVC的基础概念这里就不再赘述了。不了解的,大家可以通过度娘谷哥自行脑补。
开发环境
IDE: STS(Spring Tools Suite)官网网址:http://spring.io/tools/sts
Spring Framework: 3.1.1.RELEASE
Mybatis Version: 3.3.0
Mybatis-Spring: 1.2.3
创建Spring MVC项目
强烈推荐大家使用STS进行Spring项目的开发,她对Spring及Maven集存的非常好,轻松两步就可以创建一个Spring MVC项目:
- 点击新建按钮,在新建向导中选择Spring Project,点击下一步
- 选择Spring MVC Project,输入项目名称,点击完成
是不是很easy呀!项目创建好之后,还要完成一个动作,就是右击项目名称,选择Run As..菜单下的Maven Install,这样就可以把项目依赖的Jar包下载到本地了。新创建的项目目录结构如下图所示(请忽略src/main/java目录下的包及文件,这是最终完成后的项目结构)。
引入Jar包
在Maven的项目管理文件pom.xml中加入以下依赖即可。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.1.1 RELEASE</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.1.1 RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.36</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.1.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency>
Spring与Mybatis整合
将所需Jar包导入之后,就可以着手将Spring与Mybatis进行整合(请注意,这里是将Spring与Mybatis进行整合,现在还没有涉及到Spring MVC)。这里我们使用了JUnit,每做一次整合,我们都需要进行测试,以确保向前走的每一小步都是正确的。
我们在src/main/resources目录下创建一个名为spring-mybatis.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-3.0.xsd"> <context:component-scan base-package="com.emerson.suzhou" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/your_database" /> <property name="username" value="your_username" /> <property name="password" value="your_password" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath:com/emerson/suzhou/mapping/*.xml"></property> <propertyname="configLocation"value="classpath:mybatis-config.xml"></property> </bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.emerson.suzhou.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> </beans>在这个配置文件中,我们指定了:
- 数据源:用于连接目标数据库
- Spring扫描路径:会扫描指定路径下的所有Component,为后面的依赖注入做准备。如果我们需要对Mybatis进行一些特别设置,可以在这里指定配置文件的路径
- 映射文件路径:Mybatis会在指定路径加下加载数据表是映射文件
- Dao接口包名称:对应着每个数据表的映射文件,我们都会为其编写一个接口(请参见《Mybatis系列(六)接口式编程》)
ok,这个文件编写好之后,千万不要忘记在web.xml中指定spring-mybatis配置文件的位置!!这一步至关重要。否则在运行程序时会报出“creat bean error.....”的错误信息。
<!-- spring-mybatis configuration file location --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.xml</param-value> </context-param>
补充一句,STS自动生成的web.xml文件已经指定了root-context.xml文件位置,我们也可以把spring-mybatis.xml文件的内容全部搬到root-context.xml文件中,这样就不用添加下面这段代码了。
之后,我们就可以测试一下Spring与Mybatis是否可以正确的整合在一起。我继续使用在《Mybatis系列之简单示例》中使用的数据库进行测试。
在scr/main/java创建如下包:
com.emerson.suzhou.controller:存放控制器(后面测试Spring MVC时使用)
com.emerson.suzhou.dao:存放与映射文件相对应的接口文件
com.emerson.suzhou.mapping:存放数据表映射文件
com.emerson.suzhou.pojo:存放数据表实体类
com.emerson.suzhou.service:用在Controller与Dao之间的Service接口文件
com.emerson.suzou.service.impl:Service接口实现
数据表实体类文件内容如下。
package com.emerson.suzhou.pojo; import java.sql.Timestamp; public class User { /** * */ private int userId; /** * */ private String userPassword; /** * */ private String userName; /** * */ private String nickName; /** * */ private String email; /** * */ private int isValid; /** * */ private Timestamp createdTime; /** * */ private Timestamp updateTime; //setter , getter ... }数据表映射文件内容如下。请注意,这里使用名称空间,一定要与相应的接口文件全限定名一致!
<?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.emerson.suzhou.dao.IUserDao"> <sql id="columns">user_id, user_name, user_password, nick_name, email, is_valid, created_time, update_time </sql> <resultMap id="userResult" type="com.emerson.suzhou.pojo.User"> <id property="userId" column="user_id" /> <result property="userName" column="user_name" /> <result property="userPassword" column="user_password" /> <result property="nickName" column="nick_name" /> <result property="email" column="email" /> <result property="isValid" column="is_valid" /> <result property="createdTime" column="created_time" /> <result property="updateTime" column="update_time" /> </resultMap> <!-- 根据传入的Id值,到数据库中查询记录 --> <select id="getById" parameterType="int" resultMap="userResult"> SELECT <include refid="columns"></include> FROM sys_user WHERE user_id = #{id} </select> </mapper>
package com.emerson.suzhou.dao; import com.emerson.suzhou.pojo.User; public interface IUserDao { public User getById(int id); }服务接口文件如下。
package com.emerson.suzhou.service; import com.emerson.suzhou.pojo.User; public interface IUserService { public User getById(int id); }
服务接口实现文件如下。这里一定要使用Service注解标注。
package com.emerson.suzhou.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.emerson.suzhou.dao.IUserDao; import com.emerson.suzhou.pojo.User; import com.emerson.suzhou.service.IUserService; @Service("userService") public class UserSerivceImpl implements IUserService { @Resource private IUserDao dao; @Override public User getById(int id) { return this.dao.getById(id); } }
这些准备工作完成之后,我们就可以开始编写测试代码了。在scr/test/java/下创建测试文件,内容如下。
package com.emerson.suzhou; import static org.junit.Assert.*; import javax.annotation.Resource; import org.apache.log4j.Logger; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.emerson.suzhou.pojo.User; import com.emerson.suzhou.service.IUserService; public class TestMybatis { private static Logger logger = Logger.getLogger(TestMybatis.class); @Resource private IUserService userService = null; @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void test() { assertNotNull(userService); User user = userService.getById(1); logger.info(user); } }
如果在控制台看到数据表中查询到的内容输出,表示我们的配置是正确的。
目前,我们已经将Spring与Mybatis成功的整合在一起了,下面开始将Spring MVC也加入进来。
Spring MVC,来吧
STS在为我们创建Spring MVC项目时,已经自动生成了关于Spring MVC的配置文件,存放在src/main/webapp/WEB-INF/spring目录下,一个是root-context.xml,另一个是在其子目录appServlet下的servlet-context.xml。这两个配置文件的作用级别不同,一个是作用在事个项目上的,另一个则是仅作用在appServer上的(这个是由Spring MVC自动创建的一个Servlet,用于请求转发的,这一点从web.xml文件中就可以看出端倪)。
对于这两个文件,我们无需修改,可以直接使用。这就是我强烈推荐使用STS的原因之一。
接下来,我们要做的就是编写一个Controller测试一下。
package com.emerson.suzhou.controller; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.emerson.suzhou.pojo.User; import com.emerson.suzhou.service.IUserService; /** * Handles requests for the application home page. */ @Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); @Resource private IUserService userService; @RequestMapping(value = "showUser/{id}") public String showUser(@PathVariable int id, Model model) { User user = this.userService.getById(id); model.addAttribute("user", user); return "showUser"; } }
JSP文件如下。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>测试</title> </head> <body> ${user.toString()} </body> </html>
将项目发布到服务器上运行,地浏览器地址栏中输入http://localhost:8080/suzhou/showUser/1,如果页面中可以显示出从数据库中查询到的数据即为正确。
至此,SSM的框架已全部整合完毕。独孤九剑已融入到小伙伴的血液中了,余下的就看个人修炼了〜〜〜我只能帮你到这里了〜〜〜〜
上一篇: Mybatis系列(七)关联映射
下一篇: umeditor图片上传位置修改
推荐阅读
-
spring+mybatis利用interceptor(plugin)兑现数据库读写分离
-
spring+mybatis利用interceptor(plugin)兑现数据库读写分离
-
Spring Boot整合MyBatis,自动生成DAO
-
SpringBoot无废话入门04:MyBatis整合
-
实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务
-
SpringBoot整合MyBatis获得插入数据后获取主键,返回值总是1
-
SpringBoot项目整合mybatis的方法步骤与实例
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)
-
Spring Boot基础入门之基于注解的Mybatis