本文記錄Ibatis使用配置過程,不與spring結合的場景,快速實現與數據庫的鏈接訪問。java
準備工做:node
MySql數據庫mysql
Maven依賴 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.23</version> </dependency> <dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis-core</artifactId> <version>3.0</version> </dependency> <dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis-sqlmap</artifactId> <version>2.3.4.726</version> </dependency>
實例:spring
全局配置文件IbatisSqlMapConfig.xmlsql
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <!-- 引用JDBC屬性的配置文件 --> <properties resource ="jdbc.properties" /> <!--是否啓用緩存機制--> <!-- 是否啓用延遲加載機制 --> <!-- 是否啓用字節碼加強機制 --> <!-- 是否啓用錯誤處理機制 --> <!-- 最大併發請求數 --> <!-- 最大Session數 --> <!-- 最大併發事務數 --> <!-- 是否啓用名稱空間 --> <settings cacheModelsEnabled ="true" lazyLoadingEnabled="true" enhancementEnabled="true" errorTracingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="true"/> <!-- 使用JDBC的事務管理 --> <transactionManager type = "JDBC"> <!-- 定義了ibatis的事務管理器有3中(JDBC,JTA,EXTERNAL) --> <!-- 數據源 --> <dataSource type = "SIMPLE"> <!-- type屬性指定了數據源的連接類型,也有3種類型(SIMPLE,DBCP,JNDI) --> <property name = "JDBC.Driver" value="${driver}" /> <property name = "JDBC.ConnectionURL" value="${url}" /> <property name = "JDBC.Username" value="${username}" /> <property name = "JDBC.Password" value="${password}" /> <property name ="Pool.MaximumActiveConnections" value ="10"/> <!-- 鏈接池維持的最大容量 --> <property name ="Pool.MaximumIdleConnections" value ="5"/> <!-- 鏈接池容許掛起的最大鏈接 --> <property name ="Pool.MaximumCheckoutTime" value ="120000"/> <!-- 鏈接被某個任務所容許佔用的最大時間 --> <property name ="TimeToWait" value ="500" /> <!-- 線程容許等待的最大時間 --> </dataSource> </transactionManager> <!-- 這裏能夠寫多個實體的映射文件 --> <sqlMap resource = "sqlmap/ProcessNodeDao.xml" /> </sqlMapConfig>
2.Dao配置文件:數據庫
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="com.jd.jcc.process.dao.ProcessNodeDao"> <select id="queryNodesByProId" parameterClass="com.jd.jcc.process.nodedefine.BaseProNode" resultClass="com.jd.jcc.process.nodedefine.BaseProNode"> select n.id as nodeId,n.node_alias as nodeName ,n.node_key as nodeKey,n.parent_key as parentKey ,n.process_id as processId,n.node_status as nodeStatus ,d.node_type as nodeType from p_process_node n,p_node_declare d where n.process_id=#processId# and d.id = n.ref_node_declare_id </select> </sqlMap>
3.Dao接口定義:apache
public interface ProcessNodeDao { /** * @Description: TODO(這裏用一句話描述這個方法的做用) * @Date 2016年4月1日 上午9:58:59 * @param processId * @return * @throws */ List<BaseProNode> queryNodesByProId(String processId); }
public abstract class AbstractBaseDao { private static SqlMapClient sqlMapClient; static { try { Reader reader = Resources.getResourceAsReader("IbatisSqlMapConfig.xml");//加載配置文件,使用全局靜態變量共享便可 sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader); reader.close(); } catch (IOException e) { e.printStackTrace(); } } public abstract String getNameSpace(); /** * @return the sqlMapClient */ public static SqlMapClient getSqlMapClient() { return sqlMapClient; } }
public class ProcessNodeDaoImpl extends AbstractBaseDao implements ProcessNodeDao { private Logger log = LoggerFactory.getLogger(getClass()); public List<BaseProNode> queryNodesByProId(String processId){ BaseProNode pm = new BaseProNode(); pm.setProcessId(processId); try { // getSqlMapClient().startTransaction(); //如須要,可手動開啓事務 List<BaseProNode> queryForList = getSqlMapClient().queryForList(getNameSpace()+"queryNodesByProId", pm); // getSqlMapClient().commitTransaction();//提交事務 return queryForList; } catch (SQLException e) { log.error("數據庫查詢失敗",e); } return null; } }
4.項目結構:
緩存
寫在最後:併發
1.通常使用Dao接口全類路徑做爲配置文件的namespaces值ui
2.通常在業務層手動控制事務;
3.通常Dao抽象接口中寫通用操做方法,具體實現類繼承便可;