作为Bean容器,Spring框架提供了IoC机制,可以接管所有的组件的创建工作并进行依赖管理,整合的主要工作就是把Mybatis框架使用中所涉及的核心组件配置到Spring容器中,交给Spring和创建和管理。
具体来说,业务逻辑对象依赖基于Mybatis技术实现Dao对象,核心是获取SqlSession实例,则需要依赖SqlSessionFactory而SqlSessionFactory是SqlSessionFactoryBuider依据Mybatis配置文件中的数据源、SQL映射文件等信息来构建的。
整合优势:
Spring对Mybatis 进行整合,在对组件实现解耦的同时还能使Mybatis框架的使用变得更加方便和简单。此外,通过Spring提供的声明式事务等服务,能进一步简化开发工作量,提高开发效率。
整合示例
1、数据库建表添加测试数据
use mybatis; CREATE TABLE `user` ( `uId` int(4) NOT NULL AUTO_INCREMENT, `uName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `uPwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `account` decimal(10, 2) NOT NULL, PRIMARY KEY (`uId`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; INSERT INTO `user` VALUES (2, '张三', '123456', 123.00); INSERT INTO `user` VALUES (9, '李四', '123123', 123.93); INSERT INTO `user` VALUES (10, '王五', '123123', 200.93);
2、配置项目(重点)
连接数据库的配置文件:db.properties
//mysql驱动类 jdbc.driver=com.mysql.jdbc.Driver //mysql连接的url地址 jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8 //连接mysql数据库的用户名 jdbc.username=root //连接mysql数据库的密码 jdbc.password=xiaotong
spring核心配置文件:spring.cfg.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <!-- 扫描包中注解标注类 --> <context:component-scan base-package="dao,service,entity,aop"/> <!-- 引入数据库配置文件 db.properties --> <context:property-placeholder location="classpath:db.properties" /> <!-- 配置数据源,使用dbcp数据库连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- SqlSessionFactory配置 --> <!-- 让Spring管理SqlSessionFactory使用mybatis和spring整合包中的 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 数据库连接池 --> <property name="dataSource" ref="dataSource" /> <!-- 加载mybatis的全局配置文件 --> <property name="configLocation" value="classpath:mybatis.cfg.xml" /> <!--配置SQL映射文件--> <property name="mapperLocations"> <list> <!--扫描mapper包下所有的xml格式的文件--> <value>classpath:mapper/userMapper.xml</value> </list> </property> </bean> <!-- 使用MapperScannerConfigurer扫描指定包的接口,并自动生成MapperFactoryBean --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="dao"/> </bean> </beans>
mybatis 核心配置文件:mybatis.cfg.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> <!--设置运行时的行为--> <settings> <setting name="logImpl" value="LOG4J"/> <!--设置为FULL,自动匹配所有,则在resultMap中不进行匹配的字段也可以映射--> <setting name="autoMappingBehavior" value="FULL"/> </settings> <!--指向包含实体类的包--> <typeAliases> <package name="entity"/> </typeAliases> </configuration>
2、实体类:User.java
package entity; public class User { private int uId; private String uName; private String uPwd; private double account; public User() { } public User(int uId, String uName, String uPwd, double account) { this.uId = uId; this.uName = uName; this.uPwd = uPwd; this.account = account; } @Override public String toString() { return "User{" + "uId=" + uId + ", uName='" + uName + '\'' + ", uPwd='" + uPwd + '\'' + ", account=" + account + '}'; } public int getuId() { return uId; } public void setuId(int uId) { this.uId = uId; } public String getuName() { return uName; } public void setuName(String uName) { this.uName = uName; } public String getuPwd() { return uPwd; } public void setuPwd(String uPwd) { this.uPwd = uPwd; } public double getAccount() { return account; } public void setAccount(double account) { this.account = account; } }
3、数据访问层
dao层接口:userDao.java
package dao; import entity.User; import java.util.List; public interface UserDao { List<User> getAllUser(); }
mapper映射文件:userMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="dao.UserDao"> <select id="getAllUser" resultType="entity.User"> select * from user </select> </mapper>
4、服务层
服务层接口:userService.java
package service; public interface UserService { void demo(); }
服务层实现类:userServiceImpl.java
package service; import dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @Service("userService") public class UserServiceImpl implements UserService { @Autowired @Qualifier("userDao") private UserDao userDao; @Override public void demo() { // TODO Auto-generated method stub System.out.println(userDao.getAllUser()); } }
5、测试
junit测试:test.java
import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import service.UserService; public class test { @Test public void testDemo(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.cfg.xml"); UserService service = (UserService)context.getBean("userService"); service.demo(); } }
测试结果: