[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
下面是本人的目录结构图
结束语:此文没有过多的讲些原理性的问题,比如为何这样写,又为何这样配置,只是给出了一个搭建框架的架子而已。
因为我也是一个菜鸟,至于如何,我想,等我们有经验了,会慢慢都懂得。
还希望大家共同努力,实现自己的梦想。
希望能与各位共勉!
小白
这两天一直在研究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
下面是本人的目录结构图
结束语:此文没有过多的讲些原理性的问题,比如为何这样写,又为何这样配置,只是给出了一个搭建框架的架子而已。
因为我也是一个菜鸟,至于如何,我想,等我们有经验了,会慢慢都懂得。
还希望大家共同努力,实现自己的梦想。
希望能与各位共勉!
小白