Myibatis和spring(mvc)的集成

本文详细介绍了MyBatis与iBatis的区别,并指导如何在Spring 3.0中集成MyBatis 3.0。通过在applicationContext.xml中配置MyBatis组件,实现SqlSessionFactory的创建,以及通过MapperScannerConfigurer自动扫描映射器。重点讨论了SqlSessionFactory的主要属性配置,如数据源、配置文件路径、类型别名和映射器位置。此外,展示了如何自定义MyBatis的行为,例如处理存储过程返回的游标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用过来的,MyBatis 的前身就是 iBatis 两者还很有区别,也有很大的改进,MyBatis 对sql的支持更好,更加灵活.

第一步肯定是在appli
cat ionCont ex t.xml中增加相应的配置,有spring容器来管理Myibatis,那么这个jar是必不可少的 mybatis-spring-1.0.1-SNAPSHOT.jar由于Spring 3.0仅支持 iBatis2。那么,我们就想将 MyBatis3 的支持添加到 Spring3.0中。不幸的是,Spring 3.0 的开发在 MyBatis 3.0 官方发布前就结束了。所以这个jar不是spring官方的,应该是MyBatis团队的后续开发的在 MyBatis-Spring 中,SqlSessionFactoryBean 是用于创建 SqlSessionFactory 的。要配置这个工bean,放置下面的代码在 Spring 的 applicationContext.xml 配置文件中。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="configLocation" value="classpath:/config/ibatisConfig.xml" />
	<property name="typeAliasesPackage" value="com.ibatis.model" />
	<property name="mapperLocations" value="classpath*:com/ibatis/mapper/*.xml" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="com.ibatis.dao" />
</bean>

要注意 SqlSessionFactory 需要一个 DataSource,这可以是任意的 DataSource,配置它就和配置其它 Spring 数据库连接一样SqlSessionFactoryBean 实现了 Spring 的 FactoryBean 接口,这就说明由 Spring 最终创建的 bean不是SessionFactoryBean 本身,而是工厂类的 getObject()返回的方法的结果。这种情况下,Spring 将会在应用启动时为你创建 SqlSessionFactory 对象,然后将它以 SqlSessionFactory 为名来存储.

在一般的 MyBatis-Spring 用法中,你不需要直接使用 SqlSessionFactoryBean 或和其对应的 SqlSessionFactory。相反,session 工厂将会被注入到apperFactoryBean 或其它扩展了 SqlSessionDaoSupport 的 DAO

SqlSessionFactory的几个主要属性:
有一个单独的必须属性,就是 JDBC 的 DataSource。这可以是任意的 DataSource,其配置应该和其它 Spring 数据库连接是一样的。 一个通用的属性是 configLocation,它是用来指定 MyBatis 的 XML 配置文件路径的。如果基本的MyBatis 配置需要改变,那么这就是一个需要它的地方。通常这会是<settings>或<typeAliases>的部分。要注意这个配置文件不需要是一个完整的 MyBatis 配置。确定地说,任意环境,数据源和 MyBatis 的事务管理器都会被忽略SqlSessionFactoryBean 会创建它自己的,使用这些值定制 MyBatis 的 Environment 时是需要的。如果yBatis 映射器 XML 文件在和映射器类相同的路径下不存在,那么另外一个需要配置文件的原因就是它了。使用这个配置,有两种选择。第一是手动在 MyBatis 的 XML 配置文件中使用<mappers>部分来指定类路径。第二是使用工厂 bean 的 mapperLocations 属性。

属性mapperLocations
使用一个资源位置的 list。这个属性可以用来指定 MyBatis 的 XML映射器文件的位置。它的值可以包含 Ant 样式来加载一个目录中所有文件,或者从基路径下递归搜索所有路径。classpath*:com/ibatis/mapper/*.xml

属性typeAliasesPackage
从名字看来是[类型的alias.html' target='_blank'>别名]包,猜也就是把这个包下面的类默认生成一个别名,就类名全称,配置这个以后,在以后我们的映射文件*Mapper.xml中就可以使用它,不用在  resultType="com.*.*.Person"什么的,可以直接使用类名即可,
resultType="Person".

属性configLocation
是用来加载mybatis-config.xml文件(文件名可以任意)用来修改一些Myibatis的默认属性和核心配置,比如我们在用到存储过程时候返回的游标[CURSOR],但是我们想把这个游标变成一个List<Map<String,Object>>的集合,那么我可以写个类来继承BaseTypeHandler这个类来实现处理,方法如下:
在mybatis-config.xml 添加

<typeHandlers>
	<typeHandler javaType="Map" jdbcType="CURSOR" handler="com.ibatis.typeHandler.ResultSetTypeHandler"/>
</typeHandlers>


那么,ResultSetTypeHandler这个类就是具体的实现代码如下:
package com.ibatis.typeHandler;


import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

/**
 * 存储过程的游标解析器
 * @author wujj
 */
public class ResultSetTypeHandler extends BaseTypeHandler<List<Map<String, Object>>> {

	@Override
	public List<Map<String, Object>> getNullableResult(ResultSet arg0, String arg1) throws SQLException {
		return null;
	}

	@Override
	public List<Map<String, Object>> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

		ResultSet rs = (ResultSet) cs.getObject(columnIndex);

		if (!rs.isClosed()) {

			ResultSetMetaData data = rs.getMetaData();
			int columnCnt = data.getColumnCount();

			while (rs.next()) {
				Map<String, Object> rowMap = new HashMap<String, Object>();
				for (int i = 1; i <= columnCnt; i++) {
					String colName = data.getColumnName(i).toLowerCase();
					Object colValue = rs.getObject(colName);
					// TODO 类型处理
					rowMap.put(colName, colValue == null ? StringUtils.EMPTY : colValue.toString());
				}
				result.add(rowMap);
			}
		}

		return result;
	}

	@Override
	public void setNonNullParameter(PreparedStatement arg0, int arg1, List<Map<String, Object>> arg2, JdbcType arg3) throws SQLException {
	}

}
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业开发者提供了丰富的工具 API,助力他们构建、运营推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能体验,因为它针对华为硬件进行了
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值