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类。
<!DOCTYPE mapper?
?
?
IBatis的全局配置文件类:
sql-mapper.xml
?
<!DOCTYPE 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.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);
??? }