`
sarin
  • 浏览: 1748040 次
  • 性别: 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数据库访问系列】的内容,完善Spring数据库访问的体系,现在我们介绍Spring对iBatis的支持。
    相对于Hibernate等ORM框架的全自动SQL,那么iBatis则属于半自动化的ORM框架,我们需要编写SQL语句,由iBatis进行数据库访问,返回结果。而iBatis可以为我们做的更多,比如对查询结果的封装等等。虽然不如全自动SQL方便,但是SQL的主动权却在我们开发人员的手中,对SQL优化的掌控则是很直接的。对于Hibernate和iBatis的其它讨论,不是我们探究的范围。
当前iBatis的版本为3,其名称也已经更改为MyBatis。而Spring更新到3.1都没有对MyBatis进行支持,但是MyBatis团队已经自行开发了Spring的支持。我们以Spring为主,仍然使用对iBatis2的支持来进行说明。
首先是构建开发环境,我们仍然使用Maven作为构建环境,创建项目,本文的示例基于“联系人管理”功能来展示:
package org.ourpioneer.contact.bean;
public class Contact {
	private Long id;
	private String name;
	private String gender;
	private String mobile;
	private String address;
	//省略getter和setter方法
	@Override
	public String toString() {
		return "Contact [id=" + id + ", name=" + name + ", gender=" + gender
				+ ", mobile=" + mobile + ", address=" + address + "]";
	}
}

    编写一个Contact类来描述联系人的一些特征,为了简便,我们使用5个字段就够了,实体类是很简单的。下面是添加类库了,要访问数据库,不能少了数据库驱动,我们使用MySQL数据库,在pom.xml中添加依赖:
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.14</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>

    同时在数据库中建表,因为iBatis还没有自动建表的功能:
CREATE TABLE `contact` (
`ID`  int(11) NOT NULL AUTO_INCREMENT ,
`NAME`  varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
`GENDER`  varchar(10) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
`MOBILE`  varchar(11) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
`ADDRESS`  varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
PRIMARY KEY (`ID`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=latin1 COLLATE=latin1_swedish_ci
AUTO_INCREMENT=1
ROW_FORMAT=COMPACT
;

    加好驱动,创建好数据库表,那么程序访问需要配置连接池,这里我们使用BoneCP连接池,在pom.xml中加入相关依赖:
	<repositories>
		<repository>
			<releases>
				<updatePolicy>always</updatePolicy>
			</releases>
			<snapshots>
				<updatePolicy>always</updatePolicy>
			</snapshots>
			<id>Jolbox</id>
			<name>Jolbox Repositories</name>
			<url>http://jolbox.com/bonecp/downloads/maven</url>
		</repository>
	</repositories>

    因为BoneCP的Maven仓库不在Maven的中央仓库中,所以必须加入以上代码到pom.xml中,这点可以在BoneCP的官方网站(http://jolbox.com/)中获得,下面就是加入依赖了,就没有什么多说的了:
		<dependency>
			<groupId>com.jolbox</groupId>
			<artifactId>bonecp</artifactId>
			<version>0.7.1.RELEASE</version>
		</dependency>

   下面配置系统日志,因为引入BoneCP而引入了slf4j,如果自动添加的版本过低,这里我们要重新设置slf4j的版本为1.6.4。那么我们添加logback来设置日志系统:
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>1.0.0</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.0.0</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>

    下面配置logback.xml来配置日志具体项,logback.xml文件需要放置到类路径的根路径下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<jmxConfigurator />
	<!--输出到控制台,方便调试,应用时切换到文件Log -->
	<appender name="ConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>%date %-5level [%logger{80}:%L] - %msg%n
			</pattern>
			<charset>UTF-8</charset>
		</encoder>
	</appender>
	<!-- 需要记录日志的包 -->
	<logger name="org.ourpioneer">
		<level value="debug" />
	</logger>
	<logger name="org.springframework">
		<level value="warn" />
	</logger>
	<root>
		<level value="warn" />
		<appender-ref ref="ConsoleAppender" />
	</root>
</configuration>

    这里我们只创建了控制台的Appender,其中设置了日志的格式,编码和需要记录日志的包,并配置响应日志的级别,这都很好理解。下面是添加Spring和iBatis的类库:
		<dependency>
			<groupId>org.apache.ibatis</groupId>
			<artifactId>ibatis-sqlmap</artifactId>
			<version>2.3.4.726</version>
			<scope>compile</scope>
		</dependency>

    Spring的类库添加core,beans,context,jdbc和orm模块即可,其它依赖则会自动添加过来,最终的类库如下图所示:

    下面就是构建项目的目录结构:

    我们采用分层开发的思想,DAO控制访问数据,Service调用DAO方法,同时在Service层做事务,因为我们不是Web项目,这里没有Web层的框架和Action。Bean包下的实体类Contact前面解释过了,common包下的BaseDAO提供操作iBatis的方法,ParameterMap是我们为iBatis提供参数的对象,dao包下就是DAO对象,service包下放置Service类,sqlMaps包下放置iBatis用到的SQL映射文件。App类是我们的测试类。类路径的根目录下的beans.xml是Spring的配置文件,logback.xml是日志配置文件,sqlMapConfig.xml是iBatis的总配置文件,首先来看sqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE sqlMapConfig 
    PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" 
    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<settings cacheModelsEnabled="true" enhancementEnabled="true"
		lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32"
		maxSessions="10" maxTransactions="5" />
		<sqlMap resource="org/ourpioneer/contact/sqlMaps/contact.xml" />
</sqlMapConfig>

    其中就是对iBatis的一些设置,并包含sqlMap文件,很简单,这没有什么可多说的,logback文件前面给出了,下面是Spring的配置文件,首先配置数据源dataSource:
	<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
		destroy-method="close">
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />
		<property name="username" value="root" />
		<property name="password" value="123" />
		<property name="maxConnectionsPerPartition" value="30" />
		<property name="minConnectionsPerPartition" value="10" />
		<property name="partitionCount" value="3" />
		<property name="acquireIncrement" value="5" />
		<property name="statementsCacheSize" value="100" />
		<property name="releaseHelperThreads" value="3" />
	</bean>

    关于BoneCP的介绍网上也有很多,这里不再详细解释各个配置项的含义了,配置好数据源,下面是SqlMapClient,使用Spring的bean工厂来创建,参数是iBatis的总配置文件和数据源,这里我们需要注入配置好的数据源dataSource:
	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation" value="classpath:sqlMapConfig.xml" />
		<property name="dataSource" ref="dataSource" />
	</bean>

    Spring在对iBatis的支持上提供了SqlMapClientTemplate,也就是操作SqlMapClient的模板,这个jdbcTemplate类似,其中的方法使用方式也是类似的,为我们操作iBatis提供了便捷的接口:
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
		<constructor-arg>
			<ref bean="sqlMapClient" />
		</constructor-arg>
	</bean>

    数据库操作的bean都配置好了,下面是事务模块的配置,我们抽象出Service层,也是为了方便事务操作,可能一组业务需要操作多个DAO,那么显然不能在DAO层做事务,而在业务层做事务是非常合适的,也符合逻辑,我们使用Spring提供的DataSourceTransactionManager来配置事务管理器:
	<bean id="transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
	</bean>

    下面是事务拦截的方法和AOP切入点:
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="insert*" rollback-for="Exception" />
			<tx:method name="add*" rollback-for="Exception" />
			<tx:method name="addOrUpdate*" rollback-for="Exception" />
			<tx:method name="del*" rollback-for="Exception" />
			<tx:method name="update*" rollback-for="Exception" />
		</tx:attributes>
	</tx:advice>
	<aop:config proxy-target-class="true">
		<aop:pointcut id="serviceMethod"
			expression="execution(* org.ourpioneer.service.*Service.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
	</aop:config>

这样,我们对org.ourpioneer.service.*Service中方法名以insert/add/del/update等开头的方法都做上事务了。因为我们使用Spring作为bean容器,那么将DAO和Service也纳入Spring 的管理之中:
	<bean id="baseDAO" class="org.ourpioneer.contact.common.BaseDAO">
		<property name="sqlMapClientTemplate" ref="sqlMapClientTemplate" />
	</bean>
	<bean id="contactDAO" class="org.ourpioneer.contact.dao.impl.ContactDAOImpl"
		parent="baseDAO" />

    这里我们将sqlMapClientTemplate配置到BaseDAO中,而ContactDAO继承BaseDAO即可,同时这里要注意这里我们使用了接口和实现相分离的做法,class中是实现类而不是接口,下面是Service:
	<bean id="contactService" class="org.ourpioneer.contact.service.ContactService">
		<property name="contactDAO" ref="contactDAO" />
	</bean>

    配置文件都没有问题了,我们需要把这些涉及到的类都给写出来:
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);
}

    DAO接口仅仅是方法的描述,而实现类中编写具体实现代码:
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);
	}
}

    这里涉及到了BaseDAO,我们来看一下:
package org.ourpioneer.contact.common;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
public class BaseDAO {
	private SqlMapClientTemplate sqlMapClientTemplate;
	public SqlMapClientTemplate getSqlMapClientTemplate() {
		return sqlMapClientTemplate;
	}
	public void setSqlMapClientTemplate(
			SqlMapClientTemplate sqlMapClientTemplate) {
		this.sqlMapClientTemplate = sqlMapClientTemplate;
	}
}

    调用DAO的Service代码如下:
package org.ourpioneer.contact.service;
import java.util.Map;
import org.ourpioneer.contact.bean.Contact;
import org.ourpioneer.contact.common.ParameterMap;
import org.ourpioneer.contact.dao.ContactDAO;
public class ContactService {
	private ContactDAO contactDAO;
	public ContactDAO getContactDAO() {
		return contactDAO;
	}
	public void setContactDAO(ContactDAO contactDAO) {
		this.contactDAO = contactDAO;
	}
	public Contact getContactById(long id) {
		Map<Object, Object> parameterMap = new ParameterMap("ID", id);
		return getContactDAO().getContactById(parameterMap);
	}
}

    从Spring的配置文件我们不难理解这些代码的真正含义,就不过多解释,这里用到了一个ParameterMap对象,我们来看一下它的定义:
package org.ourpioneer.contact.common;
import java.util.HashMap;
public class ParameterMap extends HashMap<Object, Object> {
	private static final long serialVersionUID = 1L;
	public ParameterMap(Object... parameters) {
		for (int i = 0; i < parameters.length - 1; i += 2) {
			super.put(parameters[i], parameters[i + 1]);
		}
	}
}

    非常的简单,这样我们在使用的时候就可以按照[名,值,名,值....]这样的格式来放置参数了。本例中涉及到了一个查询叫“getContactById”,它定义在sqlMaps下的contact.xml中,我们来看一下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap>
	<typeAlias alias="parameterMap" type="org.ourpioneer.contact.common.ParameterMap" />
	<typeAlias alias="contact" type="org.ourpioneer.contact.bean.Contact" />
	<select id="getContactById" parameterClass="parameterMap"
		resultClass="contact">
		select *
		from contact
		where ID=#ID:LONG#
	</select>
</sqlMap>

    首先对ParameterMap和Contact进行别名,为了下面的方便调用,这里我们有一个查询,SQL语句很好理解,select元素的id属性就是它的标识符了,也是sqlMapClientTemplate的queryForObject方法第一个参数,parameterClass指定了参数类,我们使用的是自定义的ParameterMap,resultClass结果类型是我们的实体类对象,这样我们执行这个查询,iBatis会自动为我们封装成一个bean返回,易于调用。
    为了测试,我们首先在数据表中插入一条记录:
INSERT INTO `contact` VALUES ('1', 'Sarin', 'male', '15940912345', 'Dalian');

    下面来编写测试代码:
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);
		logger.info("{}",contact);
	}
}

   我们从Spring的ApplicationContext中获取到Service对象,然后调用getContactById方法获取结果,下面是运行的结果:

   下一篇我们将深入介绍使用SqlMapClientTemplate来操作iBatis进行数据库访问。
  • 大小: 79.9 KB
  • 大小: 23.7 KB
  • 大小: 95.9 KB
11
1
分享到:
评论
2 楼 宋建勇 2012-05-31  
nice ,但要是能给出完整代码下载就好了
1 楼 makemyownlife 2012-01-02  
  不错 加油:——

相关推荐

    Spring数据库访问之iBatis

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

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

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

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

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

    spring和ibatis整合

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

    ibatis+Spring demo

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

    struts2+spring+ibatis实例

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

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

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

    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实战

    书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的大部分知识点,可以作为iBATIS学习和Web开发的经典案例,非常值得深入研究。 本书既可为广大的开发人员(不仅仅是Web应用程序开发人员)...

    Struts2+Ibatis+Spring例子

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

    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英文版

     4.6 Spring和iBATIS  4.6.1 配置SQL Map  4.6.2 使用SqlMapClientTemplate  4.7 Spring和OJB  4.8 小结  第5章 事务管理  5.1 理解事务  5.1.1 仅用4个词解释事务  5.1.2 理解Spring对...

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

    Spring 2.0 开发参考手册

    17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...

    spring chm文档

    17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...

Global site tag (gtag.js) - Google Analytics