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 从不 (不能运行在事务中,否则抛出异常)