- 浏览: 1756955 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173665
-
Android学习笔记
浏览量:368133
-
iBatis开发详解
浏览量:189266
-
Objective-C学习...
浏览量:99838
最新评论
-
iLidy:
引用[/c
Hibernate持久化对象的生命周期详解 -
fengzigogo:
您好,有这个项目架构的源码下载地址吗?
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
用Maven构建Java Web开发环境(Jetty容器)之二 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring 3之MVC & Security简单整合开发(二) -
赵庆辉:
看帖回复是美德,楼主讲的很清晰明了,看了豁然开朗.
Java String对象的经典问题(new String())
接上文,我们继续来研究Spring和iBatis的整合访问数据。下面首先来看看插入操作,数据的插入操作属于更新操作的一种,是比较简单的一种操作,就是将符合数据表字段规范且对应用程序无害的数据插入到数据表中。
我们分两种方式来进行插入操作,第一种是Bean的方式进行,首先来编写iBatis的插入SQL语句:
我们使用<insert>标签表示插入语句,为该语句起个名字,就是id属性中的insertContact,之后声明我们使用的参数类型,也就是我们声明过的Contact。需要注意的是这里的参数设置,#name:VARCHAR#,小写的name是Bean中的字段名称,大小写要完全一致才行,VARCHAR表示的是数据类型,不用多说。在数据表中的这四个字段我们都声明为VARCHAR类型,而插入时不需要设置ID,是因为我们使用MySQL数据库的自增主键了,如果是其它类型的数据库,请使用相应的主键生成策略来为主键赋值。
编写完SQL语句,我们来写DAO:
我们多加了一个insertContact(Contact contact)方法,返回值类型是int,也就是更新的行数,这都是JDBC规范中的内容,下面来实现这个新加的方法:
该方法的实现也非常简单,但是注意这里,我们并没有使用sqlMapClientTemplate的insert方法,而是update方法来进行操作的。原因是insert方法不会返回int类型的结果,而insert也是更新操作的一种,使用update方法也是可以的。下面在Service类中对应添加代码:
之后我们开始编写测试类,代码如下:
这里需要注意,我们创建Bean时使用了带有参数的构造方法(且不含ID),那么还需要在Contact类中声明出无参数的构造方法,也就是在Contact类中添加如下两个构造方法:
运行测试程序,我们会得到如下输出:
可以看出update语句的返回值是1,也就是说我们成功地更新了一行数据,打开数据表,我们可以看到这条数据已经成功添加进去了:
下面来看第二种参数设置方式,就是使用我们之前的ParameterMap方式。使用Bean是ORM特性的体现,而如果在一个事务中,需要向多个表中插入数据,显然使用Bean的方式存在不足,因为中间表可能没有对应的Bean存在,而且构造Bean是消耗系统资源的,特别是在批量操作时,是不建议使用Bean的方式的。那么我们可以使用ParameterMap的方式来统一设置传入参数。
修改SQL语句:
之后在DAO中重载一个insertContact方法:
然后编写实现代码:
和之前的完全类似,只是参数不同,就是重载了一个方法而已。下面是Service方法:
这里我们将传入的四个参数重新构造成一个ParameterMap类型的变量,为什么要在Service中完成这步操作,就是出于事务捆绑的操作。在Service层我们将操作视为一个具体的业务,那么它可能向下要调用多个DAO来向不同数据表进行操作,那么在这层构造数据调用各自的DAO完成SQL操作是最合理的,所以我们将数据的构造操作放在了Service层来进行,之后重新改写测试代码:
我们仍然得到了更新一行数据的结果,可以看到数据库中就又多了一条数据。
下面是数据更新操作,也就是SQL的update操作,还是先来编写SQL语句:
可以看出,这里也是使用Bean的方式来进行更新,那么DAO代码如下:
然后是Service代码:
而测试时,我们是先将一条记录给查出来,之后更改几个属性,再给更新数据,那么测试代码为:
运行测试代码,我们得到如下结果:
之后查看数据库,发现ID为2的记录已经更改了:
和插入操作一样,我们还可以使用ParameterMap的方式来实现更新,应用场景也是和前面类似的。这里就不再给出演示了,直接看最后一个操作,就是删除操作。删除应该是最简单的一种操作了,我们编写一个SQL:
我们使用的是parameterMap作为传入的参数类型,那么DAO代码如下:
在Service中,我们构造出parameerMap对象:
下面是测试代码,我们直接指定要删除的记录ID即可:
运行测试代码,我们可以看到成功更新了一条记录,也就是将第三条记录删除,那么再看看数据库,也就只有两条记录了。
本部分内容也就全部介绍完了。
我们分两种方式来进行插入操作,第一种是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); } }
运行测试代码,我们可以看到成功更新了一条记录,也就是将第三条记录删除,那么再看看数据库,也就只有两条记录了。
本部分内容也就全部介绍完了。
发表评论
-
iBatis操作DDL和映射继承
2012-09-09 21:46 9266本文系iBatis开发详解系列文章之iBatis操作D ... -
iBatis查询复杂集合
2012-09-04 20:23 15749本文系iBatis开发详解系列文章之在iBatis查询 ... -
iBatis中使用XML
2012-08-29 19:57 7699本文系iBatis开发详解系列文章之在iBatis中使 ... -
iBatis执行非查询语句(CRUD,函数和过程)
2012-08-26 21:40 9324CRUD操作中除了查询操作,其他都统一称为更新操作,因 ... -
Spring数据库访问之iBatis(一)
2012-01-02 18:45 15988为了丰富博客专栏【Spring数据库访问系列】的内容, ... -
HTML5/CSS3翻转动画(二)
2011-12-31 11:28 9585上一篇我们制作了两行文字的翻转效果,他们是同步进行的, ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7749经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
iBatis分页(基于Struts2和Freemarker)
2011-05-02 10:05 13110之前介绍过基于Hibernate分页的原理和设计,这里 ... -
Spring数据库访问之ORM(三)
2011-03-02 20:35 17618本文接上一篇继续研究。 之前我们使用的是Hib ... -
Spring数据库访问之ORM(二)
2011-02-16 13:19 23383本文接上一篇继续来研究Spring的ORM模块。 ... -
Spring数据库访问之ORM(一)
2011-01-27 10:54 30806Spring数据库访问中另外一大模块就是ORM,ORM ... -
Spring数据库访问之异常处理
2011-01-19 10:29 27509使用JDBC API时,很 ... -
Spring数据库访问(HSQL)(四)
2011-01-16 21:49 14564本文接上一篇继续研究Spring的JDBC模板。 ... -
Spring数据库访问(HSQL)(三)
2011-01-13 10:07 13439本文接上一篇继续研究JDBC模板。 之前说的都 ... -
Spring数据库访问(HSQL)(二)
2011-01-11 11:27 10730上一篇我们介绍了 ... -
Spring数据库访问(HSQL)(一)
2011-01-09 23:34 13835本部分主要介绍Spring的JDBC模板,JDBC模板 ... -
Spring 3之MVC & Security简单整合开发(三)
2010-12-03 19:04 22065本文接上一篇继续深入研究Security框架。 ... -
Spring 3之MVC & Security简单整合开发(二)
2010-12-01 20:29 60085本文接上一篇继续 ... -
Spring 3之MVC & Security简单整合开发(一)
2010-11-30 22:00 42623Spring的MVC模块是一种简洁的Web应用框架,实 ... -
用dTree组件生成无限级导航树
2010-08-14 09:50 7070在做管理系统时不可避免要用到导航树,这种东西只要一次做 ...
相关推荐
为了丰富博客专栏【Spring数据库访问系列】的内容,完善Spring数据库访问的体系,现在我们介绍Spring对iBatis的支持。相对于Hibernate等ORM框架的全自动SQL,那么iBatis则属于半自动化的ORM框架,我们需要编写SQL...
总结一下,Spring、Hibernate和iBatis都是Java开发中用于数据库访问的重要工具。Spring提供了一个全面的框架,包括对各种数据库访问方式的支持;Hibernate通过ORM简化了数据库操作;而iBatis则以灵活的SQL映射和高...
在Spring+Struts+ibatis这种经典的Java Web开发框架组合中,主要涉及到三层架构:表现层(Action)、业务逻辑层(Service)和数据访问层(DAO)。这些组件协同工作,实现了应用程序的功能。以下是对各部分的详细解释...
在SSM架构中,iBatis作为数据访问层,负责与数据库交互,执行SQL查询,将结果映射为Java对象。 4. ExtJS:ExtJS是一个JavaScript库,用于构建富客户端的Web应用。它提供了丰富的组件和数据绑定功能,可以创建复杂的...
"TestSpringJDBC"可能是Spring对JDBC的测试代码,展示了如何在Spring中使用JDBC进行数据库操作,这在理解Spring与Hibernate或Ibatis集成时是基础。"TestSpringIbatis"则可能是Spring与Ibatis集成的测试案例,展示了...
在Spring_Struts_Ibatis_Mysql Demo中,iBatis作为数据访问层,用于执行SQL查询和更新,与MySQL数据库交互。 **MySQL**是广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于使用而著称。在这个项目中,...
当用户请求到达时,Spring MVC控制器会调用业务服务层的方法,这些方法进一步通过iBATIS的SqlSession查询或更新数据库,然后将返回的数据传递给Velocity模板,由Velocity负责生成HTML响应给客户端。 文件名 ...
Spring还提供了数据访问抽象,包括JDBC模板和ORM支持,使得与数据库交互变得更加简单。在本集成中,Spring作为“胶水”将其他框架紧密连接起来。 Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用...
这四者在实际项目中经常结合使用,Spring可以整合Hibernate和iBatis作为数据访问层,而WebWork(或Struts2)则可以与Spring结合,形成强大的Web应用架构。`Manning@2007 - Spring in Action(2nd Edition).pdf`和`...
iBatis,全称为MyBatis iBatis,是一个基于Java的持久层框架,它简化了数据库与应用程序之间的交互,避免了直接编写大量的...了解并熟练掌握iBatis的基本操作和特性,对于提升Java项目的数据库访问能力具有重要意义。
#### 二、向项目中加入Spring、Struts、iBatis框架 在完成框架下载后,接下来需要将这些框架集成到Web项目中。 ##### 2.1 准备工作 - **框架解压**:将下载好的框架分别解压缩至合适的位置。 - **创建Web项目**:...
Spring 3.2 与 iBatis 的整合是Java企业级开发中常见的一种技术组合,它结合了Spring的依赖注入和事务管理能力以及iBatis的SQL映射框架的灵活性。这种整合允许开发者将业务逻辑与数据访问层解耦,提高了代码的可维护...
在 SSI 集成中,IBatis 作为数据库操作的桥梁,通过 XML 或注解配置 SQL 语句,实现与数据库的交互。 **AOP(面向切面编程)** 面向切面编程是一种编程范式,它允许开发者将关注点分离,如日志、事务管理等,从...
而iBatis作为数据访问层,负责执行SQL,与数据库进行交互。这三个框架协同工作,构建出高效、灵活且易于维护的Web应用。 为了使用这个架构,开发者需要对每个框架有深入的理解,并掌握它们之间的集成方式。例如,...
#### 二、Spring框架简介 Spring框架是一个开源的轻量级Java开发框架,它为Java应用程序提供了一个全面的编程和配置模型。Spring的核心特性包括依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...
Spring框架与IBatis(现称为MyBatis)的整合为开发者提供了一种更简洁、更强大的数据库访问方式。Spring通过其内置的支持机制极大地简化了原有的IBatis访问代码,并且提供了与JdbcTemplate一致的异常处理方式。这种...
iBatis与Spring整合后,可以作为数据访问层,处理与数据库的交互。它提供动态SQL支持,可以灵活地调整查询,避免了传统的DAO层的大量重复代码。 **MySQL数据库**: MySQL 5.1是流行的开源关系型数据库管理系统,...
在Spring+Struts+Ibatis的组合中,Ibatis作为数据访问层,处理与数据库的交互,Spring通过 DataSourceTransactionManager 进行事务管理,确保数据的一致性。 在搭建这个框架的过程中,首先需要配置Spring的...