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 都可以。

最新文章

  1. neatbean 8+版本 配置
  2. EditPlus远程编辑、语法高亮、编译运行源代码设置
  3. VS2013使用EF6与mysql数据库
  4. 拉曼软件在win8上运行出错问题
  5. 【iOS】The differences between Class Extension and Header File 类扩展与头文件的区别
  6. 以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转)
  7. CRUD之delete操作
  8. jsp页面直接编写csss
  9. ABBYY
  10. BZOJ 2286 消耗战
  11. 经典SQL语句大全之基础
  12. .net版Git Server --- bonobo
  13. PAT (天梯)L2-004. 这是二叉搜索树吗?
  14. C#中的foreach语句与枚举器接口(IEnumerator)及其泛型 相关问题
  15. [BZOJ1051] [HAOI2006] 受欢迎的牛 (强联通分量)
  16. Codeforces 888 简要题解
  17. js浮点数加减乘除精度不准确
  18. 初识waindows窗体程序错题整理
  19. 如何将水晶报表(Crystal Report)导入葡萄城报表
  20. Python进阶-字符串格式化

热门文章

  1. 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)
  2. CSCD核心,北大中文核心
  3. asyncio模块实现线程的嵌套和穿插
  4. bzoj1458: 士兵占领(最大流)
  5. 01 salt平台,软件架构图
  6. HDU 6074 - Phone Call | 2017 Multi-University Training Contest 4
  7. asp.net上传大文件的解决方案
  8. Win7下使用Visual Studio为WinXP编译可执行文件
  9. 小米oj 判断是否为连乘数字串
  10. 51 Nod 1449 砝码称重