使用工具:IntelliJ IDEA 2017.2.5 x64
MySql-8.0.1
hibernate-release-5.3.1.Final
导入的jar包:
以及连接MySql的jdbc包、和log4j
hibernate配置文件:
1 <?xml version='1.0' encoding='utf-8'?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> 8 <property name="connection.url">jdbc:mysql://localhost:3306/learn?useSSL=false&serverTimezone=GMT%2B8</property> 9 <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property> 10 <property name="connection.username">root</property> 11 <property name="connection.password">970603</property> 12 <property name="show_sql">true</property> 13 14 <mapping class="com.entity.ItemsEntity"/> 15 <mapping resource="com/entity/ItemsEntity.hbm.xml"/> 16 <mapping class="com.entity.OrderdetailEntity"/> 17 <mapping resource="com/entity/OrderdetailEntity.hbm.xml"/> 18 <mapping class="com.entity.OrdersEntity"/> 19 <mapping resource="com/entity/OrdersEntity.hbm.xml"/> 20 <mapping class="com.entity.UserEntity"/> 21 <mapping resource="com/entity/UserEntity.hbm.xml"/> 22 23 24 </session-factory> 25 </hibernate-configuration>
其中的解释
Hibernate配置文件
- Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性
- 每个Hibernate配置文件对应一个Configuration对象
- Hibernate配置文件可以有两种格式:hibernate.properties 和 hibernate.cfg.xml
hibernate.cfg.xml的常用属性
1.JDBC连接属性
- connection.url:数据库URL
- connection.username:数据库用户名
- connection.password:数据库用户密码
- connection.driver_class:数据库JDBC驱动
- dialect:配置数据库的方言,根据底层的数据库不同产生不同的语句,Hibernate会针对数据库的特性在访问时进行优化
2.C3P0数据库连接池属性
- hibernate.c3p0.max_size:数据库连接池的最大连接数
- hibernate.c3p0.min_size:数据库连接池的最小连接数
- hibernate.c3p0.acquire_increment:当数据库连接池中的连接耗尽时,同一时刻获取多少个数据库连接
- hibernate.c3p0.timeout:数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
- hibernate.c3p0.idle_test_period:表示连接池检测线程多长时间检测一次池内的所有连接对象是否超时。连接池本身不会把自己从连接池中移除,而是专门有有一个线程按照一定的时间间隔来做这件事,这个线程通过比较连接对象最后一次被使用时间和当前时间差来和timeout做对比,进而决定是否销毁这个连接对象。
- hibernate.c3p0.max_statements:缓存Statement对象的数量
3.其他
- show_sql:是否将运行期生成的SQL输出到日志以供调试。取值true/fause
- format_sql:是否将SQL转化为格式良好的SQL。取值true/fause
- hbm2ddl.auto:在启动和停止时自动创建,更新或删除数据库模式。取值create/update/create-drop/validate
- hibernate.jdbc.fetch_size
- hibernate.jdbc.batch_size
<!-- 设定JDBC的Statement 读取数据的时候每次从数据库中取出的记录条数--> <property name="hibernate.jdbc.fetch_size">100</property> <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 --> <property name="hibernate.jdbc.batch_size">30</property
练习:C3P0数据库连接池属性
第一步:导入jar包:
hibernate-release-5.2.12.Final\lib\optional\c3p0
hibernate-release-5.2.12.Final\lib\optional\c3p0
第二步:加入Hibernate配置
-hibernate.c3p0.max_size:数据库连接池的最大连接数
-hibernate.c3p0.min_size:数据库连接池的最小连接数
-hibernate.c3p0.acquire_increment:当数据库连接池中的连接耗尽时,同一时刻获取多少个数据库连接
-hibernate.c3p0.timeout:数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
-hibernate.c3p0.idle_test_period:表示连接池检测线程多长时间检测一次池内的所有连接对象是否超时。连接池本身不会把自己从连接池中移除,而是专门有有一个线程按照一定的时间间隔来做这件事,这个线程通过比较连接对象最后一次被使用时间和当前时间差来和timeout做对比,进而决定是否销毁这个连接对象。
-hibernate.c3p0.max_statements:缓存Statement对象的数量
Log4j的配置文件
log4j.rootCategory=INFO, stdout , R #标准输出 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #输出格式 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n log4j.appender.R=org.apache.log4j.DailyRollingFileAppender #文件路径 log4j.appender.R.File=learnHibernate.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n log4j.logger.com.neusoft=DEBUG log4j.logger.com.opensymphony.oscache=ERROR log4j.logger.net.sf.navigator=ERROR log4j.logger.org.apache.commons=ERROR log4j.logger.org.apache.struts=WARN log4j.logger.org.displaytag=ERROR log4j.logger.org.springframework=DEBUG log4j.logger.com.ibatis.db=WARN log4j.logger.org.apache.velocity=FATAL log4j.logger.com.canoo.webtest=WARN
#hibernate的配置 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN log4j.logger.org.hibernate=DEBUG #log4j.logger.org.logicalcobwebs=WARN
然后idea连接数据库learn,通过持久化工具生成hibernate的表文件类和xml映射文件。
对hibernate进行封装
1 package com.utils; 2 3 import org.hibernate.HibernateException; 4 import org.hibernate.Session; 5 import org.hibernate.SessionFactory; 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 7 import org.hibernate.cfg.Configuration; 8 import org.hibernate.service.ServiceRegistry; 9 10 /** 11 * @author hyp 12 * Project name is LearnHibernate 13 * Include in com.utils 14 * hyp create at 2018/7/25 15 **/ 16 public class HibernateUtil { 17 public static final SessionFactory sessionFactory; 18 //创建sessionFactory 19 static 20 { 21 try 22 { 23 // 采用默认的hibernate.cfg.xml来启动一个Configuration的实例 24 Configuration cfg = new Configuration() 25 .configure(); 26 // 以Configuration实例来创建SessionFactory实例 27 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() 28 .applySettings(cfg.getProperties()).build(); 29 sessionFactory = cfg.buildSessionFactory(serviceRegistry); 30 } 31 catch (Throwable ex) 32 { 33 System.err.println("Initial SessionFactory creation failed." + ex); 34 throw new ExceptionInInitializerError(ex); 35 } 36 } 37 38 // ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步 39 public static final ThreadLocal<Session> session 40 = new ThreadLocal<Session>(); 41 //创建Session 42 public static Session currentSession() 43 throws HibernateException 44 { 45 //通过线程对象.get()方法安全创建Session 46 Session s = session.get(); 47 // 如果该线程还没有Session,则创建一个新的Session 48 if (s == null) 49 { 50 s = sessionFactory.openSession(); 51 // 将获得的Session变量存储在ThreadLocal变量session里 52 session.set(s); 53 } 54 return s; 55 } 56 //关闭Session 57 public static void closeSession() 58 throws HibernateException 59 { 60 Session s = session.get(); 61 if (s != null) { 62 s.close(); 63 } 64 session.set(null); 65 } 66 67 }
在接下来是创建DAO类,并对DAO类进行测试。