springboot整合hibernate非jpa方式

引言

        经过网上搜集,未找到纯springboot与hibernate的资料,绝大多数都是jpa的方式,经过查询资料实现纯hibernate部分,如存在问题,请及时留言互相交流。

1.名词解释

@Primary  //该注解功能是:当多个类实现同一接口时,通过接口类型注入时,默认取标注@Primary的实现类
@Bean    //springboot默认先创建标注该注解的实例,当存在该bean时不会创建其他的默认的bean

2.Maven依赖项

<dependencies>
<!--    添加Boot web启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!--添加jetty插件 springboot 默认采用tomcat-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!--jstl标签-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

<!--<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>-->

<!--jetty支持jsp-->
<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0.20100224</version>
</dependency>

<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jsp-2.1-glassfish</artifactId>
    <version>9.1.02.B04.p0</version>
</dependency>

<!-- ++++++++++++++++++++++++++++++++数据源部分+++++++++++++++++++++++++++++++++++ -->
<!--使用默认的springJDBC连接数据库-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.35</version>
</dependency>

<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5</version>
</dependency>
<!-- ++++++++++++++++++++++++++++++++++++end 数据源部分++++++++++++++++++++++++++++++++++ -->

<!-- +++++++++++++++++++++++++++++++++++++++ mybatis或者hibernate部分 +++++++++++++++++++ -->
<!--<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>-->
<!--hibernate启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- +++++++++++++++++++++++++++++++++++++++ end mybatis或者hibernate部分 +++++++++++++++ -->

<!-- ================= 该模块在springboot 迁移时有很大的帮助 ================ -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
</dependency>

3.配置C3p0数据源

配置application.properties文件

 #①配置数据库连接信息
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/book?useUnicode=true&characterEncoding=utf8
#C3P0中的user不是username
c3p0.user=root
c3p0.password=root
c3p0.driverClass=com.mysql.jdbc.Driver

#①-3连接池配置信息
c3p0.minPoolSize=5
c3p0.maxPoolSize=10
c3p0.maxIdelTime=1800000
c3p0.acquireIncrement=5
c3p0.maxStatements=100
c3p0.initialPoolSize=5
c3p0.acquireRetryAttempts=30
c3p0.acquireRetryDelay=1000
c3p0.breakAfterAcquireFailure=false
c3p0.testConnectionOnCheckout=false


#①-2指定自定义连接池
#spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
#配置C3P0数据源
spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource

## ------mybatis部分
#设置mybatis mapper的别名所在的包
mybatis.type-aliases-package=com.jht.domain
#设置mapper接口对应的xml配置文件路径
mybatis.mapper-locations=classpath:com/jht/dao/*.xml

##------hibernate部分
## jpa部分
#spring.jpa.database=mysql
### 为每个query展示sql
#spring.jpa.show-sql=true
###Hibernate ddl auto (create,create-drop,update)
#spring.jpa.hibernate.ddl-auto=update
###数据库方言
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
###
#spring.jpa.properties.hibernate.show_sql=true
###
#spring.jpa.properties.hibernate.format_sql=true
###
#spring.jpa.properties.hibernate.hbm2ddl.auto=update

## 纯hibernate部分
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update
hibernate.packageScan=com.jht.domain
 c3p0配置对象
  @Configuration
  public class DataSourceConfiguration {
  @Bean("dataSource")
  @Primary  //该注解功能是:当多个类实现同一接口时,通过接口类型注入时,默认取标注@Primary的实现类
  @ConfigurationProperties(prefix = "c3p0") //为application.properties中的配置前缀
	public DataSource createC3p0Datasource() throws PropertyVetoException {
    	return DataSourceBuilder.create().type(com.mchange.v2.c3p0.ComboPooledDataSource.class).build();
 	}
}

      对3部分的解释:
             当配置完该类后,将使用当前配置的c3p0参数,否则会使用默认的,可通过控制台查看具体信息

4 配置SessionFactory

package com.jht;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;

import javax.sql.DataSource;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import java.util.ResourceBundle;

/**
 * Created by TT on 2019/6/28.
 */
@Configuration
public class SessionFactoryConfig {

    @Value("${hibernate.dialect}")
    private String dialect;

    @Value("${hibernate.current_session_context_class}")
    private String current_session_context_class;

    @Value("${hibernate.show_sql}")
    private boolean show_sql;

    @Value("${hibernate.format_sql}")
    private boolean format_sql;

    @Value("${hibernate.hbm2ddl.auto}")
    private String hbm2ddl_auto;

    @Value("${hibernate.packageScan}")
    private String packageScan;

    @Autowired
    @Qualifier("dataSource")
    private DataSource dataSource;




    @Bean("sessionFactory")
    @Primary
    public LocalSessionFactoryBean getSessionFactory() throws IOException {
        LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
        localSessionFactoryBean.setDataSource(dataSource);
        PathMatchingResourcePatternResolver pmprpr = new PathMatchingResourcePatternResolver();
        Resource[] resource = pmprpr.getResources("classpath*:com/jht/**/domain/*.hbm.xml");
        localSessionFactoryBean.setMappingLocations(resource);
        Properties hibernateProperties = new Properties();
        hibernateProperties.put("hibernate.dialect",dialect);
        hibernateProperties.put("current_session_context_class",current_session_context_class);
        hibernateProperties.put("hibernate.show_sql",show_sql);
        hibernateProperties.put("hibernate.format_sql",format_sql);
        hibernateProperties.put("hibernate.hbm2ddl.auto",hbm2ddl_auto);
        localSessionFactoryBean.setHibernateProperties(hibernateProperties);
        return localSessionFactoryBean;
    }
}
5 配置TransactionManager
  名词解释:

       一般当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。可通过实现TransactionManagementConfigurer在实现的方法中指定默认的事务管理器,当不指定时需要在@Transaction(value="")的value中指定。

package com.jht;

import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;

import javax.annotation.Resource;


/**
 * Created by TT on 2019/6/28.
 */
@Configuration
public class TransactionConfig implements TransactionManagementConfigurer {

    @Resource(name = "transactionManager")
    private HibernateTransactionManager transactionManager;

    /**
     * 在Spring容器中,我们手工注解@Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。
     * @param sessionFactory
     * @return
     */
    @Bean("transactionManager")
    @Primary
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory){
        HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();
        hibernateTransactionManager.setSessionFactory(sessionFactory);
        return hibernateTransactionManager;
    }

    /**
     *  事务管理中jpa与JDBC都实现PlatformTransactionManager接口,当spring-boot-starter-jdbc或者spring-boot-start-data-jpa
     *  使用时,分别使用的事务控制是 DataSourceTransaction与JpaTransactionManager 可通过获取bean时查看实现类
     * @param platformTransactionManager
     * @return
     */
    @Bean
    public Object testBean(PlatformTransactionManager platformTransactionManager){
        System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
        return new Object();
    }

    /**
     * 当出现多个事务管理器时可通过implements TransactionManagementConfigurer管理,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器
     * 该方法返回值默认的事务管理器
     * [注意点:当使用多个事务管理器时,有两种方式制定事务①在service方法@Transaction(value=“事务bean名”)或者使用TransactionManagementConfigure实现方法返回的事务控制器,此时无需通过value指定]
     * @return
     */
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return transactionManager;
    }

}
解释5部分中:
     @Bean("transactionManager")
     @Primary
     public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory)中的sessionFactory可通过@Autowired注入或者设置成参数框架帮我们自动注入。
5 spring启动器修改部分
/**
 * HibernateJpaAutoConfiguration 不排除将获取session时报错
 * JpaRepositoriesAutoConfiguration 不排除创建sessionFactory将报错
 */
@SpringBootApplication(exclude = {JpaRepositoriesAutoConfiguration.class,HibernateJpaAutoConfiguration.class })
//启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
@EnableTransactionManagement(proxyTargetClass = true)
//指定启动时扫描的包如@Service和@Repository
@ComponentScan(value = {"com.jht"})
6 额外部分
classpath和classpath*的区别:当存在多个相同的配置文件,classpath默认取第一个,而classpath*将会从不同的jar中加载所有的配置文件;
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值