Maven+Spring.4.3.10+hibernate.5.3.4+c3p0配置整合
由于我使用的是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()); } }); } }