在前面的教程文章中,前面讲到有关 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集成