由于我使用的是MySql-8.0.11版本的,hibernate支持的dialect应为org.hibernate.dialect.MySQL8Dialect,所有hibernate应使用高版本
同时spring-orm需要支持hibernate5,其中sessionFactory应为org.springframework.orm.hibernate5.LocalSessionFactoryBean,因此spring应使用高版本
如果不是项目要求,尽量使用低版本,降低复杂度。
一、使用idea构建maven项目
pom中的depedencies配置
1 <dependencies>
2 <dependency>
3 <groupId>log4j</groupId>
4 <artifactId>log4j</artifactId>
5 <version>1.2.17</version>
6 </dependency>
7 <!--<dependency>-->
8 <!--<groupId>junit</groupId>-->
9 <!--<artifactId>junit</artifactId>-->
10 <!--<version>4.12</version>-->
11 <!--<scope>test</scope>-->
12 <!--</dependency>-->
13 <dependency>
14 <groupId>mysql</groupId>
15 <artifactId>mysql-connector-java</artifactId>
16 <version>8.0.11</version>
17 </dependency>
18 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
19 <dependency>
20 <groupId>org.hibernate</groupId>
21 <artifactId>hibernate-core</artifactId>
22 <version>5.3.4.Final</version>
23 </dependency>
24 <!-- 线程池C3P0 -->
25 <!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
26 <dependency>
27 <groupId>c3p0</groupId>
28 <artifactId>c3p0</artifactId>
29 <version>0.9.1.2</version>
30 </dependency>
31 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
32 <dependency>
33 <groupId>org.hibernate</groupId>
34 <artifactId>hibernate-c3p0</artifactId>
35 <version>5.3.4.Final</version>
36 </dependency>
37 <!--spring.version=4.3.10.RELEASE -->
38 <dependency>
39 <groupId>org.springframework</groupId>
40 <artifactId>spring-core</artifactId>
41 <version>${spring.version}</version>
42 </dependency>
43 <dependency>
44 <groupId>org.springframework</groupId>
45 <artifactId>spring-context</artifactId>
46 <version>${spring.version}</version>
47 </dependency>
48 <dependency>
49 <groupId>org.springframework</groupId>
50 <artifactId>spring-beans</artifactId>
51 <version>${spring.version}</version>
52 </dependency>
53 <dependency>
54 <groupId>org.springframework</groupId>
55 <artifactId>spring-aop</artifactId>
56 <version>${spring.version}</version>
57 </dependency>
58 <dependency>
59 <groupId>org.springframework</groupId>
60 <artifactId>spring-orm</artifactId>
61 <version>${spring.version}</version>
62 </dependency>
63 <dependency>
64 <groupId>org.springframework</groupId>
65 <artifactId>spring-web</artifactId>
66 <version>${spring.version}</version>
67 </dependency>
68 <dependency>
69 <groupId>org.springframework</groupId>
70 <artifactId>spring-webmvc</artifactId>
71 <version>${spring.version}</version>
72 </dependency>
73 <dependency>
74 <groupId>org.springframework</groupId>
75 <artifactId>spring-test</artifactId>
76 <version>${spring.version}</version>
77 <scope>test</scope>
78 </dependency>
79 <dependency>
80 <groupId>com.kenai.nbpwr</groupId>
81 <artifactId>javax-inject</artifactId>
82 <version>1.0-201002241208</version>
83 </dependency>
84 <dependency>
85 <groupId>junit</groupId>
86 <artifactId>junit</artifactId>
87 <scope>compile</scope>
88 </dependency>
89 </dependencies>
二、配置
在resource文件夹下定义spring配置文件
hibernate中的配置属性解释请参考这里:https://www.cnblogs.com/pingxin/p/p00076.html
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
5 xmlns:aop="http://www.springframework.org/schema/aop"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
7 <context:property-placeholder location="jdbc.properties"/>
8 <context:annotation-config/>
9 <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" id="dataSource">
10 <!--<property name="jdbcUrl" value="${connection.url}"/>-->
11 <!--<property name="driverClass" value="${connection.driver_class}"/>-->
12 <!--<property name="user" value="${connection.username}"/>-->
13 <!--<property name="password" value="${connection.password}"/>-->
14 <property name="initialPoolSize" value="${c3p0.initsize}"/>
15 <property name="maxPoolSize" value="${c3p0.max_size}"/>
16 <property name="minPoolSize" value="${c3p0.min_size}"/>
17 <property name="checkoutTimeout" value="${c3p0.timeout}"/>
18 <property name="idleConnectionTestPeriod" value="${c3p0.idle_test_period}"/>
19 <property name="acquireIncrement" value="${c3p0.acquire_increment}"/>
20 </bean>
21 <bean class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
22 id="sessionFactory">
23
24 <property name="dataSource" ref="dataSource"/>
25 <property name="hibernateProperties">
26 <props>
27 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</prop>
28 <prop key="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</prop>
29 <prop key="hibernate.format_sql">true</prop>
30 <prop key="hibernate.show_sql">true</prop>
31 <prop key="hibernate.hbm2ddl.auto">update</prop>
32 <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</prop>
33 <prop key="hibernate.connection.url" >${connection.url}</prop>
34 <prop key="hibernate.connection.driver_class">${connection.driver_class}</prop>
35 <prop key="hibernate.connection.username">${connection.username}</prop>
36 <prop key="hibernate.connection.password">${connection.password}</prop>
37 </props>
38 </property>
39 <!--<property name="mappingLocations">-->
40 <!--<list>-->
41 <!--<value>classpath:test/com/hyp/cms/model/ItemsEntity.hbm.xml</value>-->
42 <!--<value>classpath:test/com/hyp/cms/model/OrderdetailEntity.hbm.xml</value>-->
43 <!--<value>classpath:test/com/hyp/cms/model/OrdersEntity.hbm.xml</value>-->
44 <!--<value>classpath:test/com/hyp/cms/model/UserEntity.hbm.xml</value>-->
45 <!--</list>-->
46 <!--</property>-->
47 </bean>
48
49 <bean class="org.springframework.orm.hibernate5.HibernateTransactionManager" id="transactionManager">
50 <property name="sessionFactory" ref="sessionFactory"/>
51 </bean>
52
53 <tx:advice id="txAdvice" transaction-manager="transactionManager">
54 <tx:attributes>
55 <tx:method name="get*" read-only="true"/>
56 <tx:method name="*"/>
57 </tx:attributes>
58 </tx:advice>
59 <!--<aop:config>-->
60 <!--<aop:pointcut expression="execution(* com.zxc.service.*Impl.*(..))"-->
61 <!--id="zxcpointcut"/>-->
62 <!--<aop:advisor advice-ref="txAdvice" pointcut-ref="zxcpointcut"/>-->
63 <!--</aop:config>-->
64 </beans
jdbc.properties文件
connection.url=jdbc:mysql://localhost:3306/learn?useSSL=false&serverTimezone=GMT-8
connection.driver_class=com.mysql.cj.jdbc.Driver
connection.username=root
connection.password=970603
c3p0.max_size=20
c3p0.min_size=2
c3p0.timeout=300
c3p0.idle_test_period=3000
c3p0.acquire_increment=2
c3p0.initsize=2
#dialect=org.hibernate.dialect.MySQL8Dialect
log4j.properties文件配置
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=basic-hibernate.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
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
#log4j.logger.org.hibernate=DEBUG
ok了,这样就可以通过spring使用SessionFactory了
三、调用hibernate
1 import org.hibernate.HibernateException;
2 import org.hibernate.Session;
3 import org.hibernate.SessionFactory;
4 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
5 import org.hibernate.cfg.Configuration;
6 import org.hibernate.service.ServiceRegistry;
7 import org.springframework.context.ApplicationContext;
8 import org.springframework.context.support.ClassPathXmlApplicationContext;
9
10 /**
11 * @author hyp
12 * Project name is CMS
13 * Include in com.hyp.cms
14 * hyp create at 2018/8/6
15 **/
16 public class HibernateUtils {
17 private static final SessionFactory SESSION_FACTORYF;
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 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
30 SESSION_FACTORYF =(SessionFactory) applicationContext.getBean("sessionFactory");
31 }
32 catch (Throwable ex)
33 {
34 System.err.println("Initial SessionFactory creation failed." + ex);
35 throw new ExceptionInInitializerError(ex);
36 }
37 }
38
39 // ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步
40 public static final ThreadLocal<Session> session
41 = new ThreadLocal<Session>();
42 //创建Session
43 public static Session currentSession()
44 throws HibernateException
45 {
46 //通过线程对象.get()方法安全创建Session
47 Session s = session.get();
48 // 如果该线程还没有Session,则创建一个新的Session
49 if (s == null)
50 {
51 s = SESSION_FACTORYF.openSession();
52 // 将获得的Session变量存储在ThreadLocal变量session里
53 session.set(s);
54 }
55 return s;
56 }
57 //关闭Session
58 public static void closeSession()
59 throws HibernateException
60 {
61 Session s = session.get();
62 if (s != null) {
63 s.close();
64 }
65 session.set(null);
66 }
67
68 }
并进行测试
public class test {
@Test
public void test1()
{
// ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
// SessionFactory sessionFactory=(SessionFactory)applicationContext.getBean("sessionFactory");
// Session session=sessionFactory.openSession();
// System.out.println(session);
// session.close();
Session session=HibernateUtils.currentSession();
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
System.out.println("hello " + System.currentTimeMillis());
}
});
}