- 浏览: 7339388 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
最近网上出现IBatis3.0的文章本人也做了小Demo,用一下啊,哈哈。
采用JpA注解实体,采用IBatis3.0的新的开发方式:
采用xml配置IBatis的各种配置文件时数据源可以不适用commons-collections,但是在使用注解时,必须的。有点不解。
使用的类库如下:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="src/commons-dbcp.jar"/>
<classpathentry kind="lib" path="src/commons-logging.jar"/>
<classpathentry kind="lib" path="src/commons-pool.jar"/>
<classpathentry kind="lib" path="src/ibatis-3-core-3.0.0.227.jar"/>
<classpathentry kind="lib" path="src/mysql-connector-java-3.2.0-alpha-bin.jar"/>
<classpathentry kind="lib" path="src/persistence-api-1.0.jar"/>
<classpathentry kind="lib" path="src/persistence-api-1.0-sources.jar"/>
<classpathentry kind="lib" path="src/commons-collections-2.1.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
采用DBCP的连接池获取数据源:
可能必须jar文件为上面红色jar
备注:commons-collections如果高版本发生错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/CursorableLinkedList
at org.apache.commons.pool.impl.GenericObjectPool.<init>(GenericObjectPool.java:392)
at org.apache.commons.pool.impl.GenericObjectPool.<init>(GenericObjectPool.java:258)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:795)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:72)
at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession(DefaultSqlSessionFactory.java:32)
at com.vnvtrip.search.ibatis.utils.BaseIBatisDAO.getSqlSession(BaseIBatisDAO.java:16)
at com.vnvtrip.search.ibatis.blog.dao.BlogDAO.findById(BlogDAO.java:30)
at com.vnvtrip.search.ibatis.blog.test.BlogTest.main(BlogTest.java:14)
必须采用低版本 src/commons-collections-2.1.jar
如果采用IBatis3.0使用xml配置映射文件那么可以不用写对应的映射类XXX-Mapper:
本节采用xml配置,下节采用注解映射Mapper类。
driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/search
username=root
password=123456
Blog.xml其实是一个sql映射文件。
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="BlogMapper">
<select id="findById" parameterType="java.lang.Integer" resultType="Blog">
select * from Blog where blogid =#{blogid}#
</select>
<delete id="deleteById" parameterType="java.lang.Integer">
delete Blog where blogid =#{blogid}#
</delete>
<update id="updateBlog" parameterType="Blog">
update Blog set author=#{author}#,subject=#{subject}#,content=#{content}#
, publishTime=#{publishTime}# where blogid=#{blogid}
</update>
<insert id="addBlog" parameterType="Blog">
insert into Blog(author,subject,content, publishTime,blogid)
values(#{author}#,#{subject}#,#{content}#,#{publishTime}#,#{blogid})
</insert>
<select id="findAll" resultType="java.util.List">
select * from Blog
</select>
</mapper>
IBatis的全局配置文件类:
sql-mapper.xml
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<typeAliases>
<typeAlias type="com.vnvtrip.search.ibatis.blog.model.Blog" alias="Blog"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="Blog.xml"/>
</mappers>
</configuration>
Blog类:
package com.vnvtrip.search.ibatis.blog.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
*
* @author longgangbai
*
*/
@Entity
@Table(name = "blog", catalog = "search")
public class Blog implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
// Fields
@Id
@GeneratedValue(generator = "autoincrement", strategy = GenerationType.AUTO)
private Integer blogid;
private String author;
private String subject;
private String content;
private String publishTime;
// Constructors
/** default constructor */
public Blog() {
}
/** minimal constructor */
public Blog(Integer blogid, String author) {
this.blogid = blogid;
this.author = author;
}
/** full constructor */
public Blog(Integer blogid, String author, String subject, String content,
String publishTime) {
this.blogid = blogid;
this.author = author;
this.subject = subject;
this.content = content;
this.publishTime = publishTime;
}
// Property accessors
@Id
@Column(name = "blogid", nullable = false)
public Integer getBlogid() {
return this.blogid;
}
public void setBlogid(Integer blogid) {
this.blogid = blogid;
}
@Column(name = "author", nullable = false, length = 25)
public String getAuthor() {
return this.author;
}
public void setAuthor(String author) {
this.author = author;
}
@Column(name = "subject", length = 50)
public String getSubject() {
return this.subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@Column(name = "content", length = 500)
public String getContent() {
return this.content;
}
public void setContent(String content) {
this.content = content;
}
@Column(name = "publishTime", length = 25)
public String getPublishTime() {
return this.publishTime;
}
public void setPublishTime(String publishTime) {
this.publishTime = publishTime;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((author == null) ? 0 : author.hashCode());
result = prime * result + ((blogid == null) ? 0 : blogid.hashCode());
result = prime * result + ((content == null) ? 0 : content.hashCode());
result = prime * result
+ ((publishTime == null) ? 0 : publishTime.hashCode());
result = prime * result + ((subject == null) ? 0 : subject.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Blog other = (Blog) obj;
if (author == null) {
if (other.author != null)
return false;
} else if (!author.equals(other.author))
return false;
if (blogid == null) {
if (other.blogid != null)
return false;
} else if (!blogid.equals(other.blogid))
return false;
if (content == null) {
if (other.content != null)
return false;
} else if (!content.equals(other.content))
return false;
if (publishTime == null) {
if (other.publishTime != null)
return false;
} else if (!publishTime.equals(other.publishTime))
return false;
if (subject == null) {
if (other.subject != null)
return false;
} else if (!subject.equals(other.subject))
return false;
return true;
}
}
IbatisSessionFactory类:一个类似创建类似Hibernate的HibernateSessionFactoryUtils的类。
注意有颜色部分的代码:
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.TransactionIsolationLevel;
/**
*
* @author longgangbai
*
*/
public class IbatisSessionFactory implements SqlSessionFactory{
/** 根据参数得到某个具体的iBatis数据源工厂实例 */
public static SqlSessionFactory getInstance(){
if(sqlSessionFactory == null)
{
initSqlSessionFactory();
}
return sqlSessionFactory;
}
private static void initSqlSessionFactory() {
String resource = "sql-mapper.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
sqlSessionFactory = builder.build(reader);
} catch (IOException e) {
System.out.println("创建iBATIS数据工厂时出现错误!");
e.printStackTrace();
}
}
// 真正“做事”的实例
private static SqlSessionFactory sqlSessionFactory = null;
public Configuration getConfiguration() {
return sqlSessionFactory.getConfiguration();
}
public SqlSession openSession() {
return sqlSessionFactory.openSession();
}
public SqlSession openSession(boolean arg0) {
return sqlSessionFactory.openSession(arg0);
}
public SqlSession openSession(Connection arg0) {
return sqlSessionFactory.openSession(arg0);
}
public SqlSession openSession(ExecutorType arg0) {
return sqlSessionFactory.openSession(arg0);
}
public SqlSession openSession(ExecutorType arg0, boolean arg1) {
return sqlSessionFactory.openSession(arg0, arg1);
}
public SqlSession openSession(ExecutorType arg0, Connection arg1) {
return sqlSessionFactory.openSession(arg0, arg1);
}
@Override
public SqlSession openSession(TransactionIsolationLevel arg0) {
return sqlSessionFactory.openSession(arg0);
}
@Override
public SqlSession openSession(ExecutorType arg0,
TransactionIsolationLevel arg1) {
return sqlSessionFactory.openSession(arg0,arg1);
}
}
import java.util.List;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
/**
*
* @author longgangbai
*
*/
public abstract class BaseIBatisDAO {
/**
*
* @return
*/
public SqlSession getSqlSession()
{
return IbatisSessionFactory.getInstance().openSession();
}
/**
* 封装好了的通用ibatis分页查询方法,只要配置好了Mapper文件,可进行任何分页查询
* @param statement 一般为xxxMapper.ooo(ooo为select标签的id值),参考UserMapper.xml
* @param paramMap 一般是由页面来的查询参数
* @param pageIndex 当前页码
* @param pageSize 每页记录数
* @return
*/
public PageBean queryByIbatis(String statement, Object paramMap, int pageIndex, int pageSize) {
SqlSession sqlSession = IbatisSessionFactory.getInstance().openSession();
PageBean pageBean = new PageBean();
int offset = PageBean.getOffset(pageIndex, pageSize);
try {
int rowCount = sqlSession.selectList(statement, paramMap).size();
int totalPage = ( rowCount + pageSize - 1 ) / pageSize ;
List resultList =sqlSession.selectList(statement, paramMap, new RowBounds(offset, pageSize));
pageBean.setPageIndex(pageIndex);
pageBean.setRowCount(rowCount);
pageBean.setTotalPage(totalPage);
pageBean.setResultList(resultList);
pageBean.setPageSize(pageSize);
pageBean.init();
} finally {
sqlSession.close();
}
return pageBean;
}
}
package com.vnvtrip.search.ibatis.utils; import java.util.List; /** * * @author longgangbai * */ public class PageBean { /** * 计算所取数据集的偏移量 * @param pageIndex * @param pageSize * @return 数据偏移量 */ public static int getOffset(int pageIndex, int pageSize) { return pageSize*(pageIndex - 1); } private List resultList; // 要返回的记录 private int pageIndex; // 当前页码 private int pageSize; // 每页记录数 private int rowCount; // 总记录数 private int totalPage; // 总页数 private boolean isFirstPage; private boolean isLastPage; private boolean hasPreviousPage; private boolean hasNextPage; public void init(){ isFirstPage = pageIndex == 1?true:false; isLastPage = pageIndex == totalPage?true:false; hasPreviousPage = !isFirstPage; hasNextPage = !isLastPage; } public int getPageIndex() { return pageIndex; } public void setPageIndex(int pageIndex) { this.pageIndex = pageIndex; } public boolean isHasNextPage() { return hasNextPage; } public boolean isHasPreviousPage() { return hasPreviousPage; } public boolean isFirstPage() { return isFirstPage; } public boolean isLastPage() { return isLastPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public List getResultList() { return resultList; } public void setResultList(List resultList) { this.resultList = resultList; } public int getRowCount() { return rowCount; } public void setRowCount(int rowCount) { this.rowCount = rowCount; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } }
在BlogDAO中使用如下:
/**
* 根据主键查询
*/
@Override
public Blog findById(Integer id) {
return (Blog)this.getSqlSession().selectOne("BlogMapper.findById",id);
}
- IBatis3.0.rar (3.3 MB)
- 下载次数: 698
评论
貌似当前Spring2.5.6和IBatis3.0没有集成(这也许可能是你集成一直报错的原因吧),如需要集成自己实现相关的几个类即可。IBatis2.0和Spring2.5.6是已经可以集成的不需要自己编辑集成的回调类等。
@Column(name = "author", nullable = false, length = 25)
列属性设置如天女散花,分散到了DataObject各个属性上,可代码易读性(Readability)维护性(Maintanability)大大降低.
另外, 分页控制还要自己完成,IBatis 3 在这一点上仍然不够完善。
针对@Column的注解可以省略,采用默认,并不是必须的哦,怎么能说“JPA 的实体类Annotation对于代码过于倾入”,有点不解??
@Column(name = "author", nullable = false, length = 25)
列属性设置如天女散花,分散到了DataObject各个属性上,可代码易读性(Readability)维护性(Maintanability)大大降低.
另外, 分页控制还要自己完成,IBatis 3 在这一点上仍然不够完善。
发表评论
-
看看mybatis 源代码
2013-09-10 17:21 34971.SqlSessionFactory ... -
【转】在项目中使用多个数据源-多sessionFactory方案
2013-05-10 16:30 3131适用范围:适合SSH架构访问多个数据库, ... -
MyBatis的几种批量操作
2013-03-20 23:03 150953MyBatis中批量插入 方法一: <in ... -
[转]Spring+iBatis+JOTM实现JTA事务
2013-03-17 22:51 3059Spring+iBatis+JOTM实现JTA事务 ... -
ibatis3的项目使用的Mapping文件使用总结参考(二)
2011-11-26 13:27 3930MyBatis中文学习网站的 http://www.myba ... -
ibatis3的项目使用的Mapping文件使用总结参考(一)
2011-11-25 18:53 2668以前用过ibatis2,但是听说ibatis3有较大的性能提升 ... -
Quartz的信息持久化
2011-07-15 00:05 4444针对项目中的定时任务执行过程中,程序突然 ... -
IBatis框架的一些问题的扩展(四)
2010-10-07 14:10 2704由于Ibatis的分页采用逻辑分页通过针对Ibatis分页的特 ... -
IBatis框架的一些问题的扩展(三)
2010-10-07 13:59 2485项目采用的事务由于IBatis的事务 ... -
IBatis框架的一些问题的扩展(二)
2010-10-07 13:05 2224项目中由于Ibatis自身的缓存的鸡 ... -
IBatis框架的一些问题的扩展(一)
2010-10-07 12:58 4796今年开发的项目XX项目中采用IBati ... -
IBatis3.0 中一点典型特性
2010-02-22 14:18 2302在IBatis2.X中也有一些类似的特性,这里仅仅发表一些IB ... -
IBatis3.0 注解配置方式的应用(JPA+IBatis3.0应用注解版)
2010-02-22 11:06 3004其实使用IBatis3.0注解,相等于把IB ... -
Spring2.5+IBatis+JPA+Compass 注解应用
2010-02-21 15:36 3090新年伊始,开始复习一些旧的知识: Spring 2.5+Ib ... -
ibatis_2.3源码中insert&update&query垂直浅析
2009-05-01 10:53 3774题记: 废话不多,慢慢写吧 写的可能 ...
相关推荐
这需要开发者对Ibatis3的XML配置、JPA的注解以及Spring的整合有一定了解。通过深入学习和实践,你可以在项目中灵活运用这些技术,提升开发效率。 在实际项目中,可以进一步研究如何将Ibatis3的动态SQL与JPA的查询...
然而,值得注意的是,虽然这种集成方式降低了开发难度,但随着项目的复杂度增加,管理和维护这样的系统可能会变得复杂,因此在大型项目中,可能需要考虑使用更现代的框架,如Spring Boot和Spring Data JPA等。
《深入解析:iBatis2与Spring的整合应用》 在现代企业级应用开发中,iBatis2和...在实际项目中,根据具体需求,还可以进一步优化配置,如使用MyBatis3代替iBatis2,或者采用Spring Data JPA等更高级的持久层解决方案。
1. **配置文件**:如struts.xml、spring-servlet.xml、ibatis的sqlMapConfig.xml等,这些文件分别定义了Struts2、Spring和iBatis的配置信息。 2. **Action类**:实现业务逻辑,通常继承自Struts2的ActionSupport类,...
Ibatis 是一款优秀的Java持久层框架,它与Hibernate和JPA等ORM框架不同,Ibatis 提供了更为灵活的SQL映射机制,允许开发者直接编写SQL语句,从而更好地控制查询过程,提高性能。在本资源"ibatis2.3.4.rar"中,包含了...
iBATIS的目标是简化Java应用程序中的数据访问,通过XML或注解配置将SQL语句与Java对象绑定。 2. **工作原理** iBATIS的核心概念是SqlMap,它是一个XML配置文件,包含了SQL语句和结果映射。当Java对象调用方法时,...
Ibatis允许开发者在XML配置文件或注解中编写SQL,通过映射接口方法,实现了数据访问与业务逻辑的解耦。在Spring+Struts+Ibatis的组合中,Ibatis作为数据访问层,处理与数据库的交互,Spring通过 ...
- **JPA**(Java Persistence API)是一种规范,旨在为Java应用程序提供一种标准的方式来处理对象持久化问题,尤其关注于ORM(Object-Relational Mapping,对象关系映射)场景。它的提出背景主要是为了解决Java开发...
iBatis的核心是SqlMapConfig.xml配置文件,其中包含了数据源、事务管理器等配置。 2. **Spring简介** Spring是一个全面的Java企业应用开发框架,提供了依赖注入(DI)、面向切面编程(AOP)等核心功能,还有对各种...
在JSF环境中,Spring可以作为服务层的实现,通过`ContextLoaderListener`配置在`web.xml`中,以便在Web应用启动时加载Spring上下文。 JPA作为Java EE的一部分,定义了ORM的标准接口,允许开发者以统一的方式来操作...
在Spring Boot集成MyBatis的过程中,`mapper.xml`配置文件起着至关重要的作用。它用于定义SQL语句,实现数据库的CRUD操作。本示例将深入探讨如何配置`mapper.xml`,并提供新增、修改、删除、查询及分页查询的实践...
"Ibatis 与 Spring3 整合"这一主题,涉及到的是两个知名Java框架——Ibatis(一个轻量级的持久层框架)和Spring(一个全面的企业级应用框架)的协同工作。下面我们将深入探讨这一整合过程中的关键知识点。 Ibatis ...
Webwork2、Spring、Ibatis和Hibernate是四个在Java开发中广泛应用的开源框架,它们各自在Web应用的不同层面上发挥着关键作用。本教程旨在帮助开发者深入理解和掌握这些框架的集成使用,以便构建高效、可维护的Web...
Maven框架项目该项目不再更新维护,请移步该项目基于maven3.0构建的,项目中融合了Struts1 , Struts2 , Spring , SpringMVC , Hibernate , Ibatis , MyBatis , Spring Data JPA , Spring JDBC , Spring DWR...
2. **SqlMapConfig.xml**:这是iBatis的主配置文件,它包含了数据库连接池、事务管理器和Mapper XML文件的位置。通过这个文件,iBatis可以知道如何连接到数据库,并找到所有的SQL映射文件。 3. **Mapper接口**:...
1. **配置文件**:如`struts.xml`(Struts2配置)、`spring-context.xml`(Spring配置)、`sqlMapConfig.xml`(iBatis配置)等,定义了各个框架的组件和行为。 2. **模型类(Model)**:Java类,代表业务对象和数据...
Ibatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者Java注解中,从而提供了灵活的数据访问方式。在Ibatis中,事务管理是至关重要的,因为它确保了数据库操作的一致性和可靠性。 事务...
Spring 框架作为一个流行的 Java Web 应用程序框架,提供了许多灵活的配置和集成功能,其中包括对 iBatis 的集成。iBatis 是一个流行的持久层框架,提供了高效的数据访问和映射功能。在本篇文章中,我们将详细介绍...
- **标准性**:JPA是Java EE标准的一部分,而Hibernate则是一种具体的实现方式。使用JPA可以更好地与其他Java EE技术集成。 - **兼容性**:使用JPA接口进行编程,可以轻松切换到其他持久化层实现,如TopLink或iBatis...
4. **配置iBatis**:在SqlMapConfig.xml文件中配置数据源、事务管理器和Mapper文件。Mapper文件是SQL语句的存放地,通过XML标签定义SQL和结果映射。 5. **编写Action类**:在Struts中,Action类是处理用户请求的...