spring和mybactis的整合
Spring和mybactis的整合其实很简单,在Spring中我们可以将bean当做事务来管理,而在这里我们将mybactis中的接口也可以看是一个bean,吧这些接口交个Spring来管理它。
例子:
数据库的表机构:
User表:
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULLAUTO_INCREMENT,
`username` varchar(64) NOT NULLDEFAULT '',
`mobile` varchar(16) NOT NULLDEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', 'yiibai', '13838009988');
INSERT INTO `user` VALUES ('2', 'saya', '13838009988');
Order表:
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;
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:
package com.huweiyang.bean;
/*
* 编写user表的实体类
*/
publicclassUser{
privateintid;
privateStringusername;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetUsername(){
returnusername;
publicvoidsetUsername(Stringusername){
this.username=username;
publicStringgetMobile(){
returnmobile;
publicvoidsetMobile(Stringmobile){
this.mobile=mobile;
privateStringmobile;
Order:
package com.huweiyang.bean;
/*
* 编写order表的实体类
*/
publicclassOrder{
privateintorder_id;
privateStringorder_no;
privateStringmoney;
privateintuser_id;
publicintgetOrder_id(){
returnorder_id;
}
publicvoidsetOrder_id(intorder_id){
this.order_id=order_id;
}
publicStringgetOrder_no(){
returnorder_no;
}
publicvoidsetOrder_no(Stringorder_no){
this.order_no=order_no;
}
publicStringgetMoney(){
returnmoney;
}
publicvoidsetMoney(Stringmoney){
this.money=money;
}
publicintgetUser_id(){
returnuser_id;
}
publicvoidsetUser_id(intuser_id){
this.user_id=user_id;
}
publicUsergetUser(){
returnuser;
}
publicvoidsetUser(Useruser){
this.user=user;
}
privateUseruser;
}
实体类的映射文件:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 3.0//EN" "mybatis-3-mapper.dtd">
<!-- 这里的路径是这个映射文件对应的接口路径 -->
<mapper namespace="com.huweiyang.maper.UserMaperIU">
<!-- 配置resultMap属性这里的resultMap是查询User中的id-->
<resultMap type="User" id="MapUser">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="mobile" column="mobile"/>
</resultMap>
<!-- 编写查询user id的sql语句 -->
<select id="getUser" resultMap="MapUser"parameterType="int">
SELECT*
FROMuser
WHEREid=#{id}
</select>
<!-- 使用association将Order和user表关联,实现多对一的思想 -->
<!-- 这里的resultMap中的type属性对应的是实体类的类名,而,result中的property属性表示的是在我们程序中与数据表中的字段对应的属性 -->
<!-- 而column属性的值也就是数据表中的对应的字段 -->
<resultMap type="Order" id="MapOrder">
<result property="order_id" column="order_id"/>
<result property="user_id" column="order_id"/>
<result property="order_no" column="order_no"/>
<result property="money" column="money"/>
<!-- 这里的association属性中的property的值是我们数据表中的表名,而JavaType是我们的实体类的类名 -->
<association property="user" javaType="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="mobile" column="mobile"/>
</association>
</resultMap>
<!-- 编写关联两种表的sql语句 -->
<select id="getOrderSelect" resultMap="MapOrder" parameterType="int">
SELECT
u.*,o.*FROM `user` u, `order` o
WHEREu.id=o.user_id AND u.id=#{id}
</select>
</mapper>
Mybactis的主配置文件:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTDconfig 3.0//EN" "mybatis-3-config.dtd">
<configuration>
<!-- 这里的typeAliases配置的是实体类的路径 -->
<typeAliases>
<typeAlias type="com.huweiyang.bean.User"/>
<typeAlias type="com.huweiyang.bean.Order"/>
</typeAliases>
<mappers>
<!-- 这里的是表名实体类的映射文件对应的路径-->
<mapper resource="com/huweiyang/maper/userMaper.xml"/>
</mappers>
</configuration>
Spring的配置文件:
这里也就是Spring和mybactis整合的重点
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 这个配置文件的主要目的是将mybactis看做是事务来处理-->
<!-- 这里配置的是数据库就连接方式,这里的id和class的值是不能被改变的,除非是你用的不是dbcp的路径方法,但是都是大同小异-->
<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/springmv?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="lookme"/>
</bean>
<!-- 这里配置的是mybactis的主配置文件的名称,和配置sqlsessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="conf.xml"/>
</bean>
<!-- 将接口给Spring当做是一个事务来管理 -->
<bean id="userMaper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<property name="mapperInterface" value="com.huweiyang.maper.UserMaperIU" />
</bean>
</beans>
接口:
package com.huweiyang.maper;
import java.util.List;
import com.huweiyang.bean.Order;
import com.huweiyang.bean.User;
public interface UserMaperIU {
//定义一个查询user表的方法
public User getUser(intid);
//定义一个多对一的查询方法
public List<Order>getOrderSelect(int id);
}
测试类:
package com.huweiyang.Mapping;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.huweiyang.bean.Order;
import com.huweiyang.bean.User;
import com.huweiyang.maper.UserMaperIU;
public class Mapping {
public static void main(String[] args) {
// 读取Spring配置文件
ApplicationContext sr = new ClassPathXmlApplicationContext("applicationContext.xml");
// 调用接口中的查询方法
UserMaperIU useriu = sr.getBean(UserMaperIU.class);
User user = useriu.getUser(1);
System.out.println(user.getUsername());
System.out.println("得到用户id为1的所有订单列表:");
System.out.println("=============================================");
// 调用多对有的查询方法
List<Order> list = useriu.getOrderSelect(1);
for(Order order:list){
System.out.println(order.getOrder_no());
System.out.println(order.getMoney());
}
}
}
结构如图: