spring+mybatis的公用DAO

這裏的配置和http://my.oschina.net/u/2274874/blog/639504中用到的差很少,只是作了一些小改動。html

把整合ibatis這段改一下就能夠了,這裏把標籤改簡潔了,不改也能夠。java

<!-- 整合mybatis -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="DataSource" />
		<property name="configLocation" value="classpath:SqlMapConfig.xml" />
	</bean>

這個DAO繼承了SqlSessionDaoSupport,用到mybatis-spring,主要就是批量處理。在網上找了不少資料,發現不少都是經過改造xml的sql語句來達到批量操做的效果。這裏我只是實驗了批量插入的例子,其餘的沒試,估計也差很少吧,之後有用到再說,如今只是試試。spring

public class BaseDao extends SqlSessionDaoSupport {
	
	private static final Logger logger = Logger.getLogger(Thread
            .currentThread().getStackTrace()[1].getClassName());
	
    @Resource(name = "sqlSessionFactory")
    private SqlSessionFactory sqlSessionFactory;

    private SqlSession batchSession;
    
    @PostConstruct
    public void SqlSessionFactory() {
        super.setSqlSessionFactory(sqlSessionFactory);
    }
    
    public int batchInsert(String statement, List<?> list) {
    	batchSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
    	int i = 0;
    	for(int cnt = list.size(); i < cnt; i++) {
    		batchSession.insert(statement, list.get(i));
    		if((i + 1) % Constants.BATCH_DEAL_NUM == 0) {//Constants.BATCH_DEAL_NUM爲批量提交的條數
    			batchSession.flushStatements();
    		}
    	}
    	batchSession.flushStatements();
    	batchSession.close();
    	return i;
    }
    
    public int batchUpdate(String statement, List<?> list) {
    	batchSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
    	int i = 0;
    	for(int cnt = list.size(); i < cnt; i++) {
    		batchSession.update(statement, list.get(i));
    		if((i + 1) % Constants.BATCH_DEAL_NUM == 0) {
    			batchSession.flushStatements();
    		}
    	}
    	batchSession.flushStatements();
    	batchSession.close();
    	return i;
    }
    
    public int batchDelete(String statement, List<?> list) {
    	batchSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
    	int i = 0;
    	for(int cnt = list.size(); i < cnt; i++) {
    		batchSession.delete(statement, list.get(i));
    		if((i + 1) % Constants.BATCH_DEAL_NUM == 0) {
    			batchSession.flushStatements();
    		}
    	}
    	batchSession.flushStatements();
    	batchSession.close();
    	return i;
    }
}

下面是一個使用的例子,用的是mybatis3.X的版本。
sql

@Service("TestinfoDaoImpl")
public class TestinfoDaoImpl extends BaseDao implements TestinfoDao {

    public void deleteTestinfo(Map<String, Object> index) {
        this.getSqlSession().delete("deleteTestinfo", index);
    }
    // 批量插入
    public void insertBatchTestinfo(List<TestInfo> list) {
    	this.batchInsert("insertTestinfo", list);
    }

    public void insertTestinfo(TestInfo instance) {
        this.getSqlSession().insert("insertTestinfo", instance);
    }

    public List<TestInfo> selectTestinfos(Map<String, Object> index) {
        return this.getSqlSession().selectList("selectTestinfos", index);
    }
    // 查詢條數
    public int selectTestinfosCount(Map<String, Object> index) {
        return this.getSqlSession().selectOne("selectTestinfosCount", index);
    }

    public void updateTestinfo(Map<String, Object> index) {
        this.getSqlSession().update("updateTestinfo", index);
    }

}

插入語句的sql
mybatis

<insert id="insertTestinfo" parameterType="TestInfo">
		INSERT INTO TESTINFO (
			TESTID,
			TESTNM,
			PASSWD,
			ROLEID,
			EMAIL,
			MOBILE,
			REMARK
		) VALUES (
			#{testid},
			#{testnm},
			#{passwd},
			#{roleid},
			#{email},
			#{mobile},
			#{remark}
		)
	</insert>

插入的結果log,從log中能夠看出是批量插入。這裏爲了測試好看,設置了50條提交一次。
oracle

Preparing: INSERT INTO TESTINFO ( TESTID, TESTNM, PASSWD, ROLEID, EMAIL, MOBILE, REMARK ) VALUES ( ?, ?, ?, ?, ?, ?, ? ) 
Parameters: test0(String), test0(String), 123456(String), 1(String), (String), (String), (String)
Parameters: test1(String), test1(String), 123456(String), 1(String), (String), (String), (String)
Parameters: test2(String), test2(String), 123456(String), 1(String), (String), (String), (String)
......省略n行
Parameters: test47(String), test47(String), 123456(String), 1(String), (String), (String), (String)
Parameters: test48(String), test48(String), 123456(String), 1(String), (String), (String), (String)
Parameters: test49(String), test49(String), 123456(String), 1(String), (String), (String), (String)
stmt enter cache
ooo Using Connection [oracle.jdbc.driver.T4CConnection@9209e8]
Preparing: INSERT INTO TESTINFO ( TESTID, TESTNM, PASSWD, ROLEID, EMAIL, MOBILE, REMARK ) VALUES ( ?, ?, ?, ?, ?, ?, ? ) 
Parameters: test50(String), test50(String), 123456(String), 1(String), (String), (String), (String)
Parameters: test51(String), test51(String), 123456(String), 1(String), (String), (String), (String)
Parameters: test52(String), test52(String), 123456(String), 1(String), (String), (String), (String)
......省略n行
Parameters: test97(String), test97(String), 123456(String), 1(String), (String), (String), (String)
Parameters: test98(String), test98(String), 123456(String), 1(String), (String), (String), (String)
Parameters: test99(String), test99(String), 123456(String), 1(String), (String), (String), (String)
相關文章
相關標籤/搜索