Hibernate的使用

一、概述

掌握Hiberate的基本配置——即搭建Hiberate开发环境
掌握Hiberate常用API——即如何使用Hiberate框架进行开发
掌握Hiberate的关联映射——解决表与表之间存在的关系问题,有1n(一对多)、 11(一对一)、mn(多对多)关系
掌握Hiberate的检索方式——即掌握Hiberate的查询
掌握Hiberate的优化方式——即提高Hiberate的效率

  • 1.1 hibernate执行过程:
    1)应用程序先调用Configuration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactory对象

2)利用SessionFactory对象得到session对象,两种方式:getCurrentSession与 openSession()。

区别:
1)getCurrentSession创建的session会和绑定到当前线程,而openSession不会。

2) getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭(session.close)。

3) openSession()打开的是新的session,getCurrentSession会先从上下文找,有session就拿过来用,没有就创造新的session

3)session对象开启事务,得到一个事务对象:

Transaction tx= session.beginTransaction();

4)利用session对象的方法get load save delete操作pojo实体类

5)事务提交+session.close()+sessionfactory.close()

1.2 hibernate配置核心
1.配置SessionFactory
2.配置事务容器
3.配置事务规则
4.配置事务入口

二、 搭建Hibernate开发环境

2.1创建java web工程,数据库和表
新建全局配置文件:

jdbc_url=jdbc\:oracle\:thin\:@192.168.23.15\:1521\:ORCL
jdbc_username=test
jdbc_password=test
dbType=oracle

hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
driverClassName=oracle.jdbc.driver.OracleDriver
validationQuery=SELECT 1 from dual

hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
hibernate.use_sql_comments=true
  • 2.2 引入hibernate相关依赖
  • 2.3 配置hibernate
    配置连接池druid:
    引入相关配置;
    创建spring-druid.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
      http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
      http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
      http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
      http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
   <!-- 配置druid监控spring jdbc -->
   <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor" />

   <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype">
      <property name="patterns">
         <list>
            <value>org.tc.*.service.*</value> 
         </list>
      </property>
   </bean>
   <aop:config>
      <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" />
   </aop:config>

</beans>

在web.xml中增加:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:spring.xml,classpath:spring-hibernate.xml,classpath:spring-druid.xml,classpath:spring-tasks.xml
    </param-value>
</context-param>

Web方式监控druid:

<servlet> 
 	     <servlet-name>DruidStatView</servlet-name> 
 	     <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> 
	 </servlet> 
	 <servlet-mapping> 
	     <servlet-name>DruidStatView</servlet-name> 
	     <url-pattern>/druid/*</url-pattern> 
	 </servlet-mapping> 
	 <filter> 
	  <filter-name>druidWebStatFilter</filter-name> 
	  <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> 
	  <init-param> 
	   <param-name>exclusions</param-name> 
	   <param-value>/public/*,*.js,*.css,/druid*,*.jsp,*.swf</param-value> 
	  </init-param> 
	  <init-param> 
	   <param-name>principalSessionName</param-name> 
	   <param-value>sessionInfo</param-value> 
	  </init-param> 
	  <init-param> 
	   <param-name>profileEnable</param-name> 
	   <param-value>true</param-value> 
	  </init-param> 
	 </filter> 
	 <filter-mapping> 
	  <filter-name>druidWebStatFilter</filter-name> 
	  <url-pattern>/*</url-pattern> 
	 </filter-mapping>
	 ```
运行Tomcat,浏览器输入 http://IP:PROT/druid就可以打开Druid的监控页面了:
 


  配置数据源: 

 


配置sessionFactory: 
${hibernate.dialect} ${hibernate.show_sql} ${hibernate.format_sql} ${hibernate.use_sql_comments} after_transaction org.tc.api.model ```

配置事务管理器:

<!-- 配置事务管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
   <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

配置事务:

<!—声明方式配置事物 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
   <tx:attributes>
      <tx:method name="add*" propagation="REQUIRED" />
      <tx:method name="append*" propagation="REQUIRED" />
      <tx:method name="save*" propagation="REQUIRED" />
      <tx:method name="update*" propagation="REQUIRED" />
      <tx:method name="modify*" propagation="REQUIRED" />
      <tx:method name="edit*" propagation="REQUIRED" />
      <tx:method name="delete*" propagation="REQUIRED" />
      <tx:method name="remove*" propagation="REQUIRED" />
      <tx:method name="init" propagation="REQUIRED" />
      <tx:method name="delAndInit" propagation="REQUIRED" />

      <tx:method name="get*" propagation="REQUIRED" read-only="true" />
      <tx:method name="find*" propagation="REQUIRED" read-only="true" />
      <tx:method name="load*" propagation="REQUIRED" read-only="true" />
      <tx:method name="search*" propagation="REQUIRED" read-only="true" />
      <tx:method name="datagrid*" propagation="REQUIRED" read-only="true" />

      <tx:method name="*" propagation="REQUIRED" />
   </tx:attributes>
</tx:advice>
<!—入口-->
<aop:config> 
   <aop:pointcut id="transactionPointcut" expression="execution(* org.tc.*.service.impl.*Impl.*(..))" />
   <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />     
</aop:config>
<aop:config >
   <aop:pointcut id="transactionPointcut1" expression="execution(* org.tc.*.*.service.impl.*Impl.*(..))" />
   <aop:advisor pointcut-ref="transactionPointcut1" advice-ref="transactionAdvice" />    
</aop:config>

2.4创建实体类
实体类用@Table(name=“表名”) 标注,字段用@Column标识
2.5 创建dao类

 @Repository
public class UserDao {

    @Resource
    SessionFactory sessionFactory;
    
    public void save(User user){
        Session session = sessionFactory.openSession();
        session.save(user);
        
    }
}

2.6 创建service类

@Service
public class UserService {
    @Resource
    UserDao userDao;

    @Transactional
    public void save(User user){
        userDao.save(user);
    } 
}

2.7 创建控制类

@Controller
public class SaveUser {

    @Resource
    UserService userService;
    
    @RequestMapping(value="/saveUser")
    public String saveUser(User user){
        userService.save(user);
        return "saveSucess";
    }
}

二、 hibernate配置项
3.1 hibernate.hbm2ddl.auto:会帮助我们根据定义好的实体,自动创建,更新,验证数据库表
none(默认)
在Hiberante启动时,不会执行任何操作。
create-only
在Hibernate启动时,对实体仅会执行建表语句,即使实体对应的表已经存在了,也会重复执行建表语句。
drop
在Hiberante启动时,对实体对应的表执行删除语句,即使实体不存在对应的表,都会执行表删除语句。
create
在Hiberante启动时,对实体对应的表执行删除语句,然后再执行建表语句。
create-drop
在Hibernate启动时,对实体对应的表执行删除语句,然后执行建表语句。在Hibernate关闭时,实体对应的表执行删除语句。
validate
对实体和对应的表进行校验。
update
实体对应的表如果不存在则会创建。如果实体中新增加了字段,会在相应的表中增加一列。
总结:
create, create-drop选项要谨慎使用,因为其会执行删表语句。
validate 一般适用于线上环境,用于校验实体与数据库中的字段是否对应
update 一般用于本地快速开发,定义好实体后,Hibernate会自动创建和更新表,省去了手动更新数据库表的麻烦.

3.2 什么是validationQuery
validationQuery是用来验证数据库连接的查询语句,这个查询语句必须是至少返回一条数据的SELECT语句。每种数据库都有各自的验证语句,下表中收集了几种常见数据库的validationQuery。

DataBase validationQuery
hsqldb select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
Oracle select 1 from dual
DB2 select 1 from sysibm.sysdummy1
MySql select 1
Microsoft SqlServer select1
postgresql select version()
ingres select 1
derby values 1
H2 select 1

3.3 dual
第一点
dual不是缩写词而是完整的单词。dual名词意思是对数,做形容词时是指二重的,二元的。
第二点
Oracle中的dual表是一个单行单列的虚拟表。
第三点
Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据’X’, Oracle有内部逻辑保证dual表中永远只有一条数据。
第四点
Dual表主要用来选择系统变量或求一个表达式的值。
第五点
最常见的一个简单的例子SELECT sysdate FROM daul
Oracle的SELECT语法的限制为 SELECT * | [column1 [AS alias1], column2 [AS alias2]] FROM table
所以没有表名就没有办法查询,而时间日期并不存放在任何表中,于是这个dual虚拟表的概念就被引入了。
DUAL表的用途
dual是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中。
查看当前连接用户
select user from dual;
SYSTEM
查看当前日期、时间
select sysdate from dual;
2012-1-24 1
需要保证在DUAL表内有且仅有一条记录,不能把DUAL表的UPDATE,INSERT,DELETE权限随意释放出去,这样对于系统是很危险的。

3.4 dialect
dialect就是“方言”,因为hibernate是要把Java对象转换成关系数据库来描述的,而关系数据库虽然有一些统一的标准,如SQL-92等,但是实际上各数据库如Oracle, MySQL, MS SQL Server等等为了提高性能或增加功能都提供了一些额外的标准或语法,因此,hibernate为了更好适配各种关系数据库,针对每种数据库都指定了一个方言dialect。就是告诉Hibernate,将你写的那些HQL、QBC、、、、等等。翻译成哪种数据库的SQL。

三、 事务配置方式
事务一般有两种:编程式事务和声明式事务;编程式事务就是将事务处理放在程序中,而声明式事务则是通过配置文件或者注解进行操作。
其实配置Hibernate事务的核心就四种:
(1)、配置SessionFactory;
(2)、配置事务容器;
(3)、配置事务规则;
(4)、配置事务入口;

4.1 声明式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
      http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
      http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
      http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
      http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

   
   <!-- 配置数据源 -->
   <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      <property name="url" value="${jdbc_url}" />
      <property name="username" value="${jdbc_username}" />
      <property name="password" value="${jdbc_password}" />

      <!-- 初始化连接大小 -->
      <property name="initialSize" value="1" />
      <!-- 连接池最大使用连接数量 -->
      <property name="maxActive" value="10" />
      <!-- 连接池最小空闲 -->
      <property name="minIdle" value="1" />
      <!-- 获取连接最大等待时间 -->
      <property name="maxWait" value="60000" />

     
      <property name="validationQuery" value="${validationQuery}" />
      <property name="testOnBorrow" value="false" />
      <property name="testOnReturn" value="false" />
      <property name="testWhileIdle" value="true" />

   <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
      <property name="timeBetweenEvictionRunsMillis" value="60000" />
      <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
      <property name="minEvictableIdleTimeMillis" value="300000" />

      <!-- 打开removeAbandoned功能 -->
      <property name="removeAbandoned" value="true" />
      <!-- 1800秒,也就是30分钟 -->
      <property name="removeAbandonedTimeout" value="1800" />
      <!-- 关闭abanded连接时输出错误日志 -->
      <property name="logAbandoned" value="true" />

      <!-- 监控数据库 -->
      <!-- <property name="filters" value="mergeStat" /> -->
      <property name="filters" value="stat" />
   </bean>

   <!-- 配置hibernate session工厂 -->
   <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="hibernateProperties">
         <props>
                        <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop>
            <prop key="hibernate.connection.release_mode">after_transaction</prop>
         </props>
      </property>

      <!-- 自动扫描注解方式配置的hibernate类文件 -->
      <property name="packagesToScan">
         <list>          
          <value>org.tc.api.model</value>
         </list>
      </property>

         </bean>

   <!-- 配置事务管理器 -->
   <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory"></property>
   </bean>

       <!—声明方式配置事物 定义事务规则-->
   <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
      <tx:attributes>
         <tx:method name="add*" propagation="REQUIRED" />
         <tx:method name="append*" propagation="REQUIRED" />
         <tx:method name="save*" propagation="REQUIRED" />
         <tx:method name="update*" propagation="REQUIRED" />
         <tx:method name="modify*" propagation="REQUIRED" />
         <tx:method name="edit*" propagation="REQUIRED" />
         <tx:method name="delete*" propagation="REQUIRED" />
         <tx:method name="remove*" propagation="REQUIRED" />
         <tx:method name="init" propagation="REQUIRED" />
         <tx:method name="delAndInit" propagation="REQUIRED" />

         <tx:method name="get*" propagation="REQUIRED" read-only="true" />
         <tx:method name="find*" propagation="REQUIRED" read-only="true" />
         <tx:method name="load*" propagation="REQUIRED" read-only="true" />
         <tx:method name="search*" propagation="REQUIRED" read-only="true" />
         <tx:method name="datagrid*" propagation="REQUIRED" read-only="true" />

         <tx:method name="*" propagation="REQUIRED" />
      </tx:attributes>
   </tx:advice>
   <aop:config> 
      <aop:pointcut id="transactionPointcut" expression="execution(* org.tc.*.service.impl.*Impl.*(..))" />
      <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />     
   </aop:config>
   <aop:config >
      <aop:pointcut id="transactionPointcut1" expression="execution(* org.tc.*.*.service.impl.*Impl.*(..))" />
      <aop:advisor pointcut-ref="transactionPointcut1" advice-ref="transactionAdvice" />    
   </aop:config>

</beans>

4.2 拦截器方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.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">
 
    <!--引入配置文件属性-->
    <!--<context:property-placeholder location="classpath:datasource.properties" />-->
 
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:datasource.properties" />
    </bean>
 
    <!--配置数据源-->
    <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="${jdbc.driver_class}"/>
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
 
    <!--整合hibernate中sessionFactory 交给spring 容器管理-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
        <property name="dataSource" ref="myDataSource" />
        <property name="packagesToScan" value="com.aop.transaction.pay" />
        <!--配置hibernate额外属性-->
        <property name="hibernateProperties">
            <props>
                <!--设置hibernate方言-->
                <!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</prop>-->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>
 
    <!--配置事物管理-->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
 
    <!-- 配置声明性事务管理(事务应用一般放在业务层) -->
    <!-- 事务传播行为类型 说明 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
        PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
        PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED
        以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
        PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类
        似的操作。 -->
    <!-- aop代理 -->
    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <!-- 设置事务管理其 -->
        <property name="transactionManager" ref="transactionManager" />
        <!--设置事物属性-->
        <property name="transactionAttributes">
            <props>
                <!-- 设置拦截方法,可以使用通配符 -->
                <!-- 可以设置事务的传播行为,隔离级别,多个值用逗号隔开 -->
                <prop key="transfer*">PROPAGATION_REQUIRED,ISOLATION_REPEATABLE_READ</prop>
                <prop key="add*">PROPAGATION_REQUIRED,ISOLATION_REPEATABLE_READ</prop>
                <prop key="insert*">PROPAGATION_REQUIRED,ISOLATION_REPEATABLE_READ</prop>
            </props>
        </property>
    </bean>
 
    <!-- 定义BeanNameAutoProxyCreatorf进行Spring的事务处理 -->
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <!-- 针对指定的bean自动生成业务代理 -->
        <property name="beanNames" value="*Service" />
        <!-- 这个属性为true时,表示被代理的是目标类本身而不是目标类的接口[cglib] -->
        <property name="proxyTargetClass">
            <value>true</value>
        </property>
        <!-- 依赖注入上面定义的事务拦截器transactionInterceptor -->
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value>
            </list>
        </property>
    </bean>
 
    <!--配置包扫描-->
    <context:component-scan base-package="com.aop.transaction.pay" />
 
</beans>

4.3 注解方式

  <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.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">
 
    <!--引入配置文件属性-->
    <!--<context:property-placeholder location="classpath:datasource.properties" />-->
 
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:datasource.properties" />
    </bean>
 
    <!--配置数据源-->
    <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="${jdbc.driver_class}"/>
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
 
    <!--整合hibernate中sessionFactory 交给spring 容器管理-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
        <property name="dataSource" ref="myDataSource" />
        <property name="packagesToScan" value="com.aop.transaction.pay" />
        <!--配置hibernate额外属性-->
        <property name="hibernateProperties">
            <props>
                <!--设置hibernate方言-->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>
 
    <!--配置事物管理-->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
 
    <!-- 配置注解方式管理事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />
 
    <!--配置包扫描-->
    <context:component-scan base-package="com.aop.transaction.pay" />
 
</beans>

使用:在需要加事务的类上加上@Transactional

4.4代理方式

 <!-- 配置事务容器 -->
<beanid="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <propertyname="sessionFactory"ref="sessionFactory"/>
</bean>
<!-- 定义事务规则 -->
<beanid="transactionProxy"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
    <propertyname="transactionManager"ref="transactionManager"/>
    <propertyname="transactionAttributes">
        <props>
            <!-- ,回滚为-,不回滚为+ -->
            <propkey="add*">PROPAGATION_REQUIRED,-Exception</prop>
            <propkey="modify*">PROPAGATION_REQUIRED,+MyException</prop>
            <propkey="del*">PROPAGATION_REQUIRED</prop>
            <propkey="*">READONLY</prop>
        </props>
    </property>
</bean>
<!-- 定义事务入口 -->
<beanid="userDaoProxy"parent="transactionProxy">
    <propertyname="target"ref="userDao"></property>
</bean>
 

四、 常用API

五、 关联映射

六、 检索方式HQL

  
  public List<Map> findBySql(String sql, int page, int rows) {
        String dbType = ConfigUtil.getSysDbType();
        List<Map> list = null;
        
		if (page == 0) page = 1;
		SQLQuery q = getCurrentSession().createSQLQuery(sql);
		list = q.setFirstResult((page - 1) * rows).setMaxResults(rows).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();

        
        //统一转为小写
        List<Map> rtnList = new ArrayList<Map>();
        for (int i = 0; i < list.size(); i++) {
            Map map = (Map) list.get(i);
            Set set = map.keySet();
            String key = "";
            Object value = null;
            Map rtnMap = new HashMap();
            for (Iterator iter = set.iterator(); iter.hasNext(); ) {
                key = (String) iter.next();
                value = map.get(key);
                rtnMap.put(key.toLowerCase(), value);
            }
            rtnList.add(rtnMap);
        }
        return rtnList;
    }

七、 优化方式

热门文章

暂无图片
编程学习 ·

python文件路径的操作

1、得到指定文件路径&#xff1a;os.path.dirname(带路径文件名) 查找处理文件要调用os库&#xff0c;和openpyxl一样&#xff0c;先用import 导入。 import os file r’e:\python\删除最小值.xlsx’ pwd os.path.dirname(file) print(pwd) 运行结果为&#xff1a;e:\py…
暂无图片
编程学习 ·

也要适当晋升

和一个哥们聊天&#xff0c;说到要不要当组长这个话题。 我说我被无良组长们坑坏了&#xff0c;自己搞不定老往下属身上推。我如果当组长&#xff0c;肯定也是无良组长&#xff0c;水平菜&#xff0c;成为自己讨厌的人。 他说&#xff0c;哥们&#xff0c;你还是不懂职场规则…
暂无图片
编程学习 ·

SpringCloud之服务配置中心

转载请标明出处&#xff1a;https://blog.csdn.net/men_ma/article/details/106847165. 本文出自 不怕报错 就怕不报错的小猿猿 的博客 Docker入门之Docker安装镜像和容器的相关命令操作目标1.SpringCloud Config简介2.Config Server基本使用目标 1、SpringCloud Config简介 2…
暂无图片
编程学习 ·

Macbook安装Cplex记录

学术版还是免费版 感觉Cplex店大欺客啊&#xff0c;学术版邮件都发好多天了始终不给学术版下载&#xff0c;好气啊&#xff0c;所以只能先用免费版凑合了&#xff0c;但是由于自己的问题确实变量一跑远超1000个了所以就有了这篇记录。 安装下载 官方网站&#xff1a;点我带你…
暂无图片
编程学习 ·

c语言输出时%d,%c这些都分别代表什么

1、%u 十进制无符号整数。 2、%f 表示输出浮点数。 3、%s表示输出 字符串。 4、%c表示输出单个字符。 5、%p表示输出指针的值。 6、%e表示输出指数形式的浮点数。 7、%x, %X 表示输出无符号以十六进制表示的整数。 8、%0 表示输出无符号以八进制表示的整数。 9、%g表示…
暂无图片
编程学习 ·

HOME%分号导致环境变量无效-以javac为例(第N个小插曲)

今天使用javac命令突然报错&#xff1a; E:\test>javac ‘javac’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 这个错误常比较见&#xff0c;一般是jdk安装和环境变量是否设置的问题&#xff0c;多篇文章和问答已经提供了解决方法。 但是我的问题不是…
暂无图片
编程学习 ·

微信小程序的学习日志

微信小程序的学习日志&#xff08;一&#xff09; 开发准备&#xff1a; 1.首先&#xff0c;学习微信小程序要在官方微信公众平台上注册账号 2.在注册好账号后&#xff0c;下载小程序开发工具,vscode&#xff0c;安装VSCODE的插件minapp和wechat-snippet 3.创建项目 学习心…
暂无图片
编程学习 ·

关键词指数是什么意思?

本文来自&#xff1a;优优蜘蛛池(http://www.zhizhuchi.vip) 关键词指数是指一段时间内该关键词被用户搜索的次数&#xff0c;可以说是关键词的热度。而关键词指数越高优化的时间也就越长&#xff0c;优化的流量数量也越多&#xff0c;竞争程度也就越激烈。 在变化莫测及高速…
暂无图片
编程学习 ·

SEO文章关键词怎么优化?如何布局

本文来自&#xff1a;优优蜘蛛池(http://www.zhizhuchi.vip) SEO文章关键词可以通过围绕关键词撰写相关内容、保持高质量的原创内容、做好外链建设、使用通俗易懂的关键代替这四个方面进行优化。而想要文章关键词优化更有效果就还要做好布局&#xff0c;下面就让优优蜘蛛池小编…
暂无图片
编程学习 ·

2021年市政方向-岗位技能(质量员)考试题库及市政方向-岗位技能(质量员)复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2021年市政方向-岗位技能(质量员)考试题库及市政方向-岗位技能(质量员)复审模拟考试&#xff0c;包含市政方向-岗位技能(质量员)考试题库答案和解析及市政方向-岗位技能(质量员)复审模拟考试练习。由安全生产模拟考试…
暂无图片
编程学习 ·

【干货总结】:可能是史上最全的MySQL和PGSQL对比材料

【干货总结】:可能是史上最全的MySQL和PGSQL的对比材料 运维了MySQL和PGSQL已经有一段时间了&#xff0c;最近接到一个数据库选型需求&#xff0c;于是便开始收集资料整理了一下&#xff0c;然后就有了下面的对比表 关键词&#xff1a;PostgreSQL 11、MySQL5.7 比较版本&#x…
暂无图片
编程学习 ·

2021年压力焊证考试及压力焊实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2021年压力焊证考试及压力焊实操考试视频&#xff0c;包含压力焊证考试答案和解析及压力焊实操考试视频练习。由安全生产模拟考试一点通公众号结合国家压力焊考试最新大纲及压力焊考试真题汇总&#xff0c;有助于压力…
暂无图片
编程学习 ·

mybatis源码编译出现问题

1 mybatis-3 下载GitHub源码后 pom文件 <parent><groupId>org.mybatis</groupId><artifactId>mybatis-parent</artifactId><version>32</version><relativePath /> </parent> 其中你需要下载mybatis-parent GitHub的…
暂无图片
编程学习 ·

Java基础练习目录(练习案例)

本目录已完结 总 「笔记总结」>>> Java基础总结 • 【目录】 第1章 通过java理解程序逻辑 >>> Java程序编写 • 【第1章 程序&#xff1a;打印输出练习】 第2章 变量和数据类型 >>> Java程序编写 • 【第2章 程序&#xff1a;变量赋值练习】 …
暂无图片
编程学习 ·

Java程序编写 • 【第5章 程序:赌博游戏】

本章节总结 返回作业目录 练习一赌博游戏 import java.util.Scanner; public class day4_03 {public static void main(String[]args){int qian20000;int jj(int)(Math.random()*(20000-01));int dj(int)(Math.random()*(100-01));int mai1100;int mai21000;int mai310000;int…
暂无图片
编程学习 ·

计算机视觉入门系列(一) 综述

计算机视觉入门系列&#xff08;一&#xff09; 综述 自大二下学期以来&#xff0c;学习计算机视觉及机器学习方面的各种课程和论文&#xff0c;也亲身参与了一些项目&#xff0c;回想起来求学过程中难免走了不少弯路和坎坷&#xff0c;至今方才敢说堪堪入门。因此准备写一个计…
暂无图片
编程学习 ·

3.32 小猪短租的爬虫-

够造主网页的url获取函数&#xff0c;从主网页中获取到详情页的链接&#xff0c;从详情页中获取到标题&#xff0c;价格&#xff0c;评论等内容 这里因为ip反爬&#xff0c;返回的是错误的网页&#xff0c;所以后续失败 #这里进行了反爬&#xff0c;返回的网页进行了重定向&am…
暂无图片
编程学习 ·

Java 集合系列01之 总体框架

Java集合是java提供的工具包&#xff0c;包含了常用的数据结构&#xff1a;集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分&#xff1a;List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和…