一、Hibernate包的下载
官网地址:https://hibernate.org/orm/
jar下载版本:hibernate-release-5.3.2.Final.zip,本章源码中提供了下载好的jar,在章节末尾有源码下载地址。
二、Hibernate jar包介绍
包名 | 用途 |
antlr-2.7.7.jar | Hibernate利用它实现从HQL到SQL的转换 |
byte-buddy-1.8.12.jar | 基于动态类型的超类名称来随机生成类名 |
classmate-1.3.4.jar | |
dom4j-1.6.1.jar | 解析XML配置文件和XML映射文件 |
hibernate-commons-annotations-5.0.4.Final.jar | Hibernate注解包 |
hibernate-core-5.3.2.Final.jar | Hibernate核心包 |
jandex-2.0.5.Final.jar | 用来索引Anotation的 |
javassist-3.22.0-GA.jar | Hibernate用它来实现PO字节码的动态生成 |
javax.activation-api-1.2.0.jar | |
javax.persistence-api-2.2.jar | 持久化api |
jboss-logging-3.3.2.Final.jar | 日志服务通用库 |
jboss-transaction-api_1.2_spec-1.1.1.Final.jar | JTA规范包 |
三、搭建Hibernate开发环境
1)用eclipse新创建一个Dynamic Web Project,项目完整结构图如下:
2)把解压后hibernate-release-5.3.2.Final\lib\required下的jar都复制粘贴到项目中lib文件夹下
从网上下载一个mysql jar包也复制粘贴到lib文件夹下,本章源码中提供了下载好的jar。
3)在项目src目录下新增一个hibernate的核心文件,文件名称为hibernate.cfg.xml,文件内容如下。
注意:也可以命名成hibernate.properties,但项目启动时可能会报找不到该文件,不影响。
hibernate.dialect目前是比较新的版本,旧版本是:org.hibernate.dialect.MySQLDialect。
实体注册文件的路径用"/",不要用“.”
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 实体映射文件注册 -->
<mapping resource="com/xm/web/entity/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
4)创建User类和User.hbm.xml配置文件,都放置在com.xm.web.entity下,配置如下:
package com.xm.web.entity;
import java.io.Serializable;
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String userid;
private String username;
private String passwrod;
private String phone;
private String sex;
private Integer age;
private Integer weight;
private Integer height;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswrod() {
return passwrod;
}
public void setPasswrod(String passwrod) {
this.passwrod = passwrod;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getWeight() {
return weight;
}
public void setWeight(Integer weight) {
this.weight = weight;
}
public Integer getHeight() {
return height;
}
public void setHeight(Integer height) {
this.height = height;
}
}
<?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">
<hibernate-mapping>
<!-- 映射的实体类 -->
<class name="com.xm.web.entity.User" table="xm_user">
<id name="id" column="id">
<!-- id生成策略 -->
<generator class="assigned"></generator>
</id>
<property name="userid" column="userid"></property>
<property name="username" column="username"></property>
<property name="passwrod" column="passwrod"></property>
<property name="phone" column="phone"></property>
<property name="sex" column="sex"></property>
<property name="age" column="age"></property>
<property name="weight" column="weight"></property>
<property name="height" column="height"></property>
</class>
</hibernate-mapping>
5)在com.xm.web.test包下创建一个添加用户的测试类,内容如下:
注意:如果id属性在数据库中为主键,该方法只能执行一次,执行第二次回报主键冲突,可删除数据再重复执行。
package com.xm.web.test;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.xm.web.entity.User;
public class TestAddUser {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
User user = new User();
user.setId(999999);
user.setUserid("888888");
user.setUsername("cb");
user.setPasswrod("cb");
user.setPhone("13099999999");
user.setSex("0");
user.setAge(99);
user.setWeight(99);
user.setHeight(199);
// 持久化用户信息
s.save(user);
// 查询用户信息并打印
List<User> list = s.createQuery("from User").list();
for(User u : list){
System.out.println(u.getId() + " : " + u.getUserid() + " : " + u.getUsername());
}
s.getTransaction().commit();
s.close();
sf.close();
}
}
启动打印结果:
目前是使用hibernate默认的连接池,如果需要使用c3p0连接池,继续下面步骤。
四、Hibernate配置C3P0连接池
1)把hibernate-release-5.3.2.Final\lib\optional\c3p0下的jar都粘贴复制到项目lib下
2)连接池的配置都配置在hibernate.cfg.xml中
主要配置:
<!-- 数据库连接池的使用 -->
<!-- 选择使用C3P0连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!-- 连接池中最小连接数 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 连接池中最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 设定数据库连接超时时间,以秒为单位。如果连接池中某个数据库连接处于空闲状态且超过timeout秒时,就会从连接池中移除-->
<property name="hibernate.c3p0.timeout">120</property>
<!-- 设置数据库 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
可选配置:
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement">3</property>
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts">30</property>
<!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
<property name="acquireRetryDelay">1000</property>
<!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
<property name="autoCommitOnClose">false</property>
<!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。Default: null-->
<property name="automaticTestTable">Test</property>
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
<property name="breakAfterAcquireFailure">false</property>
<!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
<property name="checkoutTimeout">100</property>
<!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->
<property name="connectionTesterClassName"></property>
<!--指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可Default: null-->
<property name="factoryClassLocation">null</property>
<!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.(文档原文)作者强烈建议不使用的一个属性-->
<property name="forceIgnoreUnresolvedTransactions">false</property>
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod">60</property>
<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize">3</property>
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">60</property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">15</property>
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
<property name="maxStatements">100</property>
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<property name="maxStatementsPerConnection"></property>
<!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行。Default: 3-->
<property name="numHelperThreads">3</property>
<!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0的数据源时。Default: null-->
<property name="overrideDefaultUser">root</property>
<!--与overrideDefaultUser参数对应使用的一个参数。Default: null-->
<property name="overrideDefaultPassword">password</property>
<!--密码。Default: null-->
<property name="password"></property>
<!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在。Default: null-->
<property name="preferredTestQuery">select id from test where id=1</property>
<!--用户修改系统配置参数执行前最多等待300秒。Default: 300 -->
<property name="propertyCycle">300</property>
<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout">false</property>
<!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
<property name="testConnectionOnCheckin">true</property>
<!--用户名。Default: null-->
<property name="user">root</property>
<!-- 最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 最小连接数 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
<property name="hibernate.c3p0.timeout">120</property>
<!-- 最大的PreparedStatement的数量 -->
<property name="hibernate.c3p0.max_statements">100</property>
<!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
<property name="hibernate.c3p0.idle_test_period">120</property>
<!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
<property name="hibernate.c3p0.acquire_increment">2</property>
<!-- 每次都验证连接是否可用 -->
<property name="hibernate.c3p0.validate">true</property>
本章完结,待续!
源码下载地址: https://gitee.com/ouyangjun_xm/hibernate/attach_files下chapter-one.rar压缩包
码云账户: [email protected] 密码: [email protected]
请勿恶意操作,谢谢!
本文说明:该文章属于原创,如需转载,请标明文章转载来源