Spring和myBatis整合过程
目录
Spring和myBatis整合过程
企业开发中需处理的问题
整合思路
目标:
整合步骤
Maven配置:
使用基于mybatis名为ehome的maven工程
注意配置中的maven默认配置文件和仓库位置:
注意maven配置pom中的基本参数
在dependencies中声明依赖
准备db.properties
准备Spring和MyBatis的配置文件
准备Spring的配置文件
MyBatis的配置
Spring和mybatis的单元测试
准备代码部分:
准备一个事务管理器管理事务
目的:
思路:
步骤
企业开发中需处理的问题
- 需要使用第三方性能优秀的数据库连接池
- 设置MyBatis,开启缓存; 其它大部分的配置工作会交接给Spring(mybatis-spring整合包)
- 管理mapper:
UserMapper(接口,Dao) -> 配置SQL -> SqlSession->mapper
UserMapper->crud
整合思路
- 新建一个maven工程(web工程,springmvc)
- 把mybatis中连接属性DataSource和数据库连接池的管理交给Spring
- 连接属性DataSource和数据库连接池是第三方插件已经完善了,我们需要借力(c3p0/dhcp/druid) , 采用druid实现数据源,再由Spring管理
- 让spring接管myBatis对于mapper的管理 , 通过spring和mybatis的整合包实现
- 为了实现SqlSessionFactory , 通过spring和mybatis的整合包实现SqlSessionFactoryBean的管理
目标:
@Autowired (或@Resource)
UserMapper userMapper = null;
userMapper.selectById() 操作就好了
整合步骤
Maven配置:
- Spring的版本:4.3.20
- MyBatis的版本:3.4.6
- Spring-Mybaits整合包 1.3.0
- Junit 4.12
- MySQL connectior 驱动 5.1.48
- Druid 1.1.20
使用基于mybatis名为ehome的maven工程
- Spring的版本:4.3.20
- MyBatis的版本:3.4.6
- Spring-Mybaits整合包 1.3.0
- Junit 4.12
- MySQL connectior 驱动 5.1.48
- Druid 1.1.20
使用基于mybatis名为ehome的maven工程
脚手架如下:
注意配置中的maven默认配置文件和仓库位置:
注意maven配置pom中的基本参数
maven-compiler-plugin
资源扫描路径的设置每每都是问题爆发的高发点:
在dependencies中声明依赖
org.mybatis
mybatis
3.4.6
mysql
mysql-connector-java
5.1.48
org.springframework
spring-context
4.3.20.RELEASE
org.springframework
spring-core
4.3.20.RELEASE
org.springframework
spring-beans
4.3.20.RELEASE
org.springframework
spring-test
4.3.20.RELEASE
org.mybatis
mybatis-spring
1.3.0
org.springframework
spring-jdbc
4.3.20.RELEASE
junit
junit
4.12
test
com.alibaba
druid
1.1.20
可以把Spring的版本统一处理:
那么,Spring的相关依赖就可以写为下面这种方式:
将来,若想要升级或调整Spring的版本,只需要改动Properties中的配置即可
添加完毕后 import
准备db.properties
在resources/properties目录下创建,并添加:
druid.driver=com.mysql.jdbc.Driver druid.url=jdbc:mysql://localhost:3306/sasu?useSSL=false&characterEncoding=utf8 druid.username=root druid.password=root
此处druid前缀作为一个标记,表明连接池的配置特点,不是必须的
准备Spring和MyBatis的配置文件
准备Spring的配置文件
通过context:property-placeholder加载db.properties配置文件
通过context:property-placeholder加载db.properties配置文件
扫描指定包路径,自动装载目标Bean(带有特殊功能的注解@Component @Service @Controller)
配置数据源dataSource,通过druid第三方数据源/连接池
配置SqlSessionFactory , 通过整合包中提供的Bean
配置扫描器,用于扫描mapper目录
将扫描到的所有的mapper接口通过动态代理的方式创建实例,并装载到spring的bean容器中进行管理
红色标注的部分在配置时常常搞错: 我们需要配的是一个bean的名字,而不是bean本身,所以要用value而不能用ref;能不能用ref呢?不能,原因是spring和mybaits中存在命名的冲突,导致ref到的目标不是Spring中的bean
MyBatis的配置
xml version="1.0" encoding="UTF-8" ?>
>
大家注意,我把大部分内容都注释了,保留下来是提醒我们:除了settings其他内容几乎都被Spring接管了
Spring和mybatis的单元测试
先做一个单元测试,测试Mapper是否被Spring注入成功:
@ContextConfiguration(locations = "classpath:spring.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class TestSpringMybatis {
@Autowired
SysUserMapper sysUserMapper = null;
@Test
public void test1(){
SysUser byId = sysUserMapper.findById(1);
System.out.println(byId);
}
}
准备代码部分:
pojo:
Mapper: 逆向工程生成的模板
Service
要点:
- 在实现类上增加@Service
- @Resource和@Autowired的区别
- 在业务中操作中直接用mapper调用即可
业务层测试用例
可能会遇到的问题及解决方案:
- DaoSupport : 若使用了JdbcTemplate,需要spring-jdbc 支持 , 通过maven引入
- 逆向工程中, namespace名称中多了一个空格 需要去掉
准备一个事务管理器管理事务
目的:
正常完成就提交,出现异常就回滚 , 即 把业务操作用事务管理
思路:
从配置的角度: 声明事务管理器(配置dataSource)
利用注解的方式 @Tranactional 配置在指定的业务上(Service)
而传统的做法,是spring的声明式事务(
将注解方式驱动起来(spring-config.xml配置)
步骤
创建事务管理器的bean
配置事务管理器 spring提供的 spring-jdbc
在UserServiceImpl上增加事务的注解
@Transactional
@Service("userService")
public class UserServiceImpl implements UserService {
将事务管理器的注解方式驱动起来(为了@Transactional)
注意: 针对事务的注解驱动,必须是tx的命名空间
如果提示动态代理的错误,则是由于使用了jdk动态代理,改成cglib的方式:



