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

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)

    spring和ibatis整合

    整合ibatis和spring,通过spring的ioc框架调用ibatis进行数据库访问,并向数据库中插入数据

    java spring boot ibatis自动访问数据库.zip

    在spring boot下使用ibatis时,经常要写一堆mapper的java文件和xml文件,需要写sql,这个组件提供了不需要写mapper和xml文件,也不需要写sql就可以对数据库就像读写,只需要写一个跟表对应的model实体类就可以了,...

    ibatis+Spring demo

    内容包里面是源代码,运行该例子的方式就是,使用里面的sql文件还原数据库。确认数据库的url是localhost:3306 用户:root 密码:123456 ...欲了解代码的详细,请访问作者博客,搜索《ibatis + Spring 多表查询》文章。

    产品销售分析系统spring struts2 jfreechart ibatis

    /database: 案例数据库文件。 产品销售分析系统的安装配置介绍 运行环境: 1 Java平台选择JDK 6.0或更高版本。 2 Web服务器选择Tomcat 5.0或更高版本。 3 数据库服务器选择MySQL 5.0.18或更高版本。 数据库配置...

    struts2+spring+ibatis实例

    基于struts2+spring+ibatis做的一个例子。 包含: 1.项目源代码,及所需要用的jar包; 2.数据库脚本。 环境: myeclipse + mysql + tomcat 功能: 1.登录; 2.对另一张表的增删改查操作; 3.设有拦截器功能...

    SSI框架整合(Struts2.1+Spring3.0+Ibatis 2.3)

    SSI框架整合(Struts2.1+Spring3.0+Ibatis 2.3) 下载之后执行.sql文件创建表和sequence 记得改数据库访问地址以及数据库登录用户名密码 项目访问路径 localhost:8080/SSI_Demo1 一个简单的例子(Oracle数据库增删改查...

    最新最全的spring开发包

    这个jar文件包含Spring对DAO特性集进行了扩展,使其支持 iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖 spring-dao.jar里的类,用这个包时你...

    struts2+spring+ibatis实行

    基于struts2+spring+ibatis做的一个例子。 包含: 1.项目源代码,及所需要用的jar包; 2.数据库脚本。 环境: myeclipse + mysql + tomcat 功能: 1.登录; 2.对另一张表的增删改查操作; 3.设有拦截器功能,不...

    [Java]Ibatis Spring Integration Demo

    动手写了一个Ibatis的Demo,反正啥东西,看着都是挺停简单的,Ibatis不就是一个ORM访问数据的东西嘛,不过在实际的动手的过程之中,还是需要到一些问题: 1)缺少这包,缺少那包的;还好用maven只要知道包的版本和2...

    iBATIS实战

    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 ...

    Struts2+Ibatis+Spring例子

    附jar包和建表语句,里面有添、删、改、查通用查询方法,并且,加了log4j,所以对数据库操作SQL都会在控制台打印出来,加有最新的jQuery插件1.7.2.min.js,建好表,部署完工程直接就可以访问,还支持数据库切换,只...

    Spring in Action(第二版 中文高清版).part2

    第二部分 企业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 in Action(第二版 中文高清版).part1

    第二部分 企业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操作的框架。在java jdbc api层实现 分表分库 路由解析的 框架 可以单独或者与用hibernate ibatis spring-jdbc 等框架结合使用,屏蔽api层使用差异,能实现 jdbc 单数据库事务,目的是为了方便的进行分表分库程序的开发

    谢谢大家的关注#halo-dal使用说明#####使用场景:数据库分布式访问#####使用语言:java#####使用条件:支持PreparedStatement处理的任何jdbc框架,最好配合spring管理数据库连接池.#####sql语句必须使用小写字符#####jdk...

    Struts Spring Ibatis SSI 整合开发登录注册实例

    自己做一了一个实例,用的SSI数据库是Mysql简单实现登录注册,开发工具Myeclipse6.5 jdk1.6可能有的地方设计不好,欢迎大家指出。详细介绍欢迎访问博客http://blog.csdn.net/Wallbanger

    Spring in Action(第2版)中文版

    第二部分企业spring 第5章使用数据库 5.1spring的数据访问哲学 5.1.1了解spring数据访问的异常体系 5.1.2数据访问的模板化 5.1.3使用dao支持类 5.2配置数据源 5.2.1使用jndi数据源 5.2.2使用数据源连接池 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    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 切面的...

Global site tag (gtag.js) - Google Analytics