MyBatis——快速入门
狂神说SpringBoot09:整合MyBatis
MyBatis 快速入门和重点详解
MyBatis-Plus
特点
- Mybatis一个持久层框架。可以进行更细致的SQL优化,查询必要的字段,但是需要维护SQL和查询结果集的映射,而且数据库的移植性较差,针对不同的数据库编写不同的SQL。
- Mybatis不完全是一个orm框架,不是依照的jpa规范,她需要些sql语句,半ORM(也是通过注解或者XML描述【对象-关系表】之间的映射关系)。
- sql写在xml里,便于统一管理和优化。
-
框架
MyBatis
- MyBatis-Spring
- 配置dataSource数据源
- 使用SqlSessionFactoryBean来创建 SqlSessionFactory
- 使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象
- 事务管理 jdbc.datasource.DataSourceTransactionManager
- tx:advice + aop:config
使用
mybatis: mybatis-config.xml
mybatis-spring: spring-persistence.xml数据连接
dataSource
| mybatis | mybatis-spring | mybatis-spring-boot-starter |
|---|---|---|
| xml |
xml |
yml spring: datasource: |
数据映射
pojo
| mybatis | mybatis-spring | mybatis-spring-boot-starter |
|---|---|---|
<package name=xxx” /> |
|
<package name=xxx” />
type-aliases-package: |
mapper
mapperxml放在mapper接口同一个包下,否则在配置中指定
| mybatis | mybatis-spring | mybatis-spring-boot-starter |
|---|---|---|
| mybatis: mapper-locations: |
sqlSession和获取mapper
SqlSession、SqlSessionFactory、SqlSessionTemplate、SqlSessionDaoSupport
| mybatis | mybatis-spring | mybatis-spring-boot-starter |
|---|---|---|
| Factory: SqlSessionFactoryBuilder创建 Session: Factory.openSession() mapper = sqlSession.getMapper() |
Factory: xml配置 SqlSessionFactoryBean Session: SqlSessionTemplate或继承SqlSessionDaoSupport 多一个Mapper实现类,里面写: mapper = sqlSessionTemplate.getMapper() |
零配置 Mapper接口用注解@Mapper |
dao层@Autowired注入Mapper |
注解
@TableField
FieldStrategy
为null的字段也更新
@TableField(updateStrategy = FieldStrategy.IGNORED)private Long parent;
问题处理
1. delete return value
- Mybatis删除返回了false,实际删除成功了
- arthas排查出问题方法
- 怀疑事务传播问题,排除
delete方法返回值问题
public class UserRepository {public int deleteByCity(String city) {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getCity, city);// 注意是>=1return mapper.delete(wrapper) >= 1;}}
2. mapper.selectOne exception
如果参数为null或者有多个记录时的异常情况
public class UserRepository {public User selectByMobile(String mobile) {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getMobile, mobile);return mapper.selectOne(wrapper);}}
