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 都可以。
Spring+Ibatis开发的更多相关文章
- ibatis 开发中的经验 (三)Struts+Spring+Ibatis 开发环境搭建
ibatis项目中用到了一些基本配置,须要和spring集成,看了看这些配置大部分同hibernate中是一样的,也比較好理解.仅仅是须要他们的配置中每个类的含义,还有当中的一些细节 ...
- web工程中spring+ibatis的单元测试--转载
为了保证代码的正确,软件的质量,单元测试几乎是每个程序员都要面临的工作了;而开发中大部分的工作都涉及数据库的操作,也就是平时经常可以看到的DAO了;由于是对数据库的操作,就必然有事务的问题了;如果是启 ...
- Annotation(三)——Spring注解开发
Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射.通常情况下我们会在xml配置文件中进行action, ...
- struts2,spring,ibatis学习
1.1 什么是struts2? MVC思想给网站设计带来了巨大的好处,但是MVC毕竟只是一种思想,不同的程序员写出来的基于MVC思想的应用,风格可能不一样.影响程序的标准化,Struts是为了规范MV ...
- Struts2+Spring3+MyBatis3整合以及Spring注解开发
分类: Web(2) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在做一个SpringMVC+spring+MyBatis的项目,突然想起以前自己要搭建一个Struts2+Sprin ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用Spring Framework开发自己的应用程序
1.直接基于spring framework开发自己的应用程序: 1.1参考资料: Spring官网spring-framework.4.3.5.RELAESE的Reference Documenta ...
- web工程spring+ibatis单元测试
web工程spring+ibatis在本地做单元测试,用例如下: package wanghongye; import org.junit.Before; import org.junit.Test; ...
- 用Spring MVC开发简单的Web应用
这个例子是来自于Gary Mak等人写的Spring攻略(第二版)第八章Spring @MVC中的一个例子,在此以学习为目的进行记录. 问题:想用Spring MVC开发一个简单的Web应用, 学习这 ...
- Spring+iBatis+Atomikos实现JTA事务
Atomikos是一个公司名字,旗下最著名的莫过于其Atomikos的事务管理器产品. 产品分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransacti ...
随机推荐
- AJAX—AJAX基础
AJAX简介 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异 ...
- java——OOM内存泄漏
资料: 一.什么是OOM OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个erro ...
- python3 scrapy爬虫项目的诞生
前提安装好scrapy模块最好 requests和bs4模块都安装好 可以概括为五个步骤 步骤一:新建一个项目 无论你用windows也好,linux也罢,在cmd或者终端 切换到目标文件夹,然后输入 ...
- 浅谈script中的defer与async
一直没有在script上使用过别的属性,今天看基础代码才发现这个,搜索.记录下,以便记忆. 大家都知道,js加载会造成阻塞,阻碍页面的继续渲染. defer: js与页面同步加载,不阻碍页面渲染,会在 ...
- [AngularJS] Decorator pattern for code reuse
Imaging you have a large application, inside this large application you have many small individual a ...
- Luogu P2324 [SCOI2005]骑士精神 搜索
刚开始写了个没迭代的...结果过了$qwq$ 然后迭个代..更快了.. #include<cstdio> #include<iostream> #define R regist ...
- js上传文件夹
用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助.此控件PC全平台支持包括mac,li ...
- 图像傅里叶变换(快速傅里叶变换FFT)
学习DIP第7天,图像傅里叶变换 转载请标明出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对 ...
- 事务四大特性(ACID)
事务的概念:事务是指逻辑上的一组操作,这组操作要么同时完成要么同时不完成. 事务的管理:默认情况下,数据库会自动管理事务,管理的方式是一条语句就独占一个事务. 如果需要自己控制事务也可以通过如下命令开 ...
- CISCO实验记录二:路由器基本操作
一.路由器基本操作要求 1.设置路由器本地时间 2.启用光标跟随 3.设置路由器标语信息和描述信息 4.为接口配置描述信息 5.快速恢复接口到出厂设置 二.路由器基本操作命令 1.设置路由器本地时间 ...