ml这2个xml文件。
看到这儿,有人会问了:为什么不把这两个xml文件也建立在spring目录下?
原因很简单:
在datasource.xml文件内我们已经通过
<bean id="iBatisSessionFactory" class="org.sky.ssi.ibatis.IBatis3SQLSessionFactoryBean" scope="singleton">
<property name="configLocation" value="sqlmap.xml"></property>
<property name="dataSource" ref="dataSource"></property>
</bean>
这样的方式把iBatis委托给了spring,iBatis的核心就是这个sqlmap.xml文件了,而在这个sqlmap.xml文件已经引用了login.xml与index.xml文件了。
而我们的web.xml文件里有这么一句:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/**/*.xml</param-value>
</context-param>
因此如果我们再把ibatis/index.xml与ibatis/login.xml再建立到src/main/resources/spring目录下,spring于是会在容器启动时试图加载这两个xml文件,然后一看这两个xml文件不是什么spring的bean,直接抛错,对吧?
其们等一会再来看login.xml文件与index.xml文件,我们先来搞懂iBatis调用原理.
3.4 iBatis调用原理
1)iBatis就是一个dao层,它又被称为sqlmapping,它的sql是书写在一个.xml文件内的,在该xml文件内会将相关的sql绑定到相关的dao类的方法。
2)在调用结束时我们需要在finally块中关闭相关的sql调用。
我们来看一个例子。
login.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="org.sky.ssi.dao.LoginDAO">
<select id="validLogin" resultType="int" parameterType="java.util.Map">
<![CDATA[
SELECT count(1) from t_login where login_id= #{loginId} and login_pwd=#{loginPwd}
]]>
</select>
</mapper>
该DAO指向了一个接口org.sky.ssi.dao.LoginDAO,该dao接受一个sql,并且接受一个Map类型的参数。
那么我们来看该DAO
LoginDao.java
package org.sky.ssi.dao;
import java.util.Map;
public interface LoginDAO {
public int validLogin(Map<String, Object> paraMap) throws Exception;
}
LoginImpl.java
package org.sky.ssi.dao.impl;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.sky.ssi.dao.LoginDAO;
import org.sky.ssi.ibatis.IBatisDAOSupport;
import org.springframework.stereotype.Repository;
@Repository
public class LoginDAOImpl extends IBatisDAOSupport<LoginDAO> implements LoginDAO {
public int validLogin(Map<String, Object> paraMap) throws Exception {
SqlSession session = this.getSqlSession();
try {
return this.getMapper(LoginDAO.class, session).validLogin(paraMap);
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new Exception(e);
} finally {
this.closeSqlSession(session);
}
}
}
很简单吧,一切逻辑都在xml文件内。
一定记得不要忘了在finally块中关闭相关的sql调用啊,要不然将来工程出了OOM的错误不要怪我啊.
3.5 index模块
Index.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="org.sky.ssi.dao.StudentDAO">
<select id="getAllStudent" resultType="org.sky.ssi.dbo.StudentDBO">