41_Spring框架介绍2

1. 通过接口mapper来管理sql语句

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接口配置成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
     -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 7) 启用@Autowired注解 -->
    <context:annotation-config/>

    <!-- 8) 管理service -->
    <bean id="productService" class="com.westos.service.ProductService"></bean>

ProductMaper的代码:

public interface ProductMapper {
    // 实现类由mybatis自动生成(动态代理)
    @Insert("insert into product(name,price) values(#{name}, #{price}) ")
    void insert(Product product);

    @Update("update product set name=#{name}, price=#{price} where id=#{id}")
    void update(Product product);

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

    @Select("select * from product where id=#{id}")
    Product findById(int id);

    @Select("select * from product limit #{m}, #{n}")
    List<Product> findByPage(Map<String,Object> map);

    @Select("select * from product")
    List<Product> findByPage2(RowBounds rowBounds);

    @Select("select count(*) from product")
    int findCount();
}

接口方式的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中#{}之间的联系:

@Select("select * from product limit #{m}, #{n}")
// *.java -> *.class 方法的参数名信息会丢失,所以再按m名称去找无法找到
List<Product> findByPage3(@Param("m") int x, @Param("n") int y); 

2. maven的一些常用设置

  1. 修改项目的默认jdk版本(默认是1.5 )
    加在pom.xml的最后
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
  1. 对整个项目字符编码的设置
    写在dependencies之前
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

3. spring 中的声明式事务管理

transaction -> tx
步骤1:启用事务

注解驱动的方式来管理事务
<tx:annotation-driven/>

步骤2:配置事务管理器

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

步骤3:使用 @Transactional
它可以加在方法上或者类上
加在方法上,表示此方法受事务管理
加在类上,那么这个类中的所有方法都受事务管理

3.1 @Transactional注解详解

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

如果要改变默认情况
@Transactional(rollbackFor=异常类.class)
那么方法如果出现了该异常,或该异常的子类异常时,就会回滚

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

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

@Transactional(isolation = 隔离级别)

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

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

@Transactional(propagation = 传播行为)
REQUIRED (默认值) required 必须的 (如果没有事务,开始新的;如果有了用已有的)
SUPPORTS 支持的 (如果没有事务,不开始新的;如果有了用已有的)
REQUIRES_NEW 需要新的 (总会开始新事务)

只有两个业务类的方法相互调用时,传播行为才会有效
ProductService 商品业务类
    @Transactional(propagation=REQUIRED) 
	biz1() { // 事务1
		biz2()
	}
OrderService   订单业务类	
	@Transactional(propagation=REQUIRES_NEW)
    biz2(); // 事务2

猜你喜欢

转载自blog.csdn.net/Lisiluan/article/details/83628408
今日推荐