mybatis相关maven库

MyBatis——快速入门
狂神说SpringBoot09:整合MyBatis
MyBatis 快速入门和重点详解
MyBatis-Plus

特点

  • Mybatis一个持久层框架。可以进行更细致的SQL优化,查询必要的字段,但是需要维护SQL和查询结果集的映射,而且数据库的移植性较差,针对不同的数据库编写不同的SQL。
  • Mybatis不完全是一个orm框架,不是依照的jpa规范,她需要些sql语句,半ORM(也是通过注解或者XML描述【对象-关系表】之间的映射关系)。
  • sql写在xml里,便于统一管理和优化。
  • 提供xml标签,支持编写动态sql。

    框架

  • MyBatis

  • MyBatis-Spring
  1. 配置dataSource数据源
  2. 使用SqlSessionFactoryBean来创建 SqlSessionFactory
  3. 使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象
  4. 事务管理 jdbc.datasource.DataSourceTransactionManager
  5. 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” />
| mybatis:
type-aliases-package: |

mapper

mapperxml放在mapper接口同一个包下,否则在配置中指定

mybatis mybatis-spring mybatis-spring-boot-starter


mybatis:
mapper-locations:

sqlSession和获取mapper

SqlSessionSqlSessionFactorySqlSessionTemplateSqlSessionDaoSupport
image.png

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的字段也更新

  1. @TableField(updateStrategy = FieldStrategy.IGNORED)
  2. private Long parent;

问题处理

1. delete return value

  1. Mybatis删除返回了false,实际删除成功了
  • arthas排查出问题方法
  • 怀疑事务传播问题,排除
  • delete方法返回值问题

    1. public class UserRepository {
    2. public int deleteByCity(String city) {
    3. LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    4. wrapper.eq(User::getCity, city);
    5. // 注意是>=1
    6. return mapper.delete(wrapper) >= 1;
    7. }
    8. }

    2. mapper.selectOne exception

    如果参数为null或者有多个记录时的异常情况

    1. public class UserRepository {
    2. public User selectByMobile(String mobile) {
    3. LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    4. wrapper.eq(User::getMobile, mobile);
    5. return mapper.selectOne(wrapper);
    6. }
    7. }

    点击查看【bilibili】