SqlMapClientTemplate是SqlMapClient的封装类。
SqlMapClient是ibatis的。但SpringFramework,也很好的将其进行了集成,我们要做的就是继承SpringFramework中提供的SqlMapClientDaoSupport类即可。
在springFramework的org.springframework.orm.ibatis组件中。
SqlMapClient中包含着session的管理.
SqlMapClientTemplate用于session的封装,以及异常的捕捉.
所以按照以上的推断来说.应该尽量使用SqlMapClientTemplate.
保证session以及Exception的正常以及统一.(以上不懂,看下面才是正解)
1.使用SqlMapClientTemplate时除了基本的spring和springmvc包以外另外还得加两个包(maven添加) pom.xml:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis</artifactId> <version>2.3.2.715</version> </dependency>2.SqlMapClientFactoryBean 的装配 applicationContext.xml:
SqlMapClientFactoryBean是SqlMapClientTemplate使用的基础,如果在SpringFramework应用中没有装配SqlMapClientFactoryBean,那么SqlMapClientTemplate将不可用,报空指针错误。
<!-- Spring iBatis SqlMapClient 需要spring-orm组件 --> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocations"> <list merge="true"> <value>classpath:SqlMapConfig.xml</value> </list> </property> </bean>3.继承使用SqlMapClientDaoSupport类(有多种方法,只用其一) java类:
第一步:做一个基础类
package org.demo.dao; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; public class BaseDAO extends SqlMapClientDaoSupport{ }第二步:DAO接口
package org.demo.dao; import org.demo.model.EmpModel; /** * <一句话功能简述><p> * <类功能详细描述> * @see [相关类/方法] * @since [产品/模块版本] */ public interface EmpDAO { /** * 根据id查找员工<p> * <方法功能详细描述> * @param id * @return */ EmpModel findById(int id); }第三步:DAO的实现,使用SqlMapClientTemplate查询
package org.demo.dao.impl; import org.demo.dao.BaseDAO; import org.demo.dao.EmpDAO; import org.demo.model.EmpModel; public class EmpDAOImpl extends BaseDAO implements EmpDAO{ /** * @see org.demo.dao.EmpDAO#findById(int) */ @Override public EmpModel findById(int id) { <span style="white-space:pre"> </span>//"EMP"为iBatis SqlMap文件的命名空间; <span style="white-space:pre"> </span>//"findById"为iBatis SqlMap的查询方法; <span style="white-space:pre"> </span>//"id"为查询条件 return (EmpModel) getSqlMapClientTemplate().queryForObject("EMP.findById",id); } }
4.映射文件 EMP.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" > <sqlMap namespace="EMP"> <typeAlias alias="empModel" type="org.demo.model.EmpModel" /> <resultMap class="empModel" id="empResultMap"> <result property="name" column="NAME"/> <result property="age" column="AGE"/> <result property="gender" column="GENDER"/> <result property="password" column="PASSWORD"/> </resultMap> <select id="findById" parameterClass="int" resultMap="empResultMap"> select * from emp; </select> </sqlMap>5.配置SqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" useStatementNamespaces="true" /> <sqlMap resource="org/demo/mapper/EMP.xml" /> <!-- <sqlMap resource="org/demo/mapper/其它.xml" /> --> </sqlMapConfig>6.指定接口 Spring-beans.xml (也可直接将bean放入applicationContext.xml中)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="baseDAO" class="org.demo.dao.BaseDAO"> <property name="sqlMapClient" ref="sqlMapClient" /> </bean> <bean id="empDAO" class="org.demo.dao.impl.EmpDAOImpl" parent="baseDAO"> </bean> </beans>7.javaBean:
package org.demo.model; public class EmpModel { private String name; private int age; private String gender; private String password; //get\set\toString... }8.mysql.sql
DROP TABLE IF EXISTS EMP; CREATE TABLE EMP ( ID int(16) NOT NULL AUTO_INCREMENT , NAME varchar(30) NULL , AGE int(4) NULL , GENDER varchar(4) NULL DEFAULT 'F' , PASSWORD varchar(30) NULL , PRIMARY KEY (ID) );9.测试:
import org.apache.log4j.Logger; import org.demo.dao.EmpDAO; import org.demo.model.EmpModel; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.mchange.v2.c3p0.ComboPooledDataSource; public class TestA { private static final Logger logger = Logger.getLogger(TestA.class); ApplicationContext ac; @Before public void init() { ac = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void testEmpDAO(){ EmpDAO empDAO = ac.getBean("empDAO",EmpDAO.class); EmpModel emp = empDAO.findById(1); logger.info("emp:"+emp); } }
//查询 返回一个对象 Object resultObj = getSqlMapClientTemplate().queryForObject("命名空间.方法名", 参数...); //查询 返回List集合 List result = getSqlMapClientTemplate().queryForList("命名空间.方法名", 参数...); //查询 返回Map集合 Map result = getSqlMapClientTemplate().queryForMap("命名空间.方法名", 参数...); //插入 getSqlMapClientTemplate().insert("命名空间.方法名", 参数...); //更新 getSqlMapClientTemplate().update("命名空间.方法名", 参数...); //删除 getSqlMapClientTemplate().delete("命名空间.方法名", 参数...);