import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.SqlSessionUtils; import org.railway.com.trainplan.entity.QueryResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.util.Assert; /** * 基礎框架的數據訪問層抽象實現類myBatis orm框架, * 所有模塊的數據訪問層實現類均繼承該類。<br> * * JDK版本:JDK1.6 * @version 1.0 */ @Repository public class BaseDao { private static final Logger log = Logger.getLogger(BaseDao.class); @Autowired public SqlSessionTemplate sqlSession; /** * 獲取數據庫連接對象 * @return */ private Connection getConnection(){ Connection connection = SqlSessionUtils.getSqlSession( sqlSession.getSqlSessionFactory(), sqlSession.getExecutorType(), sqlSession.getPersistenceExceptionTranslator()).getConnection(); return connection; } |
//=================================以下代碼為myBatis實現的常用方法(后綴加BySql)===========================//
/**
* 往庫表中插入記錄
* @param statementId 調用myBatis的mapper文件的聲明段名,
* 規則名:mapper的namespace+"." + 該mapper文件某片段的id
* @param value 要操作的對象
* @return 插入成功的記錄數
*/
public int insertBySql(String statementId, Object value) {
return sqlSession.insert(statementId, value);
}
/**
* 刪除庫表中的記錄(可批量刪除),返回刪除成功的記錄數。
*
* @param statementId 調用myBatis的mapper文件的聲明段名,
* 規則名:mapper的namespace+"." + 該mapper文件某片段的id
* @param value 刪除條件值
* @return 刪除成功的記錄數
*/
public int deleteBySql(String statementId, Object value) {
return sqlSession.delete(statementId, value);
}
/**
* 更新庫表中的記錄(可批量更新),返回更新成功的記錄數。
*
* @param statementId 調用myBatis的mapper文件的聲明段名,
* 規則名:mapper的namespace+"." + 該mapper文件某片段的id
* @param value 更新條件值值
* @return 更新成功的記錄數
*/
public int updateBySql(String statementId, Object value) {
return sqlSession.update(statementId, value);
}
/**
* 查詢符合條件的記錄,生成List返回。
*
* @param statementId 調用myBatis的mapper文件的聲明段名,
* 規則名:mapper的namespace+"." + 該mapper文件某片段的id
* @param value 查詢條件值
* @return list 找到的記錄
*/
public List selectListBySql(String statementId, Object value) {
List list = sqlSession.selectList(statementId, value);
//數據庫含有空格的字段值(char類型),裝載到myBatis生成的持久對象屬性中,是否自動去掉屬性值左右兩邊的空格
//如果需要去掉空格,則使用如下方式
//list = Config.getPropertyBool("po.propertyvalue.trimable", true) ? BeanUtil.trim(list) : list
return list;
}
/**
* 查詢單個符合條件的記錄,生成Object返回</br>
* @param statementId 調用myBatis的mapper文件的聲明段名,
* 規則名:mapper的namespace+"." + 該mapper文件某片段的id
* @param parameter 查詢條件值
* @return list 找到的記錄
*/
public Object selectOneBySql(String statementId, Object parameter) {
Object bean = sqlSession.selectOne(statementId, parameter);
//數據庫含有空格的字段值(char類型),裝載到myBatis生成的持久對象屬性中,是否自動去掉屬性值左右兩邊的空格
//如果需要去掉空格,則使用如下方式
//bean = Config.getPropertyBool("po.propertyvalue.trimable", true) ? BeanUtil.trim(bean) : bean
return bean;
}
/**
* myBatis分頁查詢符合條件的記錄
* <p>
* 注意:調用該方法,必須在myBatis的mapper文件中存在statementId_COUNT片段</br>
* <b>特別說明:由于該命令采用的分頁技術不是數據庫本身的分頁技術,而是采用ResultSet的absolute定位技術,<br>
* 需要把查詢結果全部裝入ResultSet再定位。如果查詢結果較大(1萬條記錄以上),效率會很低。<br>
* 建議使用Hibernate的query方法或在mapper的XML中使用數據庫內部分頁技術<br>
* (即把pageId,pageSize作為參數傳入SQL語句的類似limit n,m中)來查詢。
* </b>
* </p>
* @param statementId 調用myBatis的mapper文件的聲明段名,規則名:mapper的namespace+"." + 該sqlMap文件某片段的id
* @param parameter 查詢條件對象
* @param offset 返回查詢結果的起始行,從0開始
* @param pageSize 返回查詢結果的最大行數
* @throws com.fbd.crm.exception.BaseUncheckedException
* @return com.fbd.crm.common.QueryResult
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public QueryResult selectListForPagingBySql(String statementId, Object parameter) throws Exception{
Assert.hasText(statementId, "傳入的SQL配置ID不能為空.");
//計算總頁數
Integer count = null;
try {
count = (Integer)sqlSession.selectOne(statementId + "_COUNT", parameter);
} catch (Exception e) {
String msg = "配置文件中不存在COUNT語句或發生其它例外,無法執行總數統計. SqlMap id:" + statementId;
log.error(msg, e);
throw new Exception(e);
}
if ((count == null) || (count.intValue() <= 0)) {
log.info("執行COUNT后,返回的結果數為0,表示該SQL執行無結果數據返回.因此提前終止其數據查詢并立即返回空集.");
return new QueryResult(new ArrayList(), 0);
}
List resultList = sqlSession.selectList(statementId, parameter);
QueryResult result = new QueryResult(resultList, count);
return result;
}
/**
* myBatis帶匯總查詢
* </b>
* </p>
* @param statementId 調用myBatis的mapper文件的聲明段名,規則名:mapper的namespace+"." + 該sqlMap文件某片段的id
* @param parameter 查詢條件對象
* @throws com.fbd.crm.exception.BaseUncheckedException
* @return com.fbd.crm.common.QueryResult
*/
public QueryResult selectListWithTotal(String statementId, Object parameter) throws Exception{
Assert.hasText(statementId, "傳入的SQL配置ID不能為空.");
//計算總頁數
Integer count = null;
try {
count = (Integer)sqlSession.selectOne(statementId + "_COUNT", parameter);
} catch (Exception e) {
String msg = "配置文件中不存在COUNT語句或發生其它例外,無法執行總數統計. SqlMap id:" + statementId;
log.error(msg, e);
throw new Exception(e);
}
if ((count == null) || (count.intValue() <= 0)) {
log.info("執行COUNT后,返回的結果數為0,表示該SQL執行無結果數據返回.因此提前終止其數據查詢并立即返回空集.");
return new QueryResult(new ArrayList(),new ArrayList(), 0);
}
List resultList = sqlSession.selectList(statementId, parameter);
List totalList = sqlSession.selectList(statementId + "_TOTAL", parameter);
QueryResult result = new QueryResult(resultList, totalList, count);
return result;
}
/**
* 執行sql
* @category 該事務不在spring事務管理機制內
* @param sql
* @return List
* @throws SQLException
*/
public List executeQueryBySql(String sql) throws SQLException{
Connection con = null;
Statement stmt = null;
List list = new ArrayList();
try {
con = this.getConnection();//sqlSession.getConnection();
con.setAutoCommit(false);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rSet = stmt.executeQuery(sql);
ResultSetMetaData md = rSet.getMetaData();
int num = md.getColumnCount();
while (rSet.next()) {
Map mapOfColValues = new HashMap(num);
for (int i = 1; i <= num; i++) {
mapOfColValues.put(md.getColumnName(i), rSet.getObject(i));
}
list.add(mapOfColValues);
}
con.commit();
} catch (Exception e) {
e.printStackTrace();
throw new SQLException("sql執行失敗");
}finally {
if (stmt != null) {
stmt.close();
}
// 此處不關閉,連接關閉由org.springframework.jdbc.datasource.DataSourceTransactionManager自動完成
if (con != null) {
con.close();
}
}
return list;
}
}
采用的myBatis版本和Maven配置:
<!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.7</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> |
3.怎么調用
在service中將上面的BaseDao類注入就可以調用了它的方法了。比如:
@Autowired private BaseDao baseDao; |