配置hibernate数据库连接
第一步:右键项目->MyEclipse->添加Hibernate组件,指定数据库连接配置如下(src/hibernate.cfg.xml)
MySQL对连接的有效期是28800s,一个连接8小时没任何操作就会自动断开;而hibernate的默认连接池不对链接的状态进行检查,所以超过8小时候链接就不在可用,从而导致查询出错;虽然可以增大MySQL的连接有效时间,但是不是终极解决办法。Hibernate共支持5种连接池,可以用c3p0替换默认的连接池可以有很好的效果,此外proxool也是不错的选择,在稳定性、易用性以效率方面都比较优越。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration> <session-factory>
<property name="hbm2ddl.auto">update</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://127.0.0.1:3306/test
</property>
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">1800</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<property name="hibernate.c3p0.timeout">3600</property>
<property name="hibernate.cache.use_second_level_cache">
false
</property> <property name="connection.autocommit">false</property>
<property name="connection.username">root</property>
<property name="connection.password">rootpwd</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">tiaowuban</property>
<mapping resource="com/tiaowuban/dao/Account.hbm.xml" /> </session-factory> </hibernate-configuration>
src/applicationContext.xml自动添加配置如下,需要将mysql-connector-{version}-java-bin.jar添加到项目的classpath中
<?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-3.0.xsd"> <bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>
</beans>
第二步:创建ORM映射(可使用MyEclipse Hibernate Tool生成持久化类,工具可以自行处理表内自增主键,表间的外键关联,一对多/一对一/多对一/多对多等关系。,可参照这里),src/com/smartecs/dao里的文件如下
package com.smartecs.dao; import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; @Entity
public class Account {
@Id
@GeneratedValue
private int id; private String username; private String password; protected Account() {
}
public Account(String username, String password) {
super();
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Account.hbm.xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.smartecs.dao.Account" table="account">
<!-- 必须先定义<id>元素,后定义<property>元素 -->
<id name="id" type="java.lang.Integer">
<column name="id" />
<!-- 主键的生成方式 -->
<generator class="increment" />
</id>
<!-- name属性,类型为String,对应的数据库中的列为name,长度为20 -->
<property name="username" type="java.lang.String">
<column name="username" length="100" />
</property>
<property name="password" type="java.lang.String">
<column name="passwd" length="100" />
</property>
</class>
</hibernate-mapping>
第三步:测试代码:
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):
<?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-3.1.xsd"> <bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
<property name="mappingResources">
<list></list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dbcp.whenExhaustedAction">1</prop>
<prop key="hibernate.dbcp.maxIdle">10</prop>
<prop key="hibernate.dbcp.maxWait">604800</prop>
</props>
</property>
</bean>
</beans>
src/hibernate.cfg.xml将<mapping resource>更换为<mapping class>
<mapping resource="com/tiaowuban/dao/Account.hbm.xml" />
-->
<mapping class="com.tiaowuban.api.dao.Account" />
添加依赖库(hibernate-annotations.jar,hibernate-commons-annotations.jar,ejb3-persistence.jar,hibernate-core.jar),反转后数据表实体映射关系直接在POJO里面组织了。注解方式的反转配置如下:
hibernate 3增加DAO层封装了实体类的基本操作(功能比较弱,可以通过泛型扩展增加功能),使用起来更加方便,反转时需要配置如下(注意选择默认DAO),代码中会生成BaseHibernateDAO父类封装连接获取方法。
TbAccountDAO adao = new TbAccountDAO();
TbAccount account = adao.findById(1);
BaseHibernateDAO及接口方法如下:
package com.tiaowuban.api.ndao; import org.hibernate.Session; /**
* Data access interface for domain model
* @author MyEclipse Persistence Tools
*/
public interface IBaseHibernateDAO {
public Session getSession();
} package com.tiaowuban.api.ndao; import com.tiaowuban.api.dao.HibernateSessionFactory;
import javax.persistence.Entity;
import org.hibernate.Session; /**
* Data access object (DAO) for domain model
* @author MyEclipse Persistence Tools
*/
@Entity
public class BaseHibernateDAO implements IBaseHibernateDAO { public Session getSession() {
return HibernateSessionFactory.getSession();
} }
如下可通过泛型扩展增加多个属性查询方法(可举一反三增加删除,搜索等更丰富的方法)
package com.tiaowuban.api.dao; import java.util.List; import org.hibernate.Session; /**
* Data access interface for domain model
* @author MyEclipse Persistence Tools
* @param <T>
*/
public interface IBaseHibernateDAO<T> {
public Session getSession(); public abstract List<T> findByPropertys(String[] propertyNames,Object[] values); /**
* 通过多个属性查找,并分页,
* 属性名称数组和属性值数组的序列要对应
*
* @param propertyNames 属性名称数组
* @param values 属性值数组
* @param page 页码
* @param pageSize 每页内容条数
* @return
*/
public List<T> findByPropertys(String[] propertyNames,Object[] values,int page,int pageSize); /**
* 通过属性查找,并分页,
* 属性名称数组和属性值数组的序列要对应
*
* @param propertyNames 属性名称
* @param values 属性值
* @param page 页码
* @param pageSize 每页内容条数
* @return
*/
public List<T> findByProperty(String propertyName,Object value,int page,int pageSize); } package com.tiaowuban.api.dao; import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.transaction.annotation.Transactional; /**
* Data access object (DAO) for domain model
* @author MyEclipse Persistence Tools
*/
@Transactional
public class BaseHibernateDAO<T> implements IBaseHibernateDAO<T> { public Session getSession() {
return HibernateSessionFactory.getSession();
} private Class<T> persistentClass;
@SuppressWarnings("unchecked")
public BaseHibernateDAO()
{
// 获取持久化对象的类型
this.persistentClass = (Class<T>)getClass();
} public Class<T> getPersistentClass()
{
return persistentClass;
} /**
* 通过多个属性组合查询
*
* @param propertyNames
* 属性名称数组
* @param values
* 对应于propertyNames的值 return 匹配的结果
*/
public List<T> findByPropertys(String[] propertyNames, Object[] values)
{
int i = 0;
StringBuffer strBuffer = new StringBuffer();
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]);
} return query.list();
} /**
* 通过属性查找并分页
*
* @param propertyName
* 属性名称
* @param value
* 属性值
* @param page
* 页数
* @param pageSize
* 每页显示条数
*/
public List<T> findByProperty(String propertyName, Object value, int page,
int pageSize)
{
return this.findByPropertys(new String[]
{
propertyName
}, new Object[]
{
value
}, page, pageSize);
} /**
* 通过多个属性组合查询
*
* @param propertyNames
* 属性名称数组
* @param values
* 对应于propertyNames的值
* @param page
* 页数
* @param pageSize
* 每页显示数 return 匹配的结果 return 匹配的结果
*/
public List<T> findByPropertys(String[] propertyNames, Object[] values,
int page, int pageSize)
{ StringBuffer strBuffer = new StringBuffer();
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]);
} return query.list();
}
}
使用方法如下
TbAccountDAO adao = new TbAccountDAO();
List<TbAccount> accountlist = adao.findByPropertys(new String[]{"id","username"}, new Object[]{3,"ciaos"});
反转配置如下:
数据库中表结构如下:
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`passwd` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
配置hibernate数据库连接的更多相关文章
- 第一次使用并配置Hibernate
1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ...
- Sae配置Java数据库连接
Sae配置Java数据库连接 Sae在Java中配置mysql数据库 >>>>>>>>>>>>>>>>& ...
- 配置Hibernate二级缓存时,不能初始化RegionFactory的解决办法
配置Hibernate 二级缓存时,出现以下bug提示: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&quo ...
- 菜鸟学习Hibernate——配置Hibernate环境
一.概念. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.既然学习Hibernate那么第 ...
- 配置Hibernate二级缓存步骤
配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...
- *IntelliJ IDEA配置Hibernate
为IntelliJ IDEA安装Hibernate插件
- Linux下PHP安装配置MongoDB数据库连接扩展
Web服务器: IP地址:192.168.21.127 PHP安装路径:/usr/local/php 实现目的: 安装PHP的MongoDB数据库扩展,通过PHP程序连接MongoDB数据库 具体操作 ...
- SSH整合,applicationContext.xml中配置hibernate映射文件问题
今天在applicationContext.xml中配置sessionFactory时遇到了各种头疼的问题,现在总结一下: 1.<property name="mappingDirec ...
- Myeclipse新建 配置Hibernate
一.新建一个JAVA项目 二.选中新建的项目单击右键[Add Hibernate Capab-] 三.添加MyEclipse Hiberate Libaries(Hibernate 3.2) 单击[B ...
随机推荐
- spring拦截器的定义
(一).拦截器的定义 1.为什么需要拦截器:在做身份认证或者是进行日志的记录时,我们需要通过拦截器达到我们的目的 2.什么事拦截器:在AOP(Aspect-Oriented Programming)中 ...
- 前自加(++a)与后自加(a++)的差别
自加是自己加1的操作.比如a++ 是a+1 ,变量a变成了 a+1的值. 如果是简单的只做 a++:或者++a的语句,效果是一样的. 但是如果嵌入到复杂的语句中,比如 b = a++: 和 b = + ...
- python 发送安全邮件
用python 写了一个发送邮件的脚本,配上host 和端口,发现一直报错: smtplib.SMTPException: No suitable authentication method foun ...
- 【STM32学习笔记1】基于固件库的STM32_MDK工程模版
文章包含STM32固件库介绍和工程模板搭建两方面内容. 一.STM32固件库介绍 要建立工程模板,首先要对STM32的固件库有所了解.STM32的固件可以从ST官网下载,网址为:http://www. ...
- delete了,析构函数却没有调用
析构函数在对象的生命结束时,会自动调用,大家所熟知的智能指针就是根据析构函数的这种特性而实现的,包括Qt的内存管理机制,也都是利用了析构函数的这一机制来实现的.c++创始人Bjarne Stroust ...
- react-native 入门资源合集
# 了解react-native React Native enables you to build world-class application experiences on native pla ...
- 让你提前知道软件开发(24):C语言和主要特征的发展史
文章1部分 再了解C语言 C语言的发展历史和主要特点 作为一门众所周知的计算机编程语言,C语言是谁发明的呢?它是怎样演进的?它有何特点?究竟有多少人在使用它? 1. C语言之父 C语言是1972年由美 ...
- Activity切换动画(overridePendingTransition)-翻页效果
Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画.{它包括两个部分:一部分是第一个activity退出时的动画:另外一部分时第二个activity进入时的动 ...
- docker进入容器
进入容器的三种方式: sshd nsenter exec sshd 在容器中开启一个SSHD的服务,通过SSH的协议登录到容器中,把容器看出一个vm nsenter: nsenter包含在util-l ...
- javascript操作JSON字符
1.先要区分JSON字符串和JSON对象 JSON字符串: Var strJSON = “{“Area”:[{“AreaId”:”123”},{“AreaId”:”345”}]}”, 或者 Var ...