鍍金池/ 教程/ Java/ MyBatis整合Spring MVC
Mybatis表關(guān)聯(lián)多對一
MyBatis打印輸出SQL語句
Mybatis表關(guān)聯(lián)一對多
mybaits if標(biāo)簽語句
MyBatis整合Spring MVC
MyBatis動態(tài)SQL語句
MyBatis教程
MyBatis choose(when, otherwise)標(biāo)簽
Mybatis與Spring集成
MyBatis分頁
MyBatis SqlSessionDaoSupport實(shí)例
MyBatis where標(biāo)簽語句
Mybatis增刪改查(CURD)
Mybatis接口注解
Mybatis trim標(biāo)簽
Mybatis set標(biāo)簽
Mybatis 多對多
MyBatis環(huán)境配置及入門

MyBatis整合Spring MVC

前面幾篇文章已經(jīng)講到了mybatis與spring 的集成。目前主流的Web MVC框架,除了Struts這個主力外,還有Spring MVC,主要是由于 Spring MVC 配置比較簡單,使用起來也十分明了,非常靈活,與Spring 集成較好,對 RESTful API 的支持也比 struts 要好。所以Spring MVC在一定程度上有一定的優(yōu)勢。
MyBatis是ibatis的升級版,作為hibernate的老對手,它是一個可以自定義SQL、存儲過程和高級映射的持久層框架。
與Hibernate 的主要區(qū)別就是 Mybatis 是半自動化的,而 Hibernate 是全自動的,所以當(dāng)應(yīng)用需求越來越復(fù)雜的時候,自動化的 SQL 顯得比較笨拙。
經(jīng)常搭框架的人應(yīng)該都清楚,框架搭建的核心就是配置文件。

在這里我們需要創(chuàng)建 web 工程。今天將直接用 mybatis與Spring mvc 的方式集成起來,源碼在本文結(jié)尾處下載.主要有以下幾個方面的配置。

整個Mybatis與Spring MVC 示例要完成的步驟如下:

1、示例功能描述

2、創(chuàng)建工程

3、數(shù)據(jù)庫表結(jié)構(gòu)及數(shù)據(jù)記錄

4、實(shí)例對象

5、配置文件

6、測試執(zhí)行,輸出結(jié)果

1、示例功能描述

在本示例中,需要使用 MyBatis和Spring MVC整合完成這樣的一個簡單功能,即指定一個用戶(ID=1),查詢出這個用戶關(guān)聯(lián)的所有訂單。

2、創(chuàng)建工程

首先創(chuàng)建一個工程的名稱為:mybatis07-spring-mvc,在 src 源代碼目錄下建立文件夾 config,并將原來的 mybatis 配置文件 Configuration.xml 移動到這個文件夾中, 并在 config 文家夾中建立 Spring 配置文件:applicationContext.xml。工程結(jié)構(gòu)目錄如下:

MyBatis整合Spring MVC

3、數(shù)據(jù)庫表結(jié)構(gòu)及數(shù)據(jù)記錄

在本示例中,用到兩個表:用戶表和訂單表,其結(jié)構(gòu)和數(shù)據(jù)記錄如下:

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(64) NOT NULL DEFAULT '',
  `mobile` varchar(16) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'yiibai', '13838009988');
INSERT INTO `user` VALUES ('2', 'saya', '13838009988');
訂單表結(jié)構(gòu)和數(shù)據(jù)如下:
CREATE TABLE `order` (
  `order_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL DEFAULT '0',
  `order_no` varchar(16) NOT NULL DEFAULT '',
  `money` float(10,2) unsigned DEFAULT '0.00',
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of order
-- ----------------------------
INSERT INTO `order` VALUES ('1', '1', '1509289090', '99.90');
INSERT INTO `order` VALUES ('2', '1', '1519289091', '290.80');
INSERT INTO `order` VALUES ('3', '1', '1509294321', '919.90');
INSERT INTO `order` VALUES ('4', '1', '1601232190', '329.90');
INSERT INTO `order` VALUES ('5', '1', '1503457384', '321.00');
INSERT INTO `order` VALUES ('6', '1', '1598572382', '342.00');
INSERT INTO `order` VALUES ('7', '1', '1500845727', '458.00');
INSERT INTO `order` VALUES ('8', '1', '1508458923', '1200.00');
INSERT INTO `order` VALUES ('9', '1', '1504538293', '2109.00');
INSERT INTO `order` VALUES ('10', '1', '1932428723', '5888.00');
INSERT INTO `order` VALUES ('11', '1', '2390423712', '3219.00');
INSERT INTO `order` VALUES ('12', '1', '4587923992', '123.00');
INSERT INTO `order` VALUES ('13', '1', '4095378812', '421.00');
INSERT INTO `order` VALUES ('14', '1', '9423890127', '678.00');
INSERT INTO `order` VALUES ('15', '1', '7859213249', '7689.00');
INSERT INTO `order` VALUES ('16', '1', '4598450230', '909.20');

4、實(shí)例對象

用戶表和訂單表分別對應(yīng)兩個實(shí)例對象,分別是:User.java 和 Order.java,它們都在 com.yiibai.pojo 包中。

User.java代碼內(nèi)容如下:

package com.yiibai.pojo;

import java.util.List;

/** 
 * @describe: User
 * @author: Yiibai 
 * @version: V1.0
 * @copyright http://www.yiibai.com
 */  
public class User {
	private int id;
	private String username;
	private String mobile;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	
}

Order.java代碼內(nèi)容如下:

package com.yiibai.pojo;

/**
 * @describe: User - 訂單
 * @author: Yiibai
 * @version: V1.0
 * @copyright http://www.yiibai.com
 */
public class Order {
	private int orderId;
	private String orderNo;
	private float money;
	private int userId;
	private User user;
	
	
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public int getOrderId() {
		return orderId;
	}
	public void setOrderId(int orderId) {
		this.orderId = orderId;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public String getOrderNo() {
		return orderNo;
	}
	public void setOrderNo(String orderNo) {
		this.orderNo = orderNo;
	}
	public float getMoney() {
		return money;
	}
	public void setMoney(float money) {
		this.money = money;
	}

}

5、配置文件

這個實(shí)例中有三個重要的配置文件,它們分別是:applicationContext.xml , Configuration.xml 以及 UserMaper.xml。

applicationContext.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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="  
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
	default-autowire="byName" default-lazy-init="false">

	<!--本示例采用DBCP連接池,應(yīng)預(yù)先把DBCP的jar包復(fù)制到工程的lib目錄下。 -->
	<context:property-placeholder location="classpath:/config/database.properties" />

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver"
		p:url="jdbc:mysql://127.0.0.1:3306/yiibai?characterEncoding=utf8"
		p:username="root" p:password="" p:maxActive="10" p:maxIdle="10">
	</bean>

	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!--dataSource屬性指定要用到的連接池-->
		<property name="dataSource" ref="dataSource" />
		<!--configLocation屬性指定mybatis的核心配置文件-->
		<property name="configLocation" value="classpath:config/Configuration.xml" />
		<!-- 所有配置的mapper文件 -->
		<property name="mapperLocations" value="classpath*:com/yiibai/mapepr/*.xml" />
	</bean>

	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.yiibai.maper" />
	</bean>
</beans> 
配置文件 Configuration.xml 的內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases> 
        <typeAlias alias="User" type="com.yiibai.pojo.User"/>
        <typeAlias alias="Order" type="com.yiibai.pojo.Order"/>  
    </typeAliases> 
    <!-- 與spring 集成之后,這些可以完全刪除,數(shù)據(jù)庫連接的管理交給 spring 去管理 -->
    <!-- 
	<environments default="development">
		<environment id="development">
		<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
			<property name="driver" value="com.mysql.jdbc.Driver"/>
			<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf8" />
			<property name="username" value="root"/>
			<property name="password" value="password"/>
			</dataSource>
		</environment>
	</environments>
	-->
	
	<!-- 這里交給sqlSessionFactory 的 mapperLocations屬性去得到所有配置信息 -->
	<!-- 
	<mappers>
	    <mapper resource="com/yihaomen/mapper/User.xml"/>
	</mappers>
	--> 
	
</configuration>

UserMaper.xml 用于定義查詢和數(shù)據(jù)對象映射,其內(nèi)容如下:

<?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.yiibai.maper.UserMaper">
	
		<!-- 為了返回list 類型而定義的returnMap -->
	<resultMap type="User" id="resultUser">
        <id column="id" property="id" />
        <result column="username" property="username" />
        <result column="mobile" property="mobile" />
    </resultMap>
    
	<!-- User 聯(lián)合 Order 查詢 方法的配置 (多對一的方式)  -->	
	<resultMap id="resultUserOrders" type="Order">
	    <id property="orderId" column="order_id" />
	    <result property="orderNo" column="order_no" />
	    <result property="money" column="money" />
	    <result property="userId" column="user_id" />
	    
	    <association property="user" javaType="User">
	        <id property="id" column="id" />
	        <result property="username" column="username" />
	        <result property="mobile" column="mobile" />	        
	    </association>	    
	</resultMap> 
	
	<select id="getUserOrders" parameterType="int" resultMap="resultUserOrders">
	   SELECT u.*,o.* FROM `user` u, `order` o 
	          WHERE u.id=o.user_id AND u.id=#{id}
	</select>
	
	<select id="getUserById" resultMap="resultUser" parameterType="int">
		SELECT *
		FROM user
		WHERE id=#{id}
	</select>    
</mapper>

6、測試執(zhí)行,輸出結(jié)果

我們創(chuàng)建一個控制器類在包 com.yiibai.controller 下,類的名稱為:UserController.java,其代碼如下:
package com.yiibai.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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;

import com.yiibai.maper.UserMaper;
import com.yiibai.pojo.Order;

/** 
 * @describe: 讀取一個用戶下的所有訂單
 * @author: Yiibai 
 * @version: V1.0
 * @copyright http://www.yiibai.com
 */ 

// http://localhost:8080/mybatis07-spring-mvc/user/orders
@Controller
@RequestMapping("/user")
public class UserController {
	@Autowired
	UserMaper userMaper;

	@RequestMapping("/orders")
	public ModelAndView listall(HttpServletRequest request,HttpServletResponse response){
		List<Order> orders=userMaper.getUserOrders(1); 
		System.out.println("orders");
		ModelAndView mav=new ModelAndView("user_orders");
		mav.addObject("orders",orders);
		return mav;
	}
}

接下來還需要創(chuàng)建一個 web 頁面作為結(jié)果輸出,在目錄 WebRoot/WEB-INF/pages 下創(chuàng)建一個名為 user_orders.jsp 文件,其代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>用戶訂單列表</title>
	</head>
	<body>
		<c:forEach items="${orders}" var="order">  
        訂單號:${order.orderNo },訂單總額:${order.money }<br />
		</c:forEach>
	</body>
</html>
然后啟動 MyEclipse 中的 tomcat,具體如下圖所示:

MyBatis整合Spring MVC


注:web.xml 還需要配置一下,詳細(xì)見下載代碼。

在瀏覽器中打開網(wǎng)址:http://localhost:8080/mybatis07-spring-mvc/user/orders,輸出結(jié)果如下圖所示:

工程代碼下載:http://pan.baidu.com/s/1bnkE8cZ

Jar 包下載:http://pan.baidu.com/s/1bnyRJ9H