spring (二)

mapper接口管理sql语句

好处 : 简单方便而且更加灵活

 

1. spring.xml 配置文件


 1) 读取properties文件

<context:property-placeholder location="classpath:jdbc.properties"/>

 

 2) 配置连接池

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxActive" value="${jdbc.max}"/>
        <property name="minIdle" value="${jdbc.min}"/>
    </bean>

 

 3) sqlSession工厂

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
    </bean>

 

 4) 搜索mapper接口(例题的mapper在com.westos下),并配置成spring中的bean

<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- (起始)包名, 从这个包开始扫描-->
        <property name="basePackage" value="com.westos.mapper"/>
    </bean>

 

 5) 注解驱动

<tx:annotation-driven/>

 

 6) 事务管理器, 真正执行事务的提交,回滚操作的类
     注意 :  id固定的,必须是transactionManager

 

 7) 启用@Autowired注解

<context:annotation-config/>

 

 8) 管理service 

<bean id="productService" class="com.westos.service.ProductService"></bean>
</beans>

 

 

2. 接口

public interface StudentMapper {
    // 实现类由mybatis自动生成(动态代理
    @Insert("insert into Student(name,age) values(#{name},#{age})")
    void insert(Student student);

    @Delete("delete from student where id =#{id}")
    void delete(int id);

    @Update("update student set name =#{name},age=${age} where id =#{id}")
    void update(Student stu);

    @Select("select * from student where id =#{id}")
    Student selectById(int it);

    @Select("select * from student where id between #{m} and #{n}")
    List<Student> select(Map<String,Integer> map);

    @Select("select * from student")
    List<Student> selectPage(RowBounds rw);
}

 

接口方式的mapper,比较适合写基本和简单的sql,如果遇到复杂的sql(例如动态sql,表连接映射等),可以借助原来的xml mapper

 

接口mapper和xml mapper结合:
     1) 目录结构要一致 
     2) xml中 namespace的取值与接口的包名类名要一致
     3) 接口中的方法名与xml中标签id对应
     4) 接口中的方法名不能重复(不支持重载)
         会报错误:java.lang.IllegalArgumentException: Mapped Statements collection already contains value for xxxx

 

注意 : 

       mybatis的mapper映射中,默认方法最多只接收一个参数, 多个参数一般用map或list等集合包装
       或者是使用@Param注解,加在方法参数上,以此来建立方法参数和sql中#{}之间的联系
 

 

spring 中的声明式事务管理

 

步骤 :

1) 启用事务 (注解驱动的方式来管理事务)

<tx:annotation-driven/>

 

2) 配置事务管理器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>

 

3) 使用@Transactional

可加在方法上或者类上
       类上 : 这个类中的所有方法都受事务管理
       方法上 :  此方法受事务管理

 

@Transactional注解详解

默认情况下,只有方法出现的 是RuntimeException或Error以及它们的子类时(未检查异常),才会导致事务回滚 

或者 : 1) @Transactional(rollbackFor=异常类.class)
               那么方法如果出现了该异常,或该异常的子类异常时,就会回滚

          2) @Transactional(noRollbackFor=异常类.class)
              当遇到这种异常时,不会回滚事务


注意 : 在业务方法中不要自己try-catch捕获异常,否则spring无法自动回滚事务

@Transactional(isolation = 隔离级别)

@Transactional(timeout = 超时时间(秒))

@Transactional(readOnly = true|false) true表示只读(只有查询) false(会有增删改)
    设置为true,性能会有所提升,但是底层数据库驱动支持(对mysql支持)

@Transactional(propagation = 传播行为)
只有两个业务类的方法相互调用时,传播行为才会有效

 

传播行为 :
                         REQUIRED (默认值)                    必须的 (如果没有事务,开始新的;如果有了用已有的)
                         NESTED                                       嵌套的 (若当前事务存在,则方法应该运行在嵌套事务中,否则同REQUIRED)
                         SUPPORTS                                 支持的 (如果没有事务,不开始新的;如果有了用已有的)
                         NOT_SUPPORTED                     不支持的 (方法不能运行在一个事务中,如果存在事务,则该方法挂起)
                         REQUIRES_NEW                       创建新的  (总会开始新事务)
                         MANDATORY                              强制的 (必须在一个事务中,否则抛出异常)
                         NEVER                                        从不 (不能运行在事务中,否则抛出异常)
                        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值