- 浏览: 1748037 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:172820
-
Android学习笔记
浏览量:366550
-
iBatis开发详解
浏览量:188306
-
Objective-C学习...
浏览量:98742
最新评论
-
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 9190本文系iBatis开发详解系列文章之iBatis操作D ... -
iBatis查询复杂集合
2012-09-04 20:23 15631本文系iBatis开发详解系列文章之在iBatis查询 ... -
iBatis中使用XML
2012-08-29 19:57 7629本文系iBatis开发详解系列文章之在iBatis中使 ... -
iBatis执行非查询语句(CRUD,函数和过程)
2012-08-26 21:40 9256CRUD操作中除了查询操作,其他都统一称为更新操作,因 ... -
Spring数据库访问之iBatis(一)
2012-01-02 18:45 15862为了丰富博客专栏【Spring数据库访问系列】的内容, ... -
HTML5/CSS3翻转动画(二)
2011-12-31 11:28 9517上一篇我们制作了两行文字的翻转效果,他们是同步进行的, ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7687经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
iBatis分页(基于Struts2和Freemarker)
2011-05-02 10:05 13031之前介绍过基于Hibernate分页的原理和设计,这里 ... -
Spring数据库访问之ORM(三)
2011-03-02 20:35 17548本文接上一篇继续研究。 之前我们使用的是Hib ... -
Spring数据库访问之ORM(二)
2011-02-16 13:19 23309本文接上一篇继续来研究Spring的ORM模块。 ... -
Spring数据库访问之ORM(一)
2011-01-27 10:54 30713Spring数据库访问中另外一大模块就是ORM,ORM ... -
Spring数据库访问之异常处理
2011-01-19 10:29 27428使用JDBC API时,很 ... -
Spring数据库访问(HSQL)(四)
2011-01-16 21:49 14449本文接上一篇继续研究Spring的JDBC模板。 ... -
Spring数据库访问(HSQL)(三)
2011-01-13 10:07 13378本文接上一篇继续研究JDBC模板。 之前说的都 ... -
Spring数据库访问(HSQL)(二)
2011-01-11 11:27 10695上一篇我们介绍了 ... -
Spring数据库访问(HSQL)(一)
2011-01-09 23:34 13740本部分主要介绍Spring的JDBC模板,JDBC模板 ... -
Spring 3之MVC & Security简单整合开发(三)
2010-12-03 19:04 21982本文接上一篇继续深入研究Security框架。 ... -
Spring 3之MVC & Security简单整合开发(二)
2010-12-01 20:29 59958本文接上一篇继续 ... -
Spring 3之MVC & Security简单整合开发(一)
2010-11-30 22:00 42409Spring的MVC模块是一种简洁的Web应用框架,实 ... -
用dTree组件生成无限级导航树
2010-08-14 09:50 6992在做管理系统时不可避免要用到导航树,这种东西只要一次做 ...
相关推荐
为了丰富博客专栏【Spring数据库访问系列】的内容,完善Spring数据库访问的体系,现在我们介绍Spring对iBatis的支持。相对于Hibernate等ORM框架的全自动SQL,那么iBatis则属于半自动化的ORM框架,我们需要编写SQL...
访问数据库基本封装(spring/hibernate/ibatis)
整合ibatis和spring,通过spring的ioc框架调用ibatis进行数据库访问,并向数据库中插入数据
在spring boot下使用ibatis时,经常要写一堆mapper的java文件和xml文件,需要写sql,这个组件提供了不需要写mapper和xml文件,也不需要写sql就可以对数据库就像读写,只需要写一个跟表对应的model实体类就可以了,...
内容包里面是源代码,运行该例子的方式就是,使用里面的sql文件还原数据库。确认数据库的url是localhost:3306 用户:root 密码:123456 ...欲了解代码的详细,请访问作者博客,搜索《ibatis + Spring 多表查询》文章。
/database: 案例数据库文件。 产品销售分析系统的安装配置介绍 运行环境: 1 Java平台选择JDK 6.0或更高版本。 2 Web服务器选择Tomcat 5.0或更高版本。 3 数据库服务器选择MySQL 5.0.18或更高版本。 数据库配置...
基于struts2+spring+ibatis做的一个例子。 包含: 1.项目源代码,及所需要用的jar包; 2.数据库脚本。 环境: myeclipse + mysql + tomcat 功能: 1.登录; 2.对另一张表的增删改查操作; 3.设有拦截器功能...
SSI框架整合(Struts2.1+Spring3.0+Ibatis 2.3) 下载之后执行.sql文件创建表和sequence 记得改数据库访问地址以及数据库登录用户名密码 项目访问路径 localhost:8080/SSI_Demo1 一个简单的例子(Oracle数据库增删改查...
这个jar文件包含Spring对DAO特性集进行了扩展,使其支持 iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖 spring-dao.jar里的类,用这个包时你...
基于struts2+spring+ibatis做的一个例子。 包含: 1.项目源代码,及所需要用的jar包; 2.数据库脚本。 环境: myeclipse + mysql + tomcat 功能: 1.登录; 2.对另一张表的增删改查操作; 3.设有拦截器功能,不...
动手写了一个Ibatis的Demo,反正啥东西,看着都是挺停简单的,Ibatis不就是一个ORM访问数据的东西嘛,不过在实际的动手的过程之中,还是需要到一些问题: 1)缺少这包,缺少那包的;还好用maven只要知道包的版本和2...
2.2.2 iBATIS之于大型、企业级系统 31 2.3 为何使用iBATIS 31 2.3.1 简单性 32 2.3.2 生产效率 32 2.3.3 性能 32 2.3.4 关注点分离 33 2.3.5 明确分工 33 2.3.6 可移植性:Java、.NET及其他 33 2.3.7 开源和诚实 33 ...
附jar包和建表语句,里面有添、删、改、查通用查询方法,并且,加了log4j,所以对数据库操作SQL都会在控制台打印出来,加有最新的jQuery插件1.7.2.min.js,建好表,部署完工程直接就可以访问,还支持数据库切换,只...
第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源...
第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源...
谢谢大家的关注#halo-dal使用说明#####使用场景:数据库分布式访问#####使用语言:java#####使用条件:支持PreparedStatement处理的任何jdbc框架,最好配合spring管理数据库连接池.#####sql语句必须使用小写字符#####jdk...
自己做一了一个实例,用的SSI数据库是Mysql简单实现登录注册,开发工具Myeclipse6.5 jdk1.6可能有的地方设计不好,欢迎大家指出。详细介绍欢迎访问博客http://blog.csdn.net/Wallbanger
第二部分企业spring 第5章使用数据库 5.1spring的数据访问哲学 5.1.1了解spring数据访问的异常体系 5.1.2数据访问的模板化 5.1.3使用dao支持类 5.2配置数据源 5.2.1使用jndi数据源 5.2.2使用数据源连接池 ...
2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的...