spring与mybatis整合
1.spring整合mybatis
步骤1:在pom.xml加入依赖
mybatis, mysql, spring-context, logback, druid, junit, spring-jdbc, mybatis-spring
步骤2:把关键对象交给spring控制反转
连接池对象, sqlSessionFactory, sqlSession
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 1) 把数据源对象交给spring容器管理 -->
<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>
<!-- 2) sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="aaa"/>
<!-- 注入mapper.xml文件的位置-->
<property name="mapperLocations" value="classpath:com/westos/mapper/*.xml"/>
</bean>
<!-- 3) sqlSession, 用SqlSessionTemplate得到的SqlSession可以不用我们自己操心事务的管理,以及关闭操作 -->
<bean id="sql" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
步骤3:
使用SqlSession工厂
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("abc/spring-mybatis.xml");
SqlSession sqlSession = context.getBean(SqlSession.class);
Map<String, Object> map = new HashMap<String,Object>();
map.put("m", "0");
map.put("n", 5);
List<Product> list = sqlSession.selectList("com.westos.mapper.ProductMapper.selectByPage", map);
for (Product product : list) {
System.out.println(product);
}
2. 通过接口mapper来管理sql语句
spring.xml配置文件
<!-- 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>
接口:
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结合:
- 目录结构要一致
- xml中 namespace的取值与接口的包名类名要一致
- 接口中的方法名与xml中标签id对应
- 接口中的方法名不能重复(不支持重载)
会报错误: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的一些常用设置
- 修改项目的默认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>
- 对整个项目字符编码的设置
写在dependencies之前
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
3. spring 中的声明式事务管理
transaction -> tx
步骤1:启用事务
在头中添加命名空间
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.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">
注解驱动的方式来管理事务
<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
推荐阅读
-
[jsp+php]Windows2000 下整合Apache2与Tomcat4
-
spring boot整合mybatis
-
Impala与HBase整合实践
-
ssm整合——Mybatis配置(1)
-
手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis
-
一篇文章带你入门Springboot整合微信登录与微信支付(附源码)
-
Dwz与thinkphp整合下的数据导出到Excel实例
-
Spring整合Struts2中拦截链与注解的使用
-
Windows2000下Apache2.0.46与Tomcat5.0.2整合配置方法_MySQL
-
Spring Cloud EureKa Ribbon 服务注册发现与调用