Spring 与其他框架整合到一起,Spring永远是老大,由Spring整合其他框架
目录
2.在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory
3.2.在SpringIoc容器中注入 service & DAO
Spring 整合 mybatis 测试源码
前言
Mybatis通过使用SqlSessionFactory对象实现数据库的CRUD, Spring要想实现对 Mybatis 的整合,就需要管理该对象 。直接创建Java项目即可进行测试练习,要实现二者整合,需要许多jar包

处理mybatis 需要将 类-表 实现映射,之后 配置config.xml文件,其中的数据库信息和加载映射文件的信息,现将二者清除,相当于新建了一个空的配置文件 。 将mapper文件实现类-表映射;
新建spring的applicationContext.xml配置文件,由于mybatis是通过从config.xml文件产生的对象为 SqlSessionFactory,因此要实现spring整合mybatis,要将数据库配置信息从config.xml文件转移到spring的配置文件 applicationContext.xml 中 在该 spring 的I OC 容器中通过使用bean标签配置实现自动创建mybatis的核心类 SqlSessionFactory,在其中实现将config文件加载和DataSource(数据源)配置。
最后spring产生Mapper对象,实现完全整合控制mybatis(三种方法)。
- DAO层实现类 继承 SqlSessionDaoSupport类(该类提供了SqlSession类从而产生Mapper)
- 省略第一种方式的生成mapper对象实现类MapperFactoryBean,
- 在 2. 的方式基础上实现批量配置实现类MapperScannerConfigurer
spring基础包 + spring扩展包 + mybatis包 + mybatis-spring.jar包 + 其他(commons-*.jar)
一、引入相关jar依赖包
spring-core.jar spring-bean.jar spring-aop.jar spring-expression.jar spring-context.jar spring-context-support.jar spring-tx.jar spring-jdbc.jar spring-web.jar(非web项目可不用) mybatis.jar log4j.jar commons-dbcp.jar commons-pool.jar mysql-connector-java-5.1.36-bin.jar mybatis-spring-1.3.2.jar(mvn下载)
1.mybatis简单的回顾
引入相关的jar包后,开始进行spring与mybatis的整合,不论spring与任何框架整合,spring永远都是 “老大” ,都是spring整合别人。
首先回顾一下mybatis的基础知识。mybatis是一款用以快速实现Java操作数据库实现对数据库中数据的CRUD ,通过使用xml文件(config.xml文件)配置JDBC信息,实现Java连接数据库的封装。conf.xml ->SqlSessionFacotry
通过使用 mapper.xml 文件与Java对象,将CRUD的方式 通过使用 接口方法+mapper.xml 文件 的形式将相关的SQL语句进行执行。通过mapper.xml将 类、表建立映射关系。 最后,mybatis 可以在加载完config文件后创建工厂,实现对象的方法调用
// 分别使用普通方式与 反向代理 方式 实现Java操作数据库实现 CRUD
package priv.practice.orm;
import java.io.IOException;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import priv.practie.mapper.*;
public class ProxyApply {
public static void query() throws IOException {
String source = "mybatis-config.xml";
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build
(Resources.getResourceAsReader(source) );
SqlSession session=factory.openSession();
String querySql ="priv.practie.mapper.UserMapper.selectById";
User user=(User) session.selectOne(querySql, 5);
user.toString();
}
public static void queryProxy(int id) throws IOException {
SqlSessionFactoryUtils utils = new SqlSessionFactoryUtils();
SqlSessionFactory factory = utils.getInstance();
SqlSession session=factory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user= userMapper.selectById(id);
user.toString();
session.close();
}
// add user addUser(user) name + pwd
public static void addUser(User user) throws IOException {
SqlSessionFactory utils = new SqlSessionFactoryUtils().getInstance();
SqlSession session = utils.openSession();
UserMapper adduser = session.getMapper(UserMapper.class);
adduser.addUser(user);
session.commit();
session.close();
}
//delete User
public static void deleteUser(String name) throws IOException {
SqlSessionFactory factory = new SqlSessionFactoryUtils().getInstance();
SqlSession session = factory.openSession();
UserMapper dUser = session.getMapper(UserMapper.class);
dUser.deleteUser(name);
session.commit();
session.close();
}
// selectAllUsers
public static List<User> getAllUsers() throws IOException {
SqlSessionFactory factory = new SqlSessionFactoryUtils().getInstance();
SqlSession session = factory.openSession();
UserMapper allUsers =session.getMapper(UserMapper.class) ;
List<User> users =allUsers.selectAllUsers();
System.out.println(users);
session.close();
return users;
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// query() ;
// queryProxy(1) ;
// User adduser = new User("ET","aliens");//"me","ffff"
// addUser(adduser);
// queryProxy(12) ;
//
//delete User
// deleteUser("me");
getAllUsers();
}
}
2.spring 整合 mybatis 的原理
config.xml 存储2大类信息 数据库配置信息(JDBC) & 映射文件(mapper.xml)信息。 1.产生 SqlSessionFactory 所需要的数据库信息 在spring的配置文件(applicationContext.xml)以bean的形式配置。
首先要将原mybatis中config.xml文件的JDBC信息加载到spring的配置文件(applicationContext)中,再 产生 mybatis的核心类 SqlSessionFactory factory 后进行相关操作。
<!-- 加载 db.properties -->
<bean id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<!-- db.properties 文件在 src下,就是默认的 类路径 -->
<property name="locations">
<array>
<value>classpath:db.properties</value>
</array>
</property>
</bean><!-- 配置数据库信息,取代mybatis中conf.xml中的dataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value ="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value= "${password}"></property>
</bean><!--在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis的配置文件conf
<property name="configLocation" value="classpath:config.xml"></property>
-->
<!--加载mapper文件 * 可加载多个 -->
<property name="mapperLocations" value="priv/sm/mapper/*.xml"></property></bean>
<bean id ="userDaoId" class="priv.apply.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="SqlSessionFactory"></property>
</bean><bean id="userServiceId" class = "priv.apply.service.UserService">
<property name="userDao" ref="userDaoId"></property>
</bean>
</beans>
生成 SqlSessionFactory 后产生 mybatis的动态代理对象 Mapper 有3种方法
二、使用步骤
0. 加载 db.properties
在src目录下新建 db.properties文件,位置与相关文件结构 如图

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/person
username=root
password=root
1.在SpringIoc容器中 加载 JDBC 信息
在mybatis的conf.xml中 主要就是JDBC的配置信息和加载mapper.xml的文件信息。先把JDBC的信息加载到applicationContext.xml文件中。(db.properties也通过bean的形式加载)
<!-- 加载 db.properties -->
<bean id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<!-- db.properties 文件在 src下,就是默认的 类路径 -->
<property name="locations">
<array>
<value>classpath:db.properties</value>
</array>
</property>
</bean>
<!-- 配置数据库信息,取代mybatis中conf.xml中的dataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value ="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value= "${password}"></property>
</bean>
2.在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory
要想产生 SqlSessionFactory ,新建bean id为SqlSessionFactory,class固定值为 SqlSessionFactoryBean ,其中两个属性 1.dataSource(引用之前的JDBC信息) & 2.configLocation(加载conf文件,之后可以将mapper信息加载进来后省略)。
代码如下(示例):
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis的配置文件conf-->
<property name="configLocation" value="classpath:config.xml"></property>
</bean>
该处使用的configLocation可以在后期省略,使用其他方式直接将 mybatis的conf.xml中的mapper信息: <mapper resource="priv/sm/mapper/UserMapper.xml" /> 加载进IOC容器。
3.2.在SpringIoc容器中注入 service & DAO
<bean id ="userDaoId" class="priv.apply.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="SqlSessionFactory"></property>
</bean><bean id="userServiceId" class = "priv.apply.service.UserService">
<property name="userDao" ref="userDaoId"></property>
</bean>
开始测试,main 代码如下:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service =(UserService)applicationContext.getBean( "userServiceId");
User user = new User("zds16","016");
service.addService(user);
dao层除了要实现其接口,还有继承某个特定的类 SqlSessionDaoSupport,代码如下:
public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
//extends SqlSessionDaoSupport 获取sqlsession
@Override
public void addUser(User user) {
// TODO Auto-generated method stub
SqlSession sqlSession = super.getSqlSession() ;
UserMapper userDao =sqlSession.getMapper(priv.sm.mapper.UserMapper.class);
userDao.addUser(user);
}
效果图:

另外,可以将mybatis的配置文件省略,直接在IOC中加载mapper信息,配置如下
<!--在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis的配置文件conf
<property name="configLocation" value="classpath:config.xml"></property>
-->
<!--加载mapper文件 * 可加载多个 -->
<property name="mapperLocations" value="priv/sm/mapper/*.xml"></property></bean>
不在使用mybatis的config.xml文件,直接在产生 SqlSessionFactory 时加载,“*”表示可以加载多个mapper文件。
三、补充
除了上述通过使用dao层的具体实现类实现了整合,可以省略掉DAO层的实现类注入到IOC,可以将IOC容器中的直接使用 class="org.mybatis.spring.mapper.MapperFactoryBean" 自动生成dao层的bean,对应类的接口可以 使用 mapperInterface 属性名配置。其他代码不变。配置信息如下:
<!-- 第二种方法可以直接省略DAO的实现类,使用 MapperFactoryBean 自动生成 sqlSessionFactory-->
<bean id ="userDaoId" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 由于不直接注入 UserDaoImpl,需要注明该类对应的接口-->
<property name="mapperInterface" value="priv.sm.mapper.UserMapper"></property>
<property name="sqlSessionFactory" ref="SqlSessionFactory"></property>
</bean>
第三种方法:
使用包扫描一次可以加载多个mapper。配置信息基本如下图:

注意要产生sqlSessionFactory,在第三种的配置中有差异,name 应该修改为 sqlSessionFactoryBeanName ,ref修改为value 。 将service的bean中引用的userID更改为借口名(首字母小写),上方的bean不写id,直接只写class配置。属性中的包名有多个,通过使用逗号分隔。 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">。修改后配置如下
<!-- 第三种方法 直接使用扫描包 批量配置DAO层 实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定批量产生多个mapper对应的包 -->
<property name= "basePackage" value=" priv.sm.mapper"></property>
<property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"></property>
</bean><bean id="userServiceId" class = "priv.apply.service.UserService">
<property name="userDao" ref="userMapper"></property>
</bean>
最终版的applicationContext.xml文件如下:
<!-- 加载 db.properties -->
<bean id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<!-- db.properties 文件在 src下,就是默认的 类路径 -->
<property name="locations">
<array>
<value>classpath:db.properties</value>
</array>
</property>
</bean><!-- 配置数据库信息,取代mybatis中conf.xml中的dataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value ="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value= "${password}"></property>
</bean><!--在SpringIoc容器中 产生mybatis的核心类 SqlSessionFactory -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis的配置文件conf
<property name="configLocation" value="classpath:config.xml"></property>
-->
<!--加载mapper文件 * 可加载多个 -->
<property name="mapperLocations" value="priv/sm/mapper/*.xml"></property></bean>
<!-- 第一种方法 配置DAO层的实现类,继承父类注入产生 sqlSessionFactory
<bean id ="userDaoId" class="priv.apply.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="SqlSessionFactory"></property>
</bean>
-->
<!-- 第二种方法可以直接省略DAO的实现类,使用 MapperFactoryBean 自动生成 sqlSessionFactory
<bean id ="userDaoId" class="org.mybatis.spring.mapper.MapperFactoryBean">-->
<!-- 由于不直接注入 UserDaoImpl,需要注明该类对应的接口
<property name="mapperInterface" value="priv.sm.mapper.UserMapper"></property>
<property name="sqlSessionFactory" ref="SqlSessionFactory"></property>
</bean>
-->
<!-- 第三种方法 直接使用扫描包 批量配置DAO层 实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定批量产生多个mapper对应的包 -->
<property name= "basePackage" value=" priv.sm.mapper"></property>
<property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"></property>
</bean><bean id="userServiceId" class = "priv.apply.service.UserService">
<property name="userDao" ref="userMapper"></property>
</bean>
</beans>

本文详细介绍了如何在Spring中整合MyBatis,包括引入相关jar包、配置数据库信息、创建SqlSessionFactory以及三种不同的DAO层实现方式。通过Spring管理MyBatis,可以实现对数据库操作的便捷控制。

2594

被折叠的 条评论
为什么被折叠?



