`
sarin
  • 浏览: 1757829 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173773
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368228
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189366
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99924
社区版块
存档分类
最新评论

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语句:
	<insert id="insertContact" parameterClass="parameterMap">
		insert into
		contact(NAME,GENDER,MOBILE,ADDRESS)
		values
	(#NAME:VARCHAR#,#GENDER:VARCHAR#,#MOBILE:VARCHAR#,#ADDRESS:VARCHAR#)
	</insert>

    之后在DAO中重载一个insertContact方法:
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);
	public int insertContact(Map<Object, Object> parameterMap);
}

    然后编写实现代码:
public int insertContact(Map<Object, Object> parameterMap) {
		return getSqlMapClientTemplate().update("insertContact", parameterMap);
	}

    和之前的完全类似,只是参数不同,就是重载了一个方法而已。下面是Service方法:
	public int insertContact(String name, String gender, String mobile,
			String address) {
		Map<Object, Object> parameterMap = new ParameterMap("NAME", name,
				"GENDER", gender, "MOBILE", mobile, "ADDRESS", address);
		return getContactDAO().insertContact(parameterMap);
	}

    这里我们将传入的四个参数重新构造成一个ParameterMap类型的变量,为什么要在Service中完成这步操作,就是出于事务捆绑的操作。在Service层我们将操作视为一个具体的业务,那么它可能向下要调用多个DAO来向不同数据表进行操作,那么在这层构造数据调用各自的DAO完成SQL操作是最合理的,所以我们将数据的构造操作放在了Service层来进行,之后重新改写测试代码:
package org.ourpioneer.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("Tom", "male","15940990001", "Dalian");
		logger.info("{}", recordsOfUpdates);
	}
}

    我们仍然得到了更新一行数据的结果,可以看到数据库中就又多了一条数据。
     下面是数据更新操作,也就是SQL的update操作,还是先来编写SQL语句:
	<update id="updateContactById" parameterClass="contact">
		update contact 
		set NAME=#name:VARCHAR#,GENDER=#gender:VARCHAR#,MOBILE=#mobile:VARCHAR#,ADDRESS=#address:VARCHAR#
		where ID=#id:LONG#
	</update>

    可以看出,这里也是使用Bean的方式来进行更新,那么DAO代码如下:
	public int updateContactById(Contact contact) {
		return getSqlMapClientTemplate().update("updateContactById", contact);
	}

    然后是Service代码:
	public int updateContact(Contact contact) {
		return getContactDAO().updateContactById(contact);
	}

    而测试时,我们是先将一条记录给查出来,之后更改几个属性,再给更新数据,那么测试代码为:
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(2);
		System.out.println(contact);
		contact.setMobile("15900000001");
		contact.setAddress("Beijing");
		int recordsOfUpdates = contactService.updateContact(contact);
		logger.info("{}", recordsOfUpdates);
	}

    运行测试代码,我们得到如下结果:

    之后查看数据库,发现ID为2的记录已经更改了:

    和插入操作一样,我们还可以使用ParameterMap的方式来实现更新,应用场景也是和前面类似的。这里就不再给出演示了,直接看最后一个操作,就是删除操作。删除应该是最简单的一种操作了,我们编写一个SQL:
	<delete id="deleteContactById" parameterClass="parameterMap">
		delete from contact where ID=#ID:LONG#
	</delete>

    我们使用的是parameterMap作为传入的参数类型,那么DAO代码如下:
	public int deleteContactById(Map<Object, Object> parameterMap) {
		return getSqlMapClientTemplate().update("deleteContactById", parameterMap);
	}

    在Service中,我们构造出parameerMap对象:
	public int deleteContactById(long id) {
		Map<Object, Object> parameterMap = new ParameterMap("ID", id);
		return getContactDAO().deleteContactById(parameterMap);
	}

下面是测试代码,我们直接指定要删除的记录ID即可:
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");
		int recordsOfUpdates = contactService.deleteContactById(3);
		logger.info("{}", recordsOfUpdates);
	}
}

    运行测试代码,我们可以看到成功更新了一条记录,也就是将第三条记录删除,那么再看看数据库,也就只有两条记录了。
    本部分内容也就全部介绍完了。
  • 大小: 87.5 KB
  • 大小: 54.4 KB
  • 大小: 117.4 KB
  • 大小: 63.7 KB
5
0
分享到:
评论

相关推荐

    Spring数据库访问之iBatis

    为了丰富博客专栏【Spring数据库访问系列】的内容,完善Spring数据库访问的体系,现在我们介绍Spring对iBatis的支持。相对于Hibernate等ORM框架的全自动SQL,那么iBatis则属于半自动化的ORM框架,我们需要编写SQL...

    访问数据库基本封装(spring/hibernate/ibatis)

    总结一下,Spring、Hibernate和iBatis都是Java开发中用于数据库访问的重要工具。Spring提供了一个全面的框架,包括对各种数据库访问方式的支持;Hibernate通过ORM简化了数据库操作;而iBatis则以灵活的SQL映射和高...

    Spring+Struts+ibatis讲解

    在Spring+Struts+ibatis这种经典的Java Web开发框架组合中,主要涉及到三层架构:表现层(Action)、业务逻辑层(Service)和数据访问层(DAO)。这些组件协同工作,实现了应用程序的功能。以下是对各部分的详细解释...

    spring+struts+ibatis

    在SSM架构中,iBatis作为数据访问层,负责与数据库交互,执行SQL查询,将结果映射为Java对象。 4. ExtJS:ExtJS是一个JavaScript库,用于构建富客户端的Web应用。它提供了丰富的组件和数据绑定功能,可以创建复杂的...

    spring与hibernate以及ibatis集成的实例和具体配置图解

    "TestSpringJDBC"可能是Spring对JDBC的测试代码,展示了如何在Spring中使用JDBC进行数据库操作,这在理解Spring与Hibernate或Ibatis集成时是基础。"TestSpringIbatis"则可能是Spring与Ibatis集成的测试案例,展示了...

    Spring_Struts_Ibatis_Mysql Demo

    在Spring_Struts_Ibatis_Mysql Demo中,iBatis作为数据访问层,用于执行SQL查询和更新,与MySQL数据库交互。 **MySQL**是广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于使用而著称。在这个项目中,...

    spring+velocity+ibatis

    当用户请求到达时,Spring MVC控制器会调用业务服务层的方法,这些方法进一步通过iBATIS的SqlSession查询或更新数据库,然后将返回的数据传递给Velocity模板,由Velocity负责生成HTML响应给客户端。 文件名 ...

    struts1+spring+hibernate+ibatis集成

    Spring还提供了数据访问抽象,包括JDBC模板和ORM支持,使得与数据库交互变得更加简单。在本集成中,Spring作为“胶水”将其他框架紧密连接起来。 Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用...

    开发指南(spring,hibernate,ibatis,webwork)

    这四者在实际项目中经常结合使用,Spring可以整合Hibernate和iBatis作为数据访问层,而WebWork(或Struts2)则可以与Spring结合,形成强大的Web应用架构。`Manning@2007 - Spring in Action(2nd Edition).pdf`和`...

    ibatis基本操作数据库

    iBatis,全称为MyBatis iBatis,是一个基于Java的持久层框架,它简化了数据库与应用程序之间的交互,避免了直接编写大量的...了解并熟练掌握iBatis的基本操作和特性,对于提升Java项目的数据库访问能力具有重要意义。

    spring、struts、ibatis框架搭建流程

    #### 二、向项目中加入Spring、Struts、iBatis框架 在完成框架下载后,接下来需要将这些框架集成到Web项目中。 ##### 2.1 准备工作 - **框架解压**:将下载好的框架分别解压缩至合适的位置。 - **创建Web项目**:...

    spring3.2与Ibatis整合

    Spring 3.2 与 iBatis 的整合是Java企业级开发中常见的一种技术组合,它结合了Spring的依赖注入和事务管理能力以及iBatis的SQL映射框架的灵活性。这种整合允许开发者将业务逻辑与数据访问层解耦,提高了代码的可维护...

    Spring-Struts-IBatis-AOP-Transaction

    在 SSI 集成中,IBatis 作为数据库操作的桥梁,通过 XML 或注解配置 SQL 语句,实现与数据库的交互。 **AOP(面向切面编程)** 面向切面编程是一种编程范式,它允许开发者将关注点分离,如日志、事务管理等,从...

    spring + struts + ibatis

    而iBatis作为数据访问层,负责执行SQL,与数据库进行交互。这三个框架协同工作,构建出高效、灵活且易于维护的Web应用。 为了使用这个架构,开发者需要对每个框架有深入的理解,并掌握它们之间的集成方式。例如,...

    Spring+Webwork+iBatis 组合实例

    #### 二、Spring框架简介 Spring框架是一个开源的轻量级Java开发框架,它为Java应用程序提供了一个全面的编程和配置模型。Spring的核心特性包括依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...

    Spring struts ibatis Mysql 集成

    iBatis与Spring整合后,可以作为数据访问层,处理与数据库的交互。它提供动态SQL支持,可以灵活地调整查询,避免了传统的DAO层的大量重复代码。 **MySQL数据库**: MySQL 5.1是流行的开源关系型数据库管理系统,...

    spring+struts+ibatis框架搭建

    在Spring+Struts+Ibatis的组合中,Ibatis作为数据访问层,处理与数据库的交互,Spring通过 DataSourceTransactionManager 进行事务管理,确保数据的一致性。 在搭建这个框架的过程中,首先需要配置Spring的...

    Spring对IBatis的整合

    Spring框架与IBatis(现称为MyBatis)的整合为开发者提供了一种更简洁、更强大的数据库访问方式。Spring通过其内置的支持机制极大地简化了原有的IBatis访问代码,并且提供了与JdbcTemplate一致的异常处理方式。这种...

Global site tag (gtag.js) - Google Analytics