在前面的教程文章中,前面讲到有关 mybatis 连接数据库,然后进行进行数据增删改查,以及多表联合查询的例子,但很多的项目中,通常会用 spring 这个粘合剂来管理 datasource 等。充分利用 spring 基于接口的编程,以及aop ,ioc 带来的方便。用 spring 来管理 mybatis 与管理 hibernate 有很多类似的地方。在这一节中,我们重点介绍数据源管理以及 bean 的配置。
整个mybatis与spring集成示例要完成的步骤如下:
1、示例功能描述
2、创建工程
3、数据库表结构及数据记录
4、实例对象
5、配置文件
6、测试执行,输出结果
在本示例中,需要完成这样的一个简单功能,即,指定一个用户(id=1),查询出这个用户的基本信息,并关联查询这个用户的所有订单。
首先创建一个工程的名称为:mybatis07-spring,在 src 源代码目录下建立文件夹 config,并将原来的 mybatis 配置文件 configuration.xml 移动到这个文件夹中, 并在 config 文家夹中建立 spring 配置文件:applicationcontext.xml。工程结构目录如下:

在本示例中,用到两个表:用户表和订单表,其结构和数据记录如下:
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', 'h3', '13838009988');
insert into `user` values ('2', 'saya', '13838009988');
订单表结构和数据如下:
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');
用户表和订单表分别对应两个实例对象,分别是:user.java 和 order.java,它们都在 com.h3.pojo 包中。
user.java代码内容如下:
package com.h3.pojo;
import java.util.list;
/**
* @describe: user
* @author: h3
* @version: v1.0
* @copyright http://www.h3.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代码内容如下:
package com.h3.pojo;
/**
* @describe: order - 订单
* @author: h3
* @version: v1.0
* @copyright http://www.h3.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;
}
}
这个实例中有三个重要的配置文件,它们分别是:applicationcontext.xml , configuration.xml 以及 usermaper.xml。
applicationcontext.xml 配置文件里最主要的配置:
<?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.h3.pojo.user" /> <typealias alias="order" type="com.h3.pojo.order" /> </typealiases> <!-- mybatis和spring 集成之后,这些可以完全删除(注释掉),数据库连接的管理交给 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/h3?characterencoding=utf8" /> <property name="username" value="root"/> <property name="password" value=""/> </datasource> </environment> </environments> --> <mappers> <mapper resource="com/h3/maper/usermaper.xml" /> </mappers> </configuration>
配置文件 configuration.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"
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">
<bean id="datasource" class="org.apache.commons.dbcp.basicdatasource">
<property name="driverclassname" value="com.mysql.jdbc.driver" />
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/h3?characterencoding=utf8" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<bean id="sqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean">
<!--datasource属性指定要用到的连接池-->
<property name="datasource" ref="datasource" />
<!--configlocation属性指定mybatis的核心配置文件-->
<property name="configlocation" value="config/configuration.xml" />
</bean>
<bean id="usermaper" class="org.mybatis.spring.mapper.mapperfactorybean">
<!--sqlsessionfactory属性指定要用到的sqlsessionfactory实例-->
<property name="sqlsessionfactory" ref="sqlsessionfactory" />
<!--mapperinterface属性指定映射器接口,用于实现此接口并生成映射器对象-->
<property name="mapperinterface" value="com.h3.maper.usermaper" />
</bean>
</beans>
usermaper.xml 用于定义查询和数据对象映射,其内容如下:
<?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.h3.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 联合 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>
我们创建一个测试类为:main.java , 就在 src 目录中。其代码如下:
import java.util.list;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
import com.h3.maper.usermaper;
import com.h3.pojo.order;
import com.h3.pojo.user;
/**
* description
* @author h3
* @date 2015-4-12
* @copyright http://www.h3.com
* @email h3.com@gmai.com
* @version 1.0
*/
public class main {
private static applicationcontext ctx;
static {
ctx = new classpathxmlapplicationcontext(
"config/applicationcontext.xml");
}
public static void main(string[] args) {
usermaper usermaper = (usermaper) ctx.getbean("usermaper");
// 测试id=1的用户查询,可根据数据库中的情况修改.
user user = usermaper.getuserbyid(1);
system.out.println("获取用户 id=1 的用户名:"+user.getusername());
// 得到文章列表测试
system.out.println("得到用户id为1的所有订单列表:");
system.out.println("=============================================");
list<order> orders = usermaper.getuserorders(1);
for (order order : orders) {
system.out.println("订单号:"+order.getorderno() + ",订单金额:" + order.getmoney());
}
}
}
运行结果如下:
log4j:warn no appenders could be found for logger (org.springframework.context.support.classpathxmlapplicationcontext). log4j:warn please initialize the log4j system properly. 获取用户 id=1 的用户名:h3 得到用户id为1的所有订单列表: ============================================= 订单号:1509289090,订单金额:99.9 订单号:1519289091,订单金额:290.8 订单号:1509294321,订单金额:919.9 订单号:1601232190,订单金额:329.9 订单号:1503457384,订单金额:321.0 订单号:1598572382,订单金额:342.0 订单号:1500845727,订单金额:458.0 订单号:1508458923,订单金额:1200.0 订单号:1504538293,订单金额:2109.0 订单号:1932428723,订单金额:5888.0 订单号:2390423712,订单金额:3219.0 订单号:4587923992,订单金额:123.0 订单号:4095378812,订单金额:421.0 订单号:9423890127,订单金额:678.0 订单号:7859213249,订单金额:7689.0 订单号:4598450230,订单金额:909.2
代码下载:mybatis与spring集成