这次写个 mybatis 免dao层 的配置.
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:spring/mybatis_config.xml"/>
<property name="mapperLocations" value="classpath:cn/com/taiji/mapping/*.xml"></property>
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager2" />
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.com.taiji.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- sqlSessionTemplate配置 这个使用只需要namespace.id 就行了, 不需要管是否名字匹配 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
@Service
@Transactional(propagation=Propagation.REQUIRED)public class BasicServiceImpl extends DataSourceImpl implements BasicService {
//由Spring 注入数据操作层得实现.
@Autowired
protected SqlSession sqlSession;
public SqlSession getSqlSession() {
return sqlSession;
}
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public <T> T queryById( String statementId, String paramString ) throws RuntimeException, SQLException, Exception {
// TODO Auto-generated method stub
return this.sqlSession.selectOne(statementId, paramString);
}
DataSourceImpl 只是自己的jdbc操作模板这个不用管.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="SelectOne_infolink">
<!-- 公共的试动态菜单查询条件SQL块 -->
<sql id="dynamicSelectConditions">
L.DELETE_FLOG = 1
</sql>
<select id="selectOneReMap" resultType="map" parameterType="java.util.HashMap">
SELECT
INFOLINK_ID, INFOLINK_URL, DEPT_ID, INFOLINK_TYPE, INFOLINK_TITLE,
CREATED_TIME, UPDATE_TIME, INFOLINK_STATE, CONTENT, UPLOAD_FILEN_AME,
SERVER_SAVE_FILENAME, INFOLINK_ORIGIN, PIC, SUMMARY, USER_ID,
REMARK, KEYWORD, DELETE_FLOG
FROM
INFOLINK L
WHERE L.INFOLINK_ID = #{INFOLINK_ID}
</select>
</mapper>
如上 你需要的所有配置已完成, 非常简单. 这里不需要为 每张表配置dao, 实体类. 当然你配了也不影响.
无非就是使用Map或者实体类的问题.
@Service
public class CmsServiceImpl extends BasicServiceImpl implements CmsService
public Object selectOne(String statementId, Map<String, Object> parameter) throws RuntimeException, SQLException, Exception {
DataSourceContextHolder.setDataSourceType("taiji");
//定义一个无返回值的状态
Object obj = Message.Result.ERROR ;
Map<String, Object> map = null;
if( parameter!=null && parameter.containsKey("INFOLINK_ID") ){
map = this.queryById(statementId, String.valueOf( parameter.get("INFOLINK_ID") ));
}
return StringUtils.isNullOrEmpty(map) ? obj : map;
}
按照第一篇中的测试类文件进行测试
@Inject
CmsService cmsService;
@Test
public void run() {
Map parameter = new HashMap();
parameter.put("INFOLINK_ID", "4717a9369efb4bbcad10afd7d174a463");
try {
cmsService.selectOne("SelectOne_infolink.selectOneReMap", parameter);
} catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}