本文记录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抽象接口中写通用操做方法,具体实现类继承便可;