Spring+Ibatis开发
Spring+Ibatis开发:
1.首先回忆Spring+Hibernate开发;那么时候我们是先加入的Spring,然后在加入Hibernate支持包的,而此时
我们Spring+Ibatis开发,原理也一样,先加入Spring支持,但是不同点来了,就是我们的myeclipse没有提供
加入ibatis的支持,这就意味着我们在加入Spring支持的时候肯定Spring中提供了Ibatis的支持,直接在Spring的
的时候就加入进去了。果然在Spring的支持中提供了一个:Spring 3.0 Persistence IBATIS Libraries 包
勾选上这个,这样就意味着我们再原来6个的基础上变成了7个。其它的支持功能和Hibernate支持的时候一样都
有各自的用途,和hibernate一样的,只使我们没办法加Ibatis支持,所以在这里一并加上了。
第一步:加入spring兼Ibatis支持。
1)勾选 Spring 3.0 Persistence IBATIS Libraries
2)点击next下一步,改名applicationContext.xml为applicationContext-ibatis.xml 其实也可以不改。
2.加入支持后回忆Spring+Hibernate在加入支持后,紧接着是要创建HibernateSessionFactory,但由于有了
Spring的支持,所以是由Spring来帮你创建的数据库连接类HibernateSessionFactory;既然如此,那么当然
Spring+Ibatis也一样是通过写Spring的xml来创建的,因此打开刚刚创建的的核心配置文件ApplicationContext-ibatis.xml
然后开始写配置文件和hibernate jdbc 一样,spring都默认采用的数据源方式 如下:
<bean id="dataSoruce" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
<property name="url" value="jdbc:mysql://loacalhost:3306/ajax" />
<property name="username" value="root" />
<prorpery name="password" value="tiger"/>
</bean>
3.在写完上面的配置后,以为着HibernateSeesionFactory,此处为IbatisSeesionFactory创建完成,那么回忆
一下Spring+Hibernate,接下来应该是创建POJO类,利用的是myeclipse反射自动生成的,没没有给ibatis提供
这个功能,所以自己手工像JDBC一样手工去建立VO;同时由于Ibatis是ORMapping的,所以同样要上单独Ibatis
的是候一样,从开发包中去拷贝一个模板过来,然后改里面的内容,该的方法和单独Ibatis功能应用的时候一样
,该完后,
我记得当时特意提醒了一下,改完的这个VO名.xml一定要在SqlMappingConfig.xml中去储存这个,好让它
在读到这个核心配置文件也读取到这个映射文件从而好实现ORMaaping。这也是我为什么特意提醒。
因此还是需要去拷贝一个核心配置文件SqlMappingConfig.xml放置到src,目录下,然后打开这个核心配置文件,
要做一些改变,因为数据库连接类,我们通过Spring创建了,所以在核心配置文件中就不需要了,因此要删除
上面的数据库连接类的配置,那么剩下的就只有映射文件的储存了。所以在SqlMappingConfig.xml中剩下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<sqlMap resource="cn/mldn/vo/News.xml"/>
</sqlMapConfig>
4.VO类创建完成之后,接着开始编写DAO接口,这个正常编写。hibernate当时也没坐改变。
5.DAO接口编写完后,在写DAO实现类的时候,Spring+Hibernae模式的时候我们继承了一个核心类:
即HibernateDAOSupport, 同样Spring+Ibatis也要去继承一个类,这个类叫做SqlMapClientDAOSupport
6.继承之后,并实现接口,然后编写DAO实现类,那么在Hbernate中主要用的是HibernateTemplate这个核心对象
那么在Ibatis中同样有一个SqlMapClientTemplate, 因为你继承的是SqlMapClientDAOSupport。一一对应
取得这个核心对象的方法:super.getSqlMapClientTemplate();
然后对DAO进行操作:
其实记下面的方法很容易:首先想不用Spring的时候用什么方法,然后Spring的时候肯定是对原先的继承,和修改
添加新的功能,从而体现结合以后带来的好处,否则没有必要结合了,
因此原则肯定是:好的东西继承,不好的改之。而显然传统的JDBC方式是最不好的一种,因为比较繁琐和冗余,
因此Spring+JDBC肯定会大量改之,特使是对象的set,get那一块,因此就有了RowMap这个类的产生。
其它按照这个原则,对比如下:
Spring+JDBC:
C:用update(sql,参数名1,参数名2,....) 来代替以前的executeUpdate()
因为U,D都用的execueUpdate 所以都用update(sql,直接传递参数名);
R:读取:
按主键查询,在传统JDBC中是返回的ResultSet 然后set,get完成。为了减少冗余,在Spring+JDBC方式中
用 super.getJdbcTemplate.queryForObject(sql,this);
而这个this,对应的就RowMap接口中的一个方法,完成统一的set get方法,从而减少冗余。
不分页用的是 queryForList(sql,this);
分页用的是 Object[] params = new Object[xx]; queryForList(sql,params,this);
统计数据用的是 queryForInt(sql,可变参数所以直接传递过来);
Spring+Hibernate:
C:增加在传统的Hibernate中用的是save(pojo); 这个方法被继承下来,所以也是super.getHibernateTemplate().save();
U:修改仍然是update(vo); 好像还有一个叫bulkUpdate() D:删除 仍然是 delete(this.findById(id));
但对于这种删除只能删一个,所以它扩展了一个新方法deletAll(xx)传一个集合进去。
查询:
按主键查询,get(),load()方法仍然被继承下来试用,同时进行了扩充有了getAll(),loadAll()查询全部的方法
不分页查询全部,原来用的是query+hql,现在仍然可以,但也可以哟偶那个getAll() loadAll()
分页查询,原来用的是executeFind方法这里仍然一样,另外有一个find()方法也可以
然后还有list(),然后还有 对象转换的一个。很多具体去查那一章的笔记。
Spring+Ibatis:
C:仍然是super.getSqlMapClientTemplate().insert("doCreate",vo);
U: 仍然是xxxx.update("doUpdate",vo) D:xxx.delete("doRemove",id);
R:主键,仍然是xxx.queryForObject("findById",id);
不分页:仍然是xxx.queryForList("findAll");
分页仍然是:Map<String, Object> params = new HashMap<String, Object>();
params.put("column", column);
params.put("kw", "%" + kw + "%");
params.put("start", (cp - 1) * ps);
params.put("ls", ps);
xxxx.queryForList("findAllNewsSplit", params);
统计:Map<String, Object> params = new HashMap<String, Object>();
params.put("column", column);
params.put("kw", "%" + kw + "%");
xxxx.queryForObject("getNewsCount", params);
基本没变:
与单独使用ibatis的区别就是改成super.getSqlMapClientTemplate()来操作,而不再使用IbatisSessionFactory.getSession()操作。
这就是我说的原则:“好的继承继续使用,不好的改之”。
7.DAO实现类写好后,和Hibernate一样,在Spring中注入这个实例从而代替工厂类因此:
<bean id="xxxDAOImpl" class="xxxxx">
<property name="SqlMapClinetTemplate"> //这里肯定就是SqlMapClinetTemplate了
<ref bean="SqlMapClinetTemplate"/>
</property>
</bean>
回想在Spring+Hibernate 的时候,里面用的是HibernateTemplate,所以上面用的是SqlMapClinetTemplate;
那么SqlMapClinetTemplate从那来,那么同样我们需要像HibernateTemplate自己创建所以另外创建:
<bean id="SqlMapClinetTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
</bean>
上面的SqlMapClientTemptlate 的类名称其实和Hibernate差不多之不过一个是hibernate3,一个是ibatis
如果不记得就 在文件中 crtl+shift+t 然后搜索 SqlMapClientTemplate 就可以找到对应的包了。
下面关键的是:和Hibernate一样,我们创建的hibernateTempalte 它是来自sessionFactory,所以当时我们是
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
而前面我们将了sessionFactory在Ibatis中实际就是SqlMapClient 也是用来储存数据源这个在手工创建
IbatisSessionFactory的时候就讲过了;那么关键是seesionFactory,在Hibernate中是自动生成的。而现在
Ibatis中,sqlMapClient 肯定是要自己去创建的。
这个没办法只好自己去建立,其实也很容易记住,前面的包名称和SqlMapClientTemplate是一样的都是:
org.springframework.orm.ibatis.xxx 只是后面不一样,我说过Ibatis是的名字都望文生义的,所以这里
也一样就叫做SqlMapClient的工厂所以是:SqlMapClientFactoryBean 至于后面的Bean,记不记无所谓,
前面对了到是后智能提示就出来了。
所以定义如下:
<bean id="sqlMapClient" class=" org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
但是特别注意了,dataSource当然是正确的了,因为SqlMapClient是所有数据库连接实例的控制管理类,而它
的上级也就所它所管理的这些实例的根本来源当然是数据库连接类IbatisSeesionFactory,而这里有Spring
带为创建了所以是来源于dataSource ,这没有错,但是注意,如果是JDBC模式当然没有错,但是如果是
Hibernate 和 Ibatis模式 恐怕还不够,因为它们是ORMapping的,我们知道SessionFactory 或则
SqlMapClient也罢,它们都通过读取配置文件反射创立的,而我们知道配置文件中,我们除了有数据库连接
类的配置外,我说过还有一重要的就是VO类的映射文件,这个也是要读取的,我们可以去查看
Spring+Hibernate 模式的 < id="sessionFactory" class="org.springframework.orm.hibernate3.xxx">里面
肯定除了dataSource外还有读取映射文件的路径;
所以同样我们的<bean id="sqlMapClient" class=" org.springframework.orm.ibatis.SqlMapClientFactoryBean">
也还要有一个属性来读取VO类的映射文件,而这个映射文件我们是储存在Ibatis的核心文件SqlMapConfig.xml中的
所以这里的属性就是来读取SqlMapConfig.xml它了,读到它也就读到了映射文件,那么这个属性就应该叫做
核心配置的位置了, 即:configLocation 它的值应该就是路径 classpath:SqlMapConfig.xml
因为这个值不是字符串所以用value 括起来即:
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
整合起来就是:
<bean id="sqlMapClient" class=" org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
</bean>
8.DAO实现类注入以后,接着是业务层的接口这个不变
9.接着是业务层的接口的实现类,这个也没有变化和Spring+Hibernate一样
10,业务层实现类注入到Spring中,代替工厂类
11.加入事务处理即Sring的AOP操作。这个AOP操作其实是和JDBC的时候是一样的。
注意AOP部分事务处理和连接关闭的支持类改了。改回到JDBC时的配置。
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
12.整个Spring+Ibatis 完成,即DAO层和业务层完成
剩下的就web层的操作了,而web层的操作和你的底层没关系,Servlet struts1.x struts2.x 都可以。