前面讲到纯粹用mybatis 连接数据库,然后 进行增删改查,以及多表联合查询的的例子,但实际项目中,通常会用 spring 这个沾合剂来管理 datasource 等。充分利用spring 基于接口的编程,以及aop ,ioc 带来的方便。用spring 来管理 mybatis 与管理hibernate 有很多类似的地方。今天的重点就是数据源管理以及 bean的配置。
Spring作为基础框架,可以集成后端框架,如Hibernate,MyBatis等。
前面介绍单独使用MyBatis的,大致逻辑是:
sqlSessionFactory <- configuration file (包括数据库连接配置) IXxxMapper <- sqlSession <- sqlSessionFactory <- mapper interface <- mapper xml
得到IxxMapper后,就可以调用其方法进行数据交互了。
和Spring集成时,上面的这些对象需要作为bean来管理:
dataSource bean <- 数据库连接配置 sqlSessionFactory bean <- dataSource <- configuration file userMapper bean <- sqlSessionFactory <- mapper interface
一.工程结构图
二.在类路径下创建beans-da.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><!-- 数据库连接bean --> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://10.60.222.65:3306/test?characterEncoding=utf8" /> <property name="username" value="test" /> <property name="password" value="test" /> </bean> <!-- sqlSessionFactory bean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /><!-- 数据源 --> <property name="configLocation" value="classpath:Configuration.xml" /><!-- 配置文件 --> </bean> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><!-- user映射bean--> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> <property name="mapperInterface" value="com.bijian.study.dao.IUserMapper" /><!-- 映射接口 --> </bean> </beans>
三.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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.xsd"> <context:property-placeholder location="classpath:/database.properties" /><!-- 数据库配置文件 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" p:driverClassName="${driverClassName}" p:url="${url}" p:username="${user_name}" p:password="${password}" /><!-- 数据源配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- sqlSessionFactory对象 --> <property name="dataSource" ref="dataSource" /><!-- 数据源 --> <property name="configLocation" value="classpath:Configuration.xml" /><!-- myBatis配置文件 --> <!--<property name="mapperLocations" value="classpath*:com/bijian/study/model/*.xml" />--><!-- 可以在Configuration.xml或此处配置映射文件,但其中不能有相同id的parameterMap, resultMap或sql等 --> </bean> <bean id="mapperConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 扫描指定包以获取映射器 --> <property name="basePackage" value="com.bijian.study.dao" /> </bean> </beans>
四.测试类
package com.bijian.study.test;
import java.util.List;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bijian.study.dao.IUserMapper;
import com.bijian.study.model.Article;
import com.bijian.study.model.User;
public class SpringIntegrationTest {
private static final Logger log = LoggerFactory.getLogger(SpringIntegrationTest.class);
private static ApplicationContext ctx;
static {
ctx = new ClassPathXmlApplicationContext("beans-da.xml");
}
@Test
public void queryTest() {
IUserMapper mapper = (IUserMapper)ctx.getBean("userMapper");
User user = mapper.getUserById(1);
log.info("Name: {}, address: {}", user.getName(), user.getAddress());
//得到文章列表测试
log.info("得到用户id为1的所有文章列表");
List<Article> articles = mapper.getArticlesByUserId(1);
for(Article article:articles){
log.info(article.getContent() + "--" + article.getTitle() + "--" + article.getUser().getName());
}
}
}