ibatis-Spring 整合

[color=red]郑重声明,该内容是复制自该网址http://www.blogjava.net/baizhihui19870626/articles/378330.html因为是对我自己很有用的,怕时间久了该网址不能访问,所以特此做了保存,以便日后学习[/color]

这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同享受吧。呵呵,废话就不多说了。

在此先引用几句别人的资料。。。

Spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。

与hibernate类似,Spring提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。

通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的。此篇文章没有进行事务处理。

本文采用ibatis+spring+mysql 进行编写

数据库脚本如下
[sql] view plaincopy

create database ibatis;

create table person(
id int primary key,
name varchar(10),
sex int
);





一:要有一个PO类

Person.java
[java] view plaincopy

package po;

import java.io.Serializable;

public class Person implements Serializable{
/**
*
*/
private static final long serialVersionUID = -517413165963030507L;
/**
*
*/
private int id;
private String name;
private int sex;

public Person(){

}
public Person(int id,String name,int sex){
this.id = id;
this.name = name;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}

}


二:DAO接口类

IAction.java
[java] view plaincopy

package dao;

import java.util.List;

import po.Person;

public interface IAction {
public boolean insertPerson(Person person); //添加
public boolean deleteById(int id); //删除
public boolean updatePerson(Person person); //修改
public Person queryById(int id); //根据ID查询
public List<Person> queryAllPerson(); //查询全部
}



三:DAO实现类


ActionImpl.java 此类继承SqlMapClientSupport 实现IAction接口
[java] view plaincopy

package dao.impl;

import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ibatis.sqlmap.client.SqlMapSession;

import po.Person;
import dao.IAction;

public class ActionImpl extends SqlMapClientDaoSupport implements IAction {

//添加操作
@Override
public boolean insertPerson(Person person) {
// TODO Auto-generated method stub
getSqlMapClientTemplate().insert("insertPerson",person);
return false;
}

//删除操作
@Override
public boolean deleteById(int id) {
// TODO Auto-generated method stub
getSqlMapClientTemplate().delete("deleteById", id);
return false;
}



//查询全部
@Override
public List<Person> queryAllPerson() {
// TODO Auto-generated method stub
List<Person> persons = getSqlMapClientTemplate().queryForList("queryAllPerson");
return persons;
}

@Override
public Person queryById(int id) {
// TODO Auto-generated method stub

[java] view plaincopy

//自己添加实现代码
return null;
}

@Override
public boolean updatePerson(Person person) {
// TODO Auto-generated method stub

[java] view plaincopy

//自己添加实现代码
return false;
}

四:既然是ibatis spring整合 那就必须要有ibatis的配置文件

SqlMapConfig.xml


[html] view plaincopy

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

[html] view plaincopy

<!--此处一定不能有<settings/> 标签-->
<!-- <settings cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false" /> -->

<sqlMap resource="po/Person.xml" />

</sqlMapConfig>

SqlMapClient.xml里本应该有数据源的配置的 使用spring之后数据源的配置移植到了spring上



五:Person.xml

里面配置了一下对数据的增删改查操作
[html] view plaincopy

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="person" type="po.Person" />

<insert id="insertPerson" parameterClass="po.Person">
<![CDATA[
insert into person values (#id#,#name#,#sex#)
]]>
</insert>

<delete id="deleteById" parameterClass="int">
<![CDATA[
delete from person where id=#id#
]]>
</delete>

<update id="updatePerson" parameterClass="po.Person">
<![CDATA[
update person set name=#name#,sex=#sex# where id=#id#
]]>
</update>

<select id="queryById" parameterClass="int" resultClass="po.Person">
<![CDATA[
select * from person where id=#id#
]]>
</select>

<select id="queryAllPerson" cacheModel="personCache" resultClass="po.Person">
<![CDATA[
select * from person
]]>
</select>
</sqlMap>


六:下面最重要的也就是配置applicationContext.xml了


[html] view plaincopy

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ibatis" />
<property name="username" value="root" />
<property name="password" value="1" />
</bean>

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"> <!-- name 为configLocation或s 不可为其他 -->
<value>SqlMapConfig.xml</value> <!-- 不区分大小写,路径前可加'/' -->
</property>

<!-- dataSource不是必需 -->
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>

<bean id="personDAO" class="dao.impl.ActionImpl">
<!-- dataSource不是必需 -->
<property name="dataSource">
<ref local="dataSource" />
</property>

<!-- sqlMapClient必需 -->
<property name="sqlMapClient">
<ref local="sqlMapClient"/>
</property>
</bean>

<!-- transactionManager不是必需 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
</beans>


注释里面的必需或不是必需都是本人多次试验的,至于为什么是必需不必需 其中的原理我也不是能太讲清楚,在此先是这些写罢了。

里面的每一个节点,属性,如果不太理解,可以上网查一些其他资料。



七:编写测试类

此类利用junit进行测试。只测试了部分功能。


[html] view plaincopy

package dao.impl;

import java.util.Iterator;
import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import po.Person;


public class ActionImplTest {
private static ApplicationContext applicationContext = null; //提供静态ApplicationContext
static{
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //实例化
}
//添加操作
@Test
public void testInsertPerson(){
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
s.insertPerson(new Person(1,"zhangsan",2));
}

//删除操作
@Test
public void testDeletePerson(){
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
s.deleteById(1);
}

//查询全部
@Test
public void testQueryAllPerson(){
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
List<Person> persons = s.queryAllPerson();
//System.out.println(persons.size());
Iterator<Person> ite = persons.iterator();
while(ite.hasNext()){
Person person = ite.next();
System.out.print("ID: "+person.getId());
System.out.print(" Name: "+person.getName());
System.out.print(" Sex: "+person.getSex());
System.out.println();
}
}
}

八:如需记录日志 则要log4j.properties


[html] view plaincopy

#log4j.rootLogger=DEBUG, stdout
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
#log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.rootLogger=DEBUG, stdout, fileout
#log4j.logger.test=info
#log4j.logger.org.apache.jasper = DEBUG
#log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG
#log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG

log4j.logger.com.fiscal = DEBUG
log4j.logger.com.system = DEBUG

log4j.logger.com.ibatis = DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG
log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG, fileout
log4j.logger.java.sql.ResultSet = DEBUG

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=C\:\\ibatis.log
log4j.appender.fileout.MaxFileSize=10000KB

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH\:mm\:ss} \:%m%n

#log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

# log4j.logger.org=info




九:已经到最后了,我觉得这最后的才是最最重要的,就是一下jar包问题

我调试了很长时间 一大部分时间是jar问题

在此列出一下我认为能够跑起来这个小程序所需的一下jar包

如没有,可网上下载。


[sql] view plaincopy

ibaits-2.3.4.jar
spring.jar
mysql-connector-java-bin.jar
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
spring-orm-2.5.6.jar //已集成到spring.jar里
//记录日志所需
log4j-1.2.15.jar
commons-logging.jar


下面是本人的目录结构图




结束语:此文没有过多的讲些原理性的问题,比如为何这样写,又为何这样配置,只是给出了一个搭建框架的架子而已。

因为我也是一个菜鸟,至于如何,我想,等我们有经验了,会慢慢都懂得。

还希望大家共同努力,实现自己的梦想。

希望能与各位共勉!


小白
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值