ibatis-Spring 整合
这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同享受吧。呵呵,废话就不多说了。
在此先引用几句别人的资料。。。
Spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。
与hibernate类似,Spring提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。
通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的。此篇文章没有进行事务处理。
本文采用ibatis+spring+mysql 进行编写
数据库脚本如下
create database ibatis; create table person(
id int primary key,
name varchar(10),
sex int
);
一:要有一个PO类
Person.java
package po; import java.io.Serializable; public class Person implements Serializable{
/**
*
*/
private static final long serialVersionUID = -517413165963030507L;
/**
*
*/
private int id;
private String name;
private int sex; public Person(){ }
public Person(int id,String name,int sex){
this.id = id;
this.name = name;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
} }
二:DAO接口类
IAction.java
package dao; import java.util.List; import po.Person; public interface IAction {
public boolean insertPerson(Person person); //添加
public boolean deleteById(int id); //删除
public boolean updatePerson(Person person); //修改
public Person queryById(int id); //根据ID查询
public List<Person> queryAllPerson(); //查询全部
}
三:DAO实现类
ActionImpl.java 此类继承SqlMapClientSupport 实现IAction接口
package dao.impl; import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List; import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ibatis.sqlmap.client.SqlMapSession; import po.Person;
import dao.IAction; public class ActionImpl extends SqlMapClientDaoSupport implements IAction { //添加操作
@Override
public boolean insertPerson(Person person) {
// TODO Auto-generated method stub
getSqlMapClientTemplate().insert("insertPerson",person);
return false;
} //删除操作
@Override
public boolean deleteById(int id) {
// TODO Auto-generated method stub
getSqlMapClientTemplate().delete("deleteById", id);
return false;
} //查询全部
@Override
public List<Person> queryAllPerson() {
// TODO Auto-generated method stub
List<Person> persons = getSqlMapClientTemplate().queryForList("queryAllPerson");
return persons;
} @Override
public Person queryById(int id) {
// TODO Auto-generated method stub
//自己添加实现代码
return null;
} @Override
public boolean updatePerson(Person person) {
// TODO Auto-generated method stub
//自己添加实现代码
return false;
} }
四:既然是ibatis spring整合 那就必须要有ibatis的配置文件
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!--此处一定不能有<settings/> 标签-->
<!-- <settings cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false" /> --> <sqlMap resource="po/Person.xml" /> </sqlMapConfig>
SqlMapClient.xml里本应该有数据源的配置的 使用spring之后数据源的配置移植到了spring上
五:Person.xml
里面配置了一下对数据的增删改查操作
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="person" type="po.Person" /> <insert id="insertPerson" parameterClass="po.Person">
<![CDATA[
insert into person values (#id#,#name#,#sex#)
]]>
</insert> <delete id="deleteById" parameterClass="int">
<![CDATA[
delete from person where id=#id#
]]>
</delete> <update id="updatePerson" parameterClass="po.Person">
<![CDATA[
update person set name=#name#,sex=#sex# where id=#id#
]]>
</update> <select id="queryById" parameterClass="int" resultClass="po.Person">
<![CDATA[
select * from person where id=#id#
]]>
</select> <select id="queryAllPerson" cacheModel="personCache" resultClass="po.Person">
<![CDATA[
select * from person
]]>
</select>
</sqlMap>
六:下面最重要的也就是配置applicationContext.xml了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ibatis" />
<property name="username" value="root" />
<property name="password" value="1" />
</bean> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"> <!-- name 为configLocation或s 不可为其他 -->
<value>SqlMapConfig.xml</value> <!-- 不区分大小写,路径前可加'/' -->
</property> <!-- dataSource不是必需 -->
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean> <bean id="personDAO" class="dao.impl.ActionImpl">
<!-- dataSource不是必需 -->
<property name="dataSource">
<ref local="dataSource" />
</property> <!-- sqlMapClient必需 -->
<property name="sqlMapClient">
<ref local="sqlMapClient"/>
</property>
</bean> <!-- transactionManager不是必需 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
</beans>
注释里面的必需或不是必需都是本人多次试验的,至于为什么是必需不必需 其中的原理我也不是能太讲清楚,在此先是这些写罢了。
里面的每一个节点,属性,如果不太理解,可以上网查一些其他资料。
七:编写测试类
此类利用junit进行测试。只测试了部分功能。
package dao.impl; import java.util.Iterator;
import java.util.List; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import po.Person; public class ActionImplTest {
private static ApplicationContext applicationContext = null; //提供静态ApplicationContext
static{
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //实例化
}
//添加操作
@Test
public void testInsertPerson(){
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
s.insertPerson(new Person(1,"zhangsan",2));
} //删除操作
@Test
public void testDeletePerson(){
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
s.deleteById(1);
} //查询全部
@Test
public void testQueryAllPerson(){
ActionImpl s = (ActionImpl)applicationContext.getBean("personDAO");
List<Person> persons = s.queryAllPerson();
//System.out.println(persons.size());
Iterator<Person> ite = persons.iterator();
while(ite.hasNext()){
Person person = ite.next();
System.out.print("ID: "+person.getId());
System.out.print(" Name: "+person.getName());
System.out.print(" Sex: "+person.getSex());
System.out.println();
}
}
}
八:如需记录日志 则要log4j.properties
#log4j.rootLogger=DEBUG, stdout
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
#log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.rootLogger=DEBUG, stdout, fileout
#log4j.logger.test=info
#log4j.logger.org.apache.jasper = DEBUG
#log4j.logger.org.apache.catalina.startup.TldConfig = DEBUG
#log4j.logger.org.apache.catalina.session.ManagerBase = DEBUG log4j.logger.com.fiscal = DEBUG
log4j.logger.com.system = DEBUG log4j.logger.com.ibatis = DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG
log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG, fileout
log4j.logger.java.sql.ResultSet = DEBUG log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=C\:\\ibatis.log
log4j.appender.fileout.MaxFileSize=10000KB log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH\:mm\:ss} \:%m%n #log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout # log4j.logger.org=info
九:已经到最后了,我觉得这最后的才是最最重要的,就是一下jar包问题
我调试了很长时间 一大部分时间是jar问题
在此列出一下我认为能够跑起来这个小程序所需的一下jar包
如没有,可网上下载。
ibaits-2.3.4.jar
spring.jar
mysql-connector-java-bin.jar
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
spring-orm-2.5.6.jar //已集成到spring.jar里
//记录日志所需
log4j-1.2.15.jar
commons-logging.jar
下面是本人的目录结构图
结束语:此文没有过多的讲些原理性的问题,比如为何这样写,又为何这样配置,只是给出了一个搭建框架的架子而已。
因为我也是一个菜鸟,至于如何,我想,等我们有经验了,会慢慢都懂得。
还希望大家共同努力,实现自己的梦想。
希望能与各位共勉!
ibatis-Spring 整合的更多相关文章
- Ibatis,Spring整合(注解方式注入)
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- Spring整合Ibatis
Spring整合Ibatis javaibatisspring 所需jar清单 ibatis-2.*.jar *为任意版本,下同,ibatis工作包 sp ...
- Intellij IDEA +MAVEN+Jetty实现Spring整合Mybatis
1 pom.xml(这里出现transaction错误,是版本的问题) <project xmlns="http://maven.apache.org/POM/4.0.0" ...
- Spring整合MyBatis
前言:MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的XML或注解用 ...
- Spring学习总结(六)——Spring整合MyBatis完整示例
为了梳理前面学习的内容<Spring整合MyBatis(Maven+MySQL)一>与<Spring整合MyBatis(Maven+MySQL)二>,做一个完整的示例完成一个简 ...
- Spring学习总结(五)——Spring整合MyBatis(Maven+MySQL)一
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中. 使用这个类库中的类, Spring 将会加载必要的MyBatis工厂类和 session 类. 这个类库 ...
- Spring 整合 Hibernate
Spring 整合 Hibernate •Spring 支持大多数流行的 ORM 框架, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA. •Spring 对这些 OR ...
- Mybatis+struts2+spring整合
把student项目改造成ssm struts2 +mybatis+spring 1,先添加spring支持:类库三个,applicationContext.xml写在webinf下四个命名空间,监 ...
- JAVA开发:分享一些SpringMvc+Ibatis+spring的框架使用心得
近期不在做.net的项目,而是使用java作为开发语言,就想着要用springmvc开发了,由于前些年也用过struts1/2+hibernate/ibatis+spring开发过项目,因此是有些底子 ...
- Spring整合Shiro做权限控制模块详细案例分析
1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.sh ...
随机推荐
- Swift的笔记和参考
原文:Swift的笔记和参考 好久没来了,趁着新语言Swift发布,继续钻研中! Create Class 创建类 (多态效果) // Create Class 创建类 class MyClass { ...
- RHEL5 X86-64上安装Oracle 11gR2演示样例与总结
进入Oracle DBA行业也有好几年了,可是说到安装Oracle的经验,我还真不是特别多,印象中刚開始每次安装都有点磕磕碰碰,随着接触Oracle的时间越来越长,各方面的原理.机制也都有一定的了解后 ...
- 我们的空间是它圆——基于Poicare对宇宙的模型
一般 状态 在人类文明的开始,并探讨了空间和时间的混乱从来没有停止过.马跑得更快.鱼下潜深.鸟振翅高飞,但是,人类并没有很深的不满潜飞不高.为什么?其原因是,马跑得更快,但它不会不知道他们为什么会跑得 ...
- HDU 1385 Minimum Transport Cost 最短路径题解
本题就是使用Floyd算法求全部路径的最短路径,并且须要保存路径,并且更进一步须要依照字典顺序输出结果. 还是有一定难度的. Floyd有一种非常巧妙的记录数据的方法,大多都是使用这种方法记录数据的. ...
- 给Notepad++ 6.7 加右键菜单带图标
使用的是Notepad++ 6.7,下载 NppShell64.dll 和 NppShell.dll方法:将BAT文件和下载的NppShell64.dll 和 NppShell.dll放置Notepa ...
- leetcode先刷_Unique Binary Search Trees II
可能没想到,人的简单方法,关于质询的问题提出做. 如何把产生出来的所有的树木?所使用的方法当然是递归,但是有一个致命的问题,假设根节点,然后做一个递归,所以这是非常多的公共树木的根,结果肯定是一团糟. ...
- UiAutomator源码分析之注入事件
上一篇文章<UiAutomator源码分析之UiAutomatorBridge框架>中我们把UiAutomatorBridge以及它相关的类进行的描述,往下我们会尝试根据两个实例将这些类给 ...
- leetcode[70] Simplify Path
题目的意思是简化一个unix系统的路径.例如: path = "/home/", => "/home"path = "/a/./b/../../ ...
- javascript 学习总结(七)String对象
1.string对象中可以传正则的函数介绍 /* match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是 ...
- word-wrap同word-break的区别
兼容 IE 和 FF 的换行 CSS 推荐样式 最好的方式是 以下是引用片段: word-wrap:break-word; overflow:hidden; 而不是 以下是引用片段: word-wra ...