日期:2014-05-16  浏览次数:20493 次

Spring数据库访问之iBatis(二)
    接上文,我们继续来研究Spring和iBatis的整合访问数据。下面首先来看看插入操作,数据的插入操作属于更新操作的一种,是比较简单的一种操作,就是将符合数据表字段规范且对应用程序无害的数据插入到数据表中。
    我们分两种方式来进行插入操作,第一种是Bean的方式进行,首先来编写iBatis的插入SQL语句:
	<insert id="insertContact" parameterClass="contact">
		insert into
		contact(NAME,GENDER,MOBILE,ADDRESS)
		values
	(#name:VARCHAR#,#gender:VARCHAR#,#mobile:VARCHAR#,#address:VARCHAR#)
	</insert>

    我们使用<insert>标签表示插入语句,为该语句起个名字,就是id属性中的insertContact,之后声明我们使用的参数类型,也就是我们声明过的Contact。需要注意的是这里的参数设置,#name:VARCHAR#,小写的name是Bean中的字段名称,大小写要完全一致才行,VARCHAR表示的是数据类型,不用多说。在数据表中的这四个字段我们都声明为VARCHAR类型,而插入时不需要设置ID,是因为我们使用MySQL数据库的自增主键了,如果是其它类型的数据库,请使用相应的主键生成策略来为主键赋值。
    编写完SQL语句,我们来写DAO:
package org.ourpioneer.contact.dao;
import java.util.Map;
import org.ourpioneer.contact.bean.Contact;
public interface ContactDAO {
	public Contact getContactById(Map<Object, Object> parameterMap);
	public int insertContact(Contact contact);
}

    我们多加了一个insertContact(Contact contact)方法,返回值类型是int,也就是更新的行数,这都是JDBC规范中的内容,下面来实现这个新加的方法:
package org.ourpioneer.contact.dao.impl;
import java.util.Map;
import org.ourpioneer.contact.bean.Contact;
import org.ourpioneer.contact.common.BaseDAO;
import org.ourpioneer.contact.dao.ContactDAO;
public class ContactDAOImpl extends BaseDAO implements ContactDAO {
	public Contact getContactById(Map<Object, Object> parameterMap) {
		return (Contact) getSqlMapClientTemplate().queryForObject(
				"getContactById", parameterMap);
	}
	public int insertContact(Contact contact) {
		return getSqlMapClientTemplate().update("insertContact", contact);
	}
}

    该方法的实现也非常简单,但是注意这里,我们并没有使用sqlMapClientTemplate的insert方法,而是update方法来进行操作的。原因是insert方法不会返回int类型的结果,而insert也是更新操作的一种,使用update方法也是可以的。下面在Service类中对应添加代码:
	public int insertContact(Contact contact) {
		return getContactDAO().insertContact(contact);
	}

    之后我们开始编写测试类,代码如下:
package org.ourpioneer.contact;
import org.ourpioneer.contact.bean.Contact;
import org.ourpioneer.contact.service.ContactService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
	private static final Logger logger = LoggerFactory.getLogger(App.class);
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"beans.xml");
		ContactService contactService = (ContactService) context
				.getBean("contactService");
		// Contact contact = contactService.getContactById(1);
		Contact contact = new Contact("Tom", "male", "15940990001", "Dalian");
		int recordsOfUpdates = contactService.insertContact(contact);
		logger.info("{}", recordsOfUpdates);
	}
}

    这里需要注意,我们创建Bean时使用了带有参数的构造方法(且不含ID),那么还需要在Contact类中声明出无参数的构造方法,也就是在Contact类中添加如下两个构造方法:
	public Contact() {
		super();
	}
	public Contact(String name, String gender, String mobile, String address) {
		super();
		this.name = name;
		this.gender = gender;
		this.mobile = mobile;
		this.address = address;
	}

    运行测试程序,我们会得到如下输出:

    可以看出update语句的返回值是1,也就是说我们成功地更新了一行数据,打开数据表,我们可以看到这条数据已经成功添加进去了:

    下面来看第二种参数设置方式,就是使用我们之前的ParameterMap方式。使用Bean是ORM特性的体现,而如果在一个事务中,需要向多个表中插入数据,显然使用Bean的方式存在不足,因为中间表可能没有对应的Bean存在,而且构造Bean是消耗系统资源的,特别是在批量操作时,是不建议使用Bean的方式的。那么我们可以使用ParameterMap的方式来统一设置传入参数。
     修改SQL语句:
	<ins