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

Spring+Ibatis开发的更多相关文章

  1. ibatis 开发中的经验 (三)Struts+Spring+Ibatis 开发环境搭建

             ibatis项目中用到了一些基本配置,须要和spring集成,看了看这些配置大部分同hibernate中是一样的,也比較好理解.仅仅是须要他们的配置中每个类的含义,还有当中的一些细节 ...

  2. web工程中spring+ibatis的单元测试--转载

    为了保证代码的正确,软件的质量,单元测试几乎是每个程序员都要面临的工作了;而开发中大部分的工作都涉及数据库的操作,也就是平时经常可以看到的DAO了;由于是对数据库的操作,就必然有事务的问题了;如果是启 ...

  3. Annotation(三)——Spring注解开发

    Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射.通常情况下我们会在xml配置文件中进行action, ...

  4. struts2,spring,ibatis学习

    1.1 什么是struts2? MVC思想给网站设计带来了巨大的好处,但是MVC毕竟只是一种思想,不同的程序员写出来的基于MVC思想的应用,风格可能不一样.影响程序的标准化,Struts是为了规范MV ...

  5. Struts2+Spring3+MyBatis3整合以及Spring注解开发

     分类: Web(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在做一个SpringMVC+spring+MyBatis的项目,突然想起以前自己要搭建一个Struts2+Sprin ...

  6. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用Spring Framework开发自己的应用程序

    1.直接基于spring framework开发自己的应用程序: 1.1参考资料: Spring官网spring-framework.4.3.5.RELAESE的Reference Documenta ...

  7. web工程spring+ibatis单元测试

    web工程spring+ibatis在本地做单元测试,用例如下: package wanghongye; import org.junit.Before; import org.junit.Test; ...

  8. 用Spring MVC开发简单的Web应用

    这个例子是来自于Gary Mak等人写的Spring攻略(第二版)第八章Spring @MVC中的一个例子,在此以学习为目的进行记录. 问题:想用Spring MVC开发一个简单的Web应用, 学习这 ...

  9. Spring+iBatis+Atomikos实现JTA事务

    Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品. 产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransacti ...

随机推荐

  1. etcd安装和简单使用

    etcd作为一个高可用强一致性的服务发现存储仓库,在Kubernetes等开源项目中用的很多,这里简单记录下安装和常用命令以及api 安装 安装包可以从 https://github.com/etcd ...

  2. 三:MVC之Lambda表达式

    Lambda表达式 Lambda表达式是一个匿名方法,即没有方法名的方法. C#中的Lambda表达式使用Lambda运算符“=>”,该运算符读为“goes to”. 语法: 形参列表=> ...

  3. Linux学习笔记(三)Linux常用命令:链接命令和文件查找命令

    一.链接命令 ln -s [原文件] [目标文件] (link) -s意为创建软连接 硬链接和软连接 硬链接的特点: (1)拥有相同的 i 结点和block块,可以看作是同一个文件 (2)可以通过 i ...

  4. python-----操作路径

    分离路径.文件名 org_path = r"F:\temp\test" fpath, fname = os.path.split(org_path) print(fpath,fna ...

  5. P3528 [POI2011]PAT-Sticks

    题目概述 题目描述 给出若干木棍,每根木棍有特定的颜色和长度.问能否找到三条颜色不同的木棍构成一个三角形. (注意这里所说的三角形面积要严格大于\(0\)) 输入格式 第一行给出一个整数\(k\),表 ...

  6. 上传时excel类型accept的MIMI类型

    1.excel文件类型 accept='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/v ...

  7. 错误调试以及debug的使用

    /*定义 .search 搜索*/ $.fn.UiSearch=function(){ var ui=$(this); //任何地方都可以使用断点调试:debugger; //调试时,可以在控制台输入 ...

  8. 关于dll注入

    例如:     有一个游戏修改器:其中有一个按钮“自动打怪”:点击时游戏会实现相应的功能:     对于游戏程序来说,自动打怪操作本质上就是call调用一个函数:     但是修改器和游戏是两个独立的 ...

  9. Docker 阿里云镜像加速

    1.进入阿里云镜像加速页面: https://cr.console.aliyun.com/#/accelerator 2.修改/etc/docker/daemon.json文件配置,没有则新建: ? ...

  10. react-native-pg-style使用方法(以最简单的方式编写样式代码,抛弃react-native标准的样式创建方式.)

    react-native-pg-style 以最简单的方式编写样式代码,抛弃react-native标准的样式创建方式. 看大家写的源码中都是按照react-native标准的样式创建方式来写样式代码 ...