用过来的,MyBatis 的前身就是 iBatis 两者还很有区别,也有很大的改进,MyBatis 对 sql的支持更好,更加灵活. 1.如何和spring集成到一起? 第一步肯定是在applicationContext.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 { } } 还可以用添加一写类似于拦截器的功能,比如在某个Service执行update时候拦截,等等... 今天先写到这里,这个是sqlSessionFactory 里面主要属性的介绍.明天继续.... http://www./architecture/20071.html |
|