第一步:右键项目->MyEclipse->添加Hibernate组件,指定数据库连接配置如下(src/hibernate.cfg.xml)
MySQL对连接的有效期是28800s,一个连接8小时没任何操作就会自动断开;而hibernate的默认连接池不对链接的状态进行检查,所以超过8小时候链接就不在可用,从而导致查询出错;虽然可以增大MySQL的连接有效时间,但是不是终极解决办法。Hibernate共支持5种连接池,可以用c3p0替换默认的连接池可以有很好的效果,此外proxool也是不错的选择,在稳定性、易用性以效率方面都比较优越。
/p>
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
update
org.hibernate.dialect.MySQLDialect
jdbc:mysql://127.0.0.1:3306/test
org.hibernate.connection.C3P0ConnectionProvider
20
5
120
100
1800
2
true
3600
false
false
root
rootpwd
com.mysql.jdbc.Driver
tiaowuban
src/applicationContext.xml自动添加配置如下,需要将mysql-connector-{version}-java-bin.jar添加到项目的classpath中
第二步:创建ORM映射(可使用MyEclipse Hibernate Tool生成持久化类,工具可以自行处理表内自增主键,表间的外键关联,一对多/一对一/多对一/多对多等关系。,可参照这里),src/com/smartecs/dao里的文件如下
packagecom.smartecs.dao;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;
@Entitypublic classAccount {
@Id
@GeneratedValueprivate intid;privateString username;privateString password;protectedAccount() {
}publicAccount(String username, String password) {super();this.username =username;this.password =password;
}public intgetId() {returnid;
}public void setId(intid) {this.id =id;
}publicString getUsername() {returnusername;
}public voidsetUsername(String username) {this.username =username;
}publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}
}
Account.hbm.xml文件如下
/p>
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
第三步:测试代码:
Session session =HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Account account= new Account("ciaos", "ciaospwd");try{
session.save(account);
tx.commit();
}catch(Exception e) {
tx.rollback();
e.printStackTrace();
}finally{
session.close();
}
附,Hibernate Tool反转设置如下(使用xml映射方式)
如果hibernate 3支持注解方式映射数据库,不需要维护xml文件,方便很多(Spring3.1.1+Hibernate3.3.2测试通过,Spring3.0.5未测试通过,提示AnnotationSessionFactoryBean的属性configurationClass配置错误,不过Hibernate4已经废弃掉此属性,就无所谓了)
src/applicationContext.xml配置如下(更换bean为annotation):
1
10
604800
src/hibernate.cfg.xml将更换为
-->
添加依赖库(hibernate-annotations.jar,hibernate-commons-annotations.jar,ejb3-persistence.jar,hibernate-core.jar),反转后数据表实体映射关系直接在POJO里面组织了。注解方式的反转配置如下:
hibernate 3增加DAO层封装了实体类的基本操作(功能比较弱,可以通过泛型扩展增加功能),使用起来更加方便,反转时需要配置如下(注意选择默认DAO),代码中会生成BaseHibernateDAO父类封装连接获取方法。
TbAccountDAO adao = newTbAccountDAO();
TbAccount account= adao.findById(1);
BaseHibernateDAO及接口方法如下:
packagecom.tiaowuban.api.ndao;importorg.hibernate.Session;/*** Data access interface for domain model
*@authorMyEclipse Persistence Tools*/
public interfaceIBaseHibernateDAO {publicSession getSession();
}packagecom.tiaowuban.api.ndao;importcom.tiaowuban.api.dao.HibernateSessionFactory;importjavax.persistence.Entity;importorg.hibernate.Session;/*** Data access object (DAO) for domain model
*@authorMyEclipse Persistence Tools*/@Entitypublic class BaseHibernateDAO implementsIBaseHibernateDAO {publicSession getSession() {returnHibernateSessionFactory.getSession();
}
}
如下可通过泛型扩展增加多个属性查询方法(可举一反三增加删除,搜索等更丰富的方法)
packagecom.tiaowuban.api.dao;importjava.util.List;importorg.hibernate.Session;/*** Data access interface for domain model
*@authorMyEclipse Persistence Tools
*@param*/
public interface IBaseHibernateDAO{publicSession getSession();public abstract ListfindByPropertys(String[] propertyNames,Object[] values);/*** 通过多个属性查找,并分页,
* 属性名称数组和属性值数组的序列要对应
*
*@parampropertyNames 属性名称数组
*@paramvalues 属性值数组
*@parampage 页码
*@parampageSize 每页内容条数
*@return
*/
public List findByPropertys(String[] propertyNames,Object[] values,int page,intpageSize);/*** 通过属性查找,并分页,
* 属性名称数组和属性值数组的序列要对应
*
*@parampropertyNames 属性名称
*@paramvalues 属性值
*@parampage 页码
*@parampageSize 每页内容条数
*@return
*/
public List findByProperty(String propertyName,Object value,int page,intpageSize);
}packagecom.tiaowuban.api.dao;importjava.util.List;importorg.hibernate.Query;importorg.hibernate.Session;importorg.springframework.transaction.annotation.Transactional;/*** Data access object (DAO) for domain model
*@authorMyEclipse Persistence Tools*/@Transactionalpublic class BaseHibernateDAO implements IBaseHibernateDAO{publicSession getSession() {returnHibernateSessionFactory.getSession();
}private ClasspersistentClass;
@SuppressWarnings("unchecked")publicBaseHibernateDAO()
{//获取持久化对象的类型
this.persistentClass = (Class)getClass();
}public ClassgetPersistentClass()
{returnpersistentClass;
}/*** 通过多个属性组合查询
*
*@parampropertyNames
* 属性名称数组
*@paramvalues
* 对应于propertyNames的值 return 匹配的结果*/
public ListfindByPropertys(String[] propertyNames, Object[] values)
{int i = 0;
StringBuffer strBuffer= newStringBuffer();
strBuffer.append("from " + getPersistentClass().getName().replaceAll("DAO$", ""));
strBuffer.append(" as model where");for (i = 0; i < propertyNames.length; i++)
{if (i != 0)
strBuffer.append(" and");
strBuffer.append(" model.");
strBuffer.append(propertyNames[i]);
strBuffer.append("=");
strBuffer.append("? ");
}
String queryString=strBuffer.toString();
System.err.println(queryString);
Query query=getSession().createQuery(queryString);for (i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}returnquery.list();
}/*** 通过属性查找并分页
*
*@parampropertyName
* 属性名称
*@paramvalue
* 属性值
*@parampage
* 页数
*@parampageSize
* 每页显示条数*/
public List findByProperty(String propertyName, Object value, intpage,intpageSize)
{return this.findByPropertys(newString[]
{
propertyName
},newObject[]
{
value
}, page, pageSize);
}/*** 通过多个属性组合查询
*
*@parampropertyNames
* 属性名称数组
*@paramvalues
* 对应于propertyNames的值
*@parampage
* 页数
*@parampageSize
* 每页显示数 return 匹配的结果 return 匹配的结果*/
public ListfindByPropertys(String[] propertyNames, Object[] values,int page, intpageSize)
{
StringBuffer strBuffer= newStringBuffer();
strBuffer.append("from " +getPersistentClass().getName());
strBuffer.append(" as model where");for (int i = 0; i < propertyNames.length; i++)
{if (i != 0)
strBuffer.append(" and");
strBuffer.append(" model.");
strBuffer.append(propertyNames[i]);
strBuffer.append("=");
strBuffer.append("? ");
}
String queryString=strBuffer.toString();int firstResult = (page - 1) *pageSize;
Query query= this.getSession().createQuery(queryString);
query.setFirstResult(firstResult);
query.setMaxResults(pageSize);for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}returnquery.list();
}
}
使用方法如下
TbAccountDAO adao = newTbAccountDAO();
List accountlist = adao.findByPropertys(new String[]{"id","username"}, new Object[]{3,"ciaos"});
反转配置如下:
数据库中表结构如下:
CREATE TABLE`account` (
`id`int(11) NOT NULLAUTO_INCREMENT,
`username`varchar(100) DEFAULT NULL,
`passwd`varchar(100) DEFAULT NULL,PRIMARY KEY(`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1