`
longgangbai
  • 浏览: 7339388 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IBatis3.0 xml配置方式的应用(JPA+IBatis3.0应用)

阅读更多

   最近网上出现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类。

jdbc。properties文件如下


driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/search
username=root
password=123456

 Blog.xml其实是一个sql映射文件。

 

 
<?xml version="1.0" encoding="UTF-8"?>
<!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

 

写道
<?xml version="1.0" encoding="UTF-8"?>
<!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的类。

 

注意有颜色部分的代码:

 

写道
package com.vnvtrip.search.ibatis.utils;

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);
}
}

 

写道
package com.vnvtrip.search.ibatis.utils;

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);
    }

分享到:
评论
4 楼 longgangbai 2010-04-08  
lionhome 写道
做了两年的.net项目,现在想转向java。最近在做一个练习项目。在集成spring和ibatis遇到问题了,spring版本为2.5.6,iBATIS 3 beta 10 怎么都集成不好,tomat启动的时候就通不过,找不到iBATIS,换成iBATIS 2 就行了 ,不知道怎么回事,调查了半天也没解决,但到时包的兼容性问题。郁闷中

貌似当前Spring2.5.6和IBatis3.0没有集成(这也许可能是你集成一直报错的原因吧),如需要集成自己实现相关的几个类即可。IBatis2.0和Spring2.5.6是已经可以集成的不需要自己编辑集成的回调类等。
3 楼 lionhome 2010-04-08  
做了两年的.net项目,现在想转向java。最近在做一个练习项目。在集成spring和ibatis遇到问题了,spring版本为2.5.6,iBATIS 3 beta 10 怎么都集成不好,tomat启动的时候就通不过,找不到iBATIS,换成iBATIS 2 就行了 ,不知道怎么回事,调查了半天也没解决,但到时包的兼容性问题。郁闷中
2 楼 longgangbai 2010-02-23  
raymond2006k 写道
一直觉得 JPA 的实体类Annotation对于代码过于倾入,例如:
@Column(name = "author", nullable = false, length = 25)
列属性设置如天女散花,分散到了DataObject各个属性上,可代码易读性(Readability)维护性(Maintanability)大大降低.

另外, 分页控制还要自己完成,IBatis 3 在这一点上仍然不够完善。



针对@Column的注解可以省略,采用默认,并不是必须的哦,怎么能说“JPA 的实体类Annotation对于代码过于倾入”,有点不解??
1 楼 raymond2006k 2010-02-22  
一直觉得 JPA 的实体类Annotation对于代码过于倾入,例如:
@Column(name = "author", nullable = false, length = 25)
列属性设置如天女散花,分散到了DataObject各个属性上,可代码易读性(Readability)维护性(Maintanability)大大降低.

另外, 分页控制还要自己完成,IBatis 3 在这一点上仍然不够完善。

相关推荐

    ibatis3中使用jpa的方法进行查询

    这需要开发者对Ibatis3的XML配置、JPA的注解以及Spring的整合有一定了解。通过深入学习和实践,你可以在项目中灵活运用这些技术,提升开发效率。 在实际项目中,可以进一步研究如何将Ibatis3的动态SQL与JPA的查询...

    Struts+Spring+Ibatis整合的Jar包

    然而,值得注意的是,虽然这种集成方式降低了开发难度,但随着项目的复杂度增加,管理和维护这样的系统可能会变得复杂,因此在大型项目中,可能需要考虑使用更现代的框架,如Spring Boot和Spring Data JPA等。

    ibatis2+spring

    《深入解析:iBatis2与Spring的整合应用》 在现代企业级应用开发中,iBatis2和...在实际项目中,根据具体需求,还可以进一步优化配置,如使用MyBatis3代替iBatis2,或者采用Spring Data JPA等更高级的持久层解决方案。

    struts2+spring2.5+ibatis

    1. **配置文件**:如struts.xml、spring-servlet.xml、ibatis的sqlMapConfig.xml等,这些文件分别定义了Struts2、Spring和iBatis的配置信息。 2. **Action类**:实现业务逻辑,通常继承自Struts2的ActionSupport类,...

    ibatis2.3.4.rar

    Ibatis 是一款优秀的Java持久层框架,它与Hibernate和JPA等ORM框架不同,Ibatis 提供了更为灵活的SQL映射机制,允许开发者直接编写SQL语句,从而更好地控制查询过程,提高性能。在本资源"ibatis2.3.4.rar"中,包含了...

    ibatis

    iBATIS的目标是简化Java应用程序中的数据访问,通过XML或注解配置将SQL语句与Java对象绑定。 2. **工作原理** iBATIS的核心概念是SqlMap,它是一个XML配置文件,包含了SQL语句和结果映射。当Java对象调用方法时,...

    spring+struts+ibatis框架搭建

    Ibatis允许开发者在XML配置文件或注解中编写SQL,通过映射接口方法,实现了数据访问与业务逻辑的解耦。在Spring+Struts+Ibatis的组合中,Ibatis作为数据访问层,处理与数据库的交互,Spring通过 ...

    开发JPA应用.pdf

    - **JPA**(Java Persistence API)是一种规范,旨在为Java应用程序提供一种标准的方式来处理对象持久化问题,尤其关注于ORM(Object-Relational Mapping,对象关系映射)场景。它的提出背景主要是为了解决Java开发...

    Spring整合iBatis

    iBatis的核心是SqlMapConfig.xml配置文件,其中包含了数据源、事务管理器等配置。 2. **Spring简介** Spring是一个全面的Java企业应用开发框架,提供了依赖注入(DI)、面向切面编程(AOP)等核心功能,还有对各种...

    JSF+Spring+JPA(Hibernate实现)的环境搭建.doc

    在JSF环境中,Spring可以作为服务层的实现,通过`ContextLoaderListener`配置在`web.xml`中,以便在Web应用启动时加载Spring上下文。 JPA作为Java EE的一部分,定义了ORM的标准接口,允许开发者以统一的方式来操作...

    springboot mybatis mapper.xml 配置

    在Spring Boot集成MyBatis的过程中,`mapper.xml`配置文件起着至关重要的作用。它用于定义SQL语句,实现数据库的CRUD操作。本示例将深入探讨如何配置`mapper.xml`,并提供新增、修改、删除、查询及分页查询的实践...

    ibatis 与spring3整合

    "Ibatis 与 Spring3 整合"这一主题,涉及到的是两个知名Java框架——Ibatis(一个轻量级的持久层框架)和Spring(一个全面的企业级应用框架)的协同工作。下面我们将深入探讨这一整合过程中的关键知识点。 Ibatis ...

    Webwork2+Spring+Ibatis+Hibernate框架中文教程

    Webwork2、Spring、Ibatis和Hibernate是四个在Java开发中广泛应用的开源框架,它们各自在Web应用的不同层面上发挥着关键作用。本教程旨在帮助开发者深入理解和掌握这些框架的集成使用,以便构建高效、可维护的Web...

    maven-framework-project:基于maven的多框架和多视图融合技术(Struts1,Struts2,Spring,SpringMVC,Hibernate,Ibatis,MyBatis,Spring Data JPA,DWR)

    Maven框架项目该项目不再更新维护,请移步该项目基于maven3.0构建的,项目中融合了Struts1 , Struts2 , Spring , SpringMVC , Hibernate , Ibatis , MyBatis , Spring Data JPA , Spring JDBC , Spring DWR...

    ibatis jar包

    2. **SqlMapConfig.xml**:这是iBatis的主配置文件,它包含了数据库连接池、事务管理器和Mapper XML文件的位置。通过这个文件,iBatis可以知道如何连接到数据库,并找到所有的SQL映射文件。 3. **Mapper接口**:...

    spring2.0+struts2.0+ibatis2.3完整整和

    1. **配置文件**:如`struts.xml`(Struts2配置)、`spring-context.xml`(Spring配置)、`sqlMapConfig.xml`(iBatis配置)等,定义了各个框架的组件和行为。 2. **模型类(Model)**:Java类,代表业务对象和数据...

    Ibatis 事务处理

    Ibatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者Java注解中,从而提供了灵活的数据访问方式。在Ibatis中,事务管理是至关重要的,因为它确保了数据库操作的一致性和可靠性。 事务...

    在Spring使用iBatis及配置讲解

    Spring 框架作为一个流行的 Java Web 应用程序框架,提供了许多灵活的配置和集成功能,其中包括对 iBatis 的集成。iBatis 是一个流行的持久层框架,提供了高效的数据访问和映射功能。在本篇文章中,我们将详细介绍...

    JSF+Spring+JPA(Hibernate实现)的环境搭建

    - **标准性**:JPA是Java EE标准的一部分,而Hibernate则是一种具体的实现方式。使用JPA可以更好地与其他Java EE技术集成。 - **兼容性**:使用JPA接口进行编程,可以轻松切换到其他持久化层实现,如TopLink或iBatis...

    ▲Struts+Spring和iBatis整合

    4. **配置iBatis**:在SqlMapConfig.xml文件中配置数据源、事务管理器和Mapper文件。Mapper文件是SQL语句的存放地,通过XML标签定义SQL和结果映射。 5. **编写Action类**:在Struts中,Action类是处理用户请求的...

Global site tag (gtag.js) - Google Analytics