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 ...
随机推荐
- Mysql(七):视图、触发器、事务、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- Hadoop_17_MapRduce_案例2_实现用户手机流量统计(ReduceTask并行度控制)
需求:1.统计每一个用户(手机号)所耗费的总上行流量.下行流量,总流量 1.数据如下:保存为.dat文件(因为以\t切分数据,文件格式必须合适) 1363157985066 13726230503 0 ...
- vue2.0+webpack+vuerouter+vuex+axios构建项目基础
前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...
- Ubuntu系统---安装搜狗输入法
Ubuntu_搜狗输入法 第一步: 1,下载搜狗输入法的安装包. 下载地址为:http://pinyin.sogou.com/linux/ ,如下图,要选择与自己系统位数一致的安装包,我的系统是64位 ...
- ndk学习之C语言基础复习----基本数据类型、数组
关于NDK这个分类在N年前就已经创建了,但是一直木有系统的记录其学习过程,当然也没真正学会NDK的技术真谛,所以一直也是自己的一个遗憾,而如今对于Android程序员的要求也是越来越高,对于NDK也是 ...
- gitlab 错误处理
用gitolite新建项目,clone后首次push,可能会出现: $ git push No refs in common and none specified; doing nothing. Pe ...
- jquery 去除 css 的 background-image 样式
首先我使用了这个: $('#**').css('background-image', null); 没有效果...... 然后我用了这个: $('#staffName').css('backgroun ...
- BZOJ4886 [Lydsy1705月赛]叠塔游戏[基环树]
很妙的一道题. 由于本人过于zz,不会这道题,通过厚颜无耻翻阅题解无数终于懂了这道题,所以这里转载一位神仙的blog. 没有看懂?没事,再来一篇. 这题个人认为主要在于转化题意和建图,这两点想通了应该 ...
- centos 7 + Net Core 3.0 + Docker 配置说明(不含https)
1.新建Core3.0项目 1.1 使用visual studio 2019 创建一个名为core3.web.httpapi 的"ASP.NET Core Web应用程序" 1.2 ...
- Qt QMutexLocker_自动解锁的机制
QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁.因为QMutexLocker 申请的这个lock变量在这个函数退出时,自动的调用析构函数来解锁.这样可以防止在程序编写的过程 ...