这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同享受吧。呵呵,废话就不多说了。
在此先引用几句别人的资料。。。
Spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。
与hibernate类似,Spring提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。
通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的。此篇文章没有进行事务处理。
本文采用ibatis+spring+mysql 进行编写
数据库脚本如下
create database ibatis;
create table person(
id int primary key,
name varchar(10),
sex int
);
一:要有一个PO类
Person.java
01
package po;
02
03
import java.io.Serializable;
04
05
public class Person implements Serializable{
06
/**
07
*
08
*/
09
private static final long serialVersionUID = -517413165963030507L;
10
/**
11
*
12
*/
13
private int id;
14
private String name;
15
private int sex;
16
17
public Person(){
18
19
}
20
public Person(int id,String name,int sex){
21
this.id = id;
22
this.name = name;
23
this.sex = sex;
24
}
25
public int getId() {
26
return id;
27
}
28
public void setId(int id) {
29
this.id = id;
30
}
31
public String getName() {
32
return name;
33
}
34
public void setName(String name) {
35
this.name = name;
36
}
37
public int getSex() {
38
return sex;
39
}
40
public void setSex(int sex) {
41
this.sex = sex;
42
}
43
44
}
二:DAO接口类
IAction.java
01
package dao;
02
03
import java.util.List;
04
05
import po.Person;
06
07
public interface IAction {
08
public boolean insertPerson(Person person); //添加
09
public boolean deleteById(int id); //删除
10
public boolean updatePerson(Person person); //修改
11
public Person queryById(int id); //根据ID查询
12
public List<Person> queryAllPerson(); //查询全部
13
}
三:DAO实现类
ActionImpl.java 此类继承SqlMapClientSupport 实现IAction接口
01
package dao.impl;
02
03
import java.io.IOException;
04
import java.io.Reader;
05
import java.sql.SQLException;
06
import java.util.List;
07
08
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
09
10
import com.ibatis.common.resources.Resources;
11
import com.ibatis.sqlmap.client.SqlMapClient;
12
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
13
import com.ibatis.sqlmap.client.SqlMapSession;
14
15
import po.Person;
16
import dao.IAction;
17
18
public class ActionImpl extends SqlMapClientDaoSupport implements IAction {
19
20
//添加操作
21
@Override
22
public boolean insertPerson(Person person) {
23
// TODO Auto-generated method stub
24
getSqlMapClientTemplate().insert("insertPerson",person);
25
return false;
26
}
27
28
//删除操作
29
@Override
30
public boolean deleteById(int id) {
31
// TODO Auto-generated method stub
32
getSqlMapClientTemplate().delete("deleteById", id);
33
return false;
34
}
35
36
37
38
//查询全部
39
@Override
40
public List<Person> queryAllPerson() {
41
// TODO Auto-generated method stub
42
List<Person> persons = getSqlMapClientTemplate().queryForList("queryAllPerson");
43
return persons;
44
}
45
46
@Override
47
public Person queryById(int id) {
48
// TODO Auto-generated method stub
49
50
51
//自己添加实现代码
52
return null;
53
}
54
55
@Override
56
public boolean updatePerson(Person person) {
57
// TODO Auto-generated method stub
58
59
60
//自己添加实现代码
61
return false;
62
}
四:既然是ibatis spring整合 那就必须要有ibatis的配置文件
SqlMapConfig.xml
01
<?xml version="1.0" encoding="UTF-8" ?>
02
<!DOCTYPE sqlMapConfig
03
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
04
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
05
<sqlMapConfig>
06
<!--此处一定不能有<settings/> 标签-->
07
<!-- <settings cacheModelsEnabled="true"
08
enhancementEnabled="true"
09
lazyLoadingEnabled="true"
10
errorTracingEnabled="true"
11
maxRequests="32"
12
maxSessions="10"
13
maxTransactions="5"
14
useStatementNamespaces="false" /> -->
15
16
<sqlMap resource="po/Person.xml" />
17
18
</sqlMapConfig>
SqlMapClient.xml里本应该有数据源的配置的 使用spring之后数据源的配置移植到了spring上
五:Person.xml
里面配置了一下对数据的增删改查操作
01
<?xml version="1.0" encoding="UTF-8" ?>
02
<!DOCTYPE sqlMapConfig
03
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
04
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
05
<sqlMapConfig>
06
<!--此处一定不能有<settings/> 标签-->
07
<!-- <settings cacheModelsEnabled="true"
08
enhancementEnabled="true"
09
lazyLoadingEnabled="true"
10
errorTracingEnabled="true"
11
maxRequests="32"
12
maxSessions="10"
13
maxTransactions="5"
14
useStatementNamespaces="false" /> -->
15
16
<sqlMap resource="po/Person.xml" />
17
18
</sqlMapConfig>
六:下面最重要的也就是配置applicationContext.xml了
01
<?xml version="1.0" encoding="UTF-8"?>
02
<beans xmlns="http://www.springframework.org/schema/beans"
03
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
04
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
05
06
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
07
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
08
<property name="url" value="jdbc:mysql://localhost:3306/ibatis" />
09
<property name="username" value="root" />
10
<property name="password" value="1" />
11
</bean>
12
13
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
14
<property name="configLocation"> <!-- name 为configLocation或s 不可为其他 -->
15
<value>SqlMapConfig.xml</value> <!-- 不区分大小写,路径前可加'/' -->
16
</property>
17
18
<!-- dataSource不是必需 -->
19
<property name="dataSource">
20
<ref local="dataSource" />
21
</property>
22
</bean>
23
24
<bean id="personDAO" class="dao.impl.ActionImpl">
25
<!-- dataSource不是必需 -->
26
<property name="dataSource">
27
<ref local="dataSource" />
28
</property>
29
30
<!-- sqlMapClient必需 -->
31
<property name="sqlMapClient">
32
<ref local="sqlMapClient"/>
33
</property>
34
</bean>
35
36
<!-- transactionManager不是必需 -->
37
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
38
<property name="dataSource">
39
<ref local="dataSource" />
40
</property>
41
</bean>
42
</beans>
注释里面的必需或不是必需都是本人多次试验的,至于为什么是必需不必需 其中的原理我也不是能太讲清楚,在此先是这些写罢了。
里面的每一个节点,属性,如果不太理解,可以上网查一些其他资料。
七:编写测试类
此类利用junit进行测试。只测试了部分功能。
01
package dao.impl;
02
03
import java.util.Iterator;
04
import java.util.List;
05
06
import org.junit.Test;
07
import org.springframework.context.ApplicationContext;
08
import org.springframework.context.support.ClassPathXmlApplicationContext;
09
10
import po.Person;
11
12
13
public class ActionImplTest {
14
private static ApplicationContext applicationContext = null; //提供静态ApplicationContext
15
static{
16
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //实例化
17
}
18
//添加操作
19
@Test
20
public void testInsertPerson(){
21
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
22
s.insertPerson(new Person(1,"zhangsan",2));
23
}
24
25
//删除操作
26
@Test
27
public void testDeletePerson(){
28
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
29
s.deleteById(1);
30
}
31
32
//查询全部
33
@Test
34
public void testQueryAllPerson(){
35
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
36
List<Person> persons = s.queryAllPerson();
37
//System.out.println(persons.size());
38
Iterator<Person> ite = persons.iterator();
39
while(ite.hasNext()){
40
Person person = ite.next();
41
System.out.print("ID: "+person.getId());
42
System.out.print(" Name: "+person.getName());
43
System.out.print(" Sex: "+person.getSex());
44
System.out.println();
45
}
46
}
47
}
八:如需记录日志 则要log4j.properties
01
#log4j.rootLogger=DEBUG, stdout
02
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
03
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
04
#log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
05
#log4j.logger.java.sql.PreparedStatement=DEBUG
06
log4j.rootLogger=DEBUG, stdout, fileout
07
#log4j.logger.test=info
08
#log4j.logger.org.apache.jasper = DEBUG
09
#log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG
10
#log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG
11
12
log4j.logger.com.fiscal = DEBUG
13
log4j.logger.com.system = DEBUG
14
15
log4j.logger.com.ibatis = DEBUG
16
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG
17
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG
18
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG
19
log4j.logger.java.sql.Connection = DEBUG
20
log4j.logger.java.sql.Statement = DEBUG
21
log4j.logger.java.sql.PreparedStatement = DEBUG, fileout
22
log4j.logger.java.sql.ResultSet = DEBUG
23
24
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
25
26
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
27
log4j.appender.fileout.File=C\:\\ibatis.log
28
log4j.appender.fileout.MaxFileSize=10000KB
29
30
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
31
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
32
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
33
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
34
35
#log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
36
37
# log4j.logger.org=info
九:已经到最后了,我觉得这最后的才是最最重要的,就是一下jar包问题
我调试了很长时间 一大部分时间是jar问题
在此列出一下我认为能够跑起来这个小程序所需的一下jar包
如没有,可网上下载。
- 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
下面是本人的目录结构图