zoukankan      html  css  js  c++  java
  • 【Spring】JdbcTemplate、声明式事务配置

    8).Spring - JdbcTemplate

    JdbcTemplate:Spring简化的JDBC,Spring提供(spring-jdbc.jar),是自带的,直接用
    获得JdbcTemplate:先将其放到spring中管理,再通过工厂获得
    	<!-- 管理DruidDataSource -->
      	<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
    		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
    		<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
    		<property name="username" value="jwnming"></property>
    		<property name="password" value="Oracle123"></property>
    		<property name="initialSize" value="10"></property>
    		<property name="maxActive" value="20"></property>
    		<property name="minIdle" value="4"></property>
    		<property name="maxWait" value="4000"></property>
    	</bean>
        <!-- 管理Spring的JdbcTemplate -->
       	<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
    		<property name="dataSource" ref="druid"></property>
    	</bean>
    重要API:
    ① 增删改方法:
    jdbcTemplate.update(sql,参数列表...);
    ② 查询方法(查询单个):
    T t = jdbcTemplate.queryForObject(sql,映射工具RowMapper接口,绑定参数);
    	例子:
    ClassPathXmlApplicationContext c= new ClassPathXmlApplicationContext("classpath:/applicationContext.xml");
    		jdbcTemplate = (JdbcTemplate) c.getBean("jt");
    		User user = jdbcTemplate.queryForObject("select id,username,password,sex from t_users where username = ? and password = ?", 
    new 	RowMapper<User>() {
    			@Override
    			public User mapRow(ResultSet rs, int arg) throws SQLException {
    				User user = new User(rs.getString("id"), rs.getString("username"), rs.getString("password"), rs.getInt("sex"));
    				return user;
    			}
    		}, "蒋文明", "123");
    		return user;
    注意:查询没有结果,异常形式告知。
    ③ 查询多条结果:List<T> list = jdbcTemplate.query(sql,RowMapper,绑定的参数);
    Spring+JdbcTemplate开发应用:DAO层 + Service层
    编码步骤:①表 ②实体 ③书写DAO、实现类 ④开发Service、实现类
    

    10).Spring - 声明式事务

    Spring声明式事务
    操作步骤:
    ① 管理service的目标类(以及上面的JdbcTemplate、连接池)
    ② spring管理事务管理器
    ③ spring管理事务增强(tx:adivce 替代了 bean)
    ④ aop配置将增强加入service方法中
    代码:
    	<!-- 管理DruidDataSource -->
      	<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
    		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
    		<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
    		<property name="username" value="jwnming"></property>
    		<property name="password" value="Oracle123"></property>
    		<property name="initialSize" value="10"></property>
    		<property name="maxActive" value="20"></property>
    		<property name="minIdle" value="4"></property>
    		<property name="maxWait" value="4000"></property>
    	</bean>
        <!-- 管理Spring的JdbcTemplate -->
        <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
    		<property name="dataSource" ref="druid"></property>
    </bean>
        <!-- 管理UserDAOImpl --> 
        <bean id="udi" class="com.jwnming.dao.impl.UserDAOImpl">
        		<property name="jdbcTemplate" ref="jt"></property>
        </bean>    
        <!-- 管理UserServiceImpl --> 
        <bean id="usi" class="com.jwnming.service.impl.UserServiceImpl">
        		<!-- UserDAO属性 -->
        		<property name="userDAO" ref="udi"></property>
        </bean>
        <!-- 事务管理器DataSourceTransactionManager -->
        <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        		<!-- 注入连接池 -->
        		<property name="dataSource" ref="druid"></property>
        </bean>
        <!-- 管理事务增强 -->
        <tx:advice id="txAdvice" transaction-manager="txManager">
        	<!-- 事务增强属性 -->
        		<tx:attributes>
        			<!-- User 登录方法:只读、回滚异常为RuntimeExcepiton、支持事务 -->
        			<tx:method name="login" read-only="true" rollback-for="java.lang.RuntimeException" propagation="SUPPORTS"></tx:method>
        			<!-- User 注册方法:回滚异常为RuntimeException、必须事务 -->
        			<tx:method name="regist" rollback-for="java.lang.RuntimeException" propagation="REQUIRED"></tx:method>
        			<!--添加、修改、删除放到最后的位置 <tx:method name="*" rollback-for="java.lang.RuntimeException" propagation="REQUIRED"></tx:method> -->
        		</tx:attributes>
        </tx:advice>
        <!-- aop配置将事务增强加入UserServiceImpl的方法中 -->
        <aop:config>
        		<!-- 声明事务的切入点 -->
        		<aop:pointcut id="pc" expression="execution(boolean com.jwnming.service.impl.UserServiceImpl.login(java.lang.String, java.lang.String))"></aop:pointcut>
        		<aop:pointcut id="pc1" expression="execution(boolean com.jwnming.service.impl.UserServiceImpl.regist(com.jwnming.entity.User))"></aop:pointcut>
    		<!--<aop:pointcut id="pc" expression="execution(* com.jwnming.service.impl.UserServiceImpl.*(..))"></aop:pointcut> -->
        		<!-- 组装:事务增强+切入点 -->
        		<aop:advisor pointcut-ref="pc" advice-ref="txAdvice"></aop:advisor>
        		<aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
    </aop:config>
    
    事务属性:
    事务属性配置标签和属性
    <tx:attributes>
        <tx:method name="方法名1" read-only="只读" propagation="事务传播" rollback-for="回滚异常"></tx:method>
        <tx:method name="方法名2" ></tx:method>
    </tx:attributes>
    ① 事务回滚:rollback-for
       指定service的方法,在什么异常情况下进行事务回滚操作
       <tx:method name="regist" rollback-for="java.lang.RuntimeException"></tx:method>
       默认: rollback-for默认值 java.lang.RuntimeException
    ② 只读事务:read-only=“true|false”
       作用:可以让serviec的查询方法在数据库的内存中,事务中,不分配回滚段。节省内存
       应用:service方法只有读操作,建议设置为只读:`read-only="true"`
    ③ 事务传播:propagation="SUPOORTS|REQUIRED"
       场景:service调用service
       SUPPORTS: 支持事务
       		特点:如果外部已经开始了事务,并融合到外部事务中;如果外部没有开启事务,则不开启事务
       REQUIRED: 需要事务
       		特点:必须有一个事务。如果外部已经开启,则融合外部事务中。如果外部没有事务,则开启事务
    ④ 事务属性方法的简化:<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
       含义:只要service方法以get开头,都适用于,只读,支持事务这些设置
    
  • 相关阅读:
    docker 保存和导入镜像
    HBase01
    ES
    基于TLS证书手动部署kubernetes集群(上)
    Django Rest Framework源码剖析(七)-----分页
    Django Rest Framework源码剖析(六)-----序列化(serializers)
    Django Rest Framework源码剖析(五)-----解析器
    Django Rest Framework源码剖析(四)-----API版本
    Django Rest Framework源码剖析(三)-----频率控制
    Django Rest Framework源码剖析(二)-----权限
  • 原文地址:https://www.cnblogs.com/jwnming/p/13635180.html
Copyright © 2011-2022 走看看