Mybatis学习札记

2022-10-16
预计阅读时间:5分钟

1.MyBatis部分:

  • mapper.xml文件通过namespace属性(mapper接口全类名)与mapper接口一一对应,其中的每条sql语句的id属性和mapper接口中的方法名称一一对应;查询标签中resultType属性用来设置结果类型,即查询的数据要转换为的java类型,resultMap自定义映射,处理多对多或一对多的映射关系

    mysql表清空和截断区别:清空表是将原来表中的内容全部删除,但是id不会重新开始编号;截断先删除原有的表,然后创建一模一样的表。

  • 使用SqlSession对象同时也可以实现不面向接口的数据库操作,例如以下的插入操作:

    int result = sqlSession.insert("com.example.demo.UserMapper.insertUser");
    
  • 以下代码获取数据库连接

    //获取核心配置文件的输入流,配置文件命名推荐为"mybatis-config.xml",无需严格执行
    InputStream is = Resources.getResourceAsStream.("mybatis-config.xml")
    //获取SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    //获取SqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    //获取sql的会话对象SqlSession,是Mybatis提供的操作数据库的对象,openSession()方法添加true参数即可自动提交事务
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //获取UserMapper的代理实现类对象(例)
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    //调用Mapper中的接口方法,实现添加用户的信息功能(例)
    int result = mapper.insertUser();
    //提交事务
    sqlSession.commit();
    //关闭数据库连接
    sqlSession.close();
    
  • log4j日志的级别:FATAL(致命)>WARN(警告)>INFO(信息)>DEBUG(调试),级别从左至右越来越详细,在配置文件中配置的级别后显示该级别以及高于该级别的日志信息

  • mybatis-config文件中可以指定多环境下不同的的数据库配置:

    default属性:指定默认配置要采用的环境

    • 引入jdbc.properties文件:<properties resource="jdbc.properties" />,添加完成后,即可在mybatis-config中使用${}来访问properties中的配置项

    • 设置<typeAlias></typeAlias>标签中的内容后(如果标签中的alias参数未指定,则默认将类名作为resultType,mapper文件中sql语句中的resultType就可以不区分大小写)

    • 如果在<typeAliases>

2.Mybatis-Plus部分:

  1. @TableID注解:当实体类/数据库表的主键字段名称不为id(即实体类属性名称与数据库表的字段名称相同但不为id)时,需要在实体类主键属性上方添加该注解,将属性对应的字段设置为主键;当实体类中的主键属性名称与数据库表中的主键字段名称不一致且不为默认的id时,需要在注解内添加value属性标明该主键属性对应数据库表中的字段名称,例如@TableID(value="uid")或者@TableID("uid")type属性用于指定该主键的添加方式,常用两种方式:IdType.AUTO(自增)IdType.ASSIGN_ID(默认,雪花算法)

    注:当type = IdType.AUTO属性开启时需同时设置数据库主键自增,否则无法生效

    • 无论是否设置主键生成策略(type),当手动设置id值进行插入时则自动递增和雪花算法的主键插入策略自动失效
  2. @TableName注解:当实体类的类名与数据库表名不一致时,需要在实体类上方添加该注解绑定与之对应的数据库表,例如TableName("t_user")

  3. @TableField注解:使用该注解来解决实体类属性名与数据库表字段名称不一致的情况,例如@TableField("user_name");数据库表字段以下划线方式命名时可以与实体类属性的驼峰命名相匹配(默认支持)

  4. @TableLogic注解:当数据库表中有删除标志字段(默认值为0)时,则可以在实体类的删除标志属性上添加该字段来实现逻辑删除功能

  5. @Version注解:该注解添加在实体类的乐观锁版本号属性上方用来标注乐观锁版本

  6. @EnumValue注解:在枚举类中需要插入到数据库的属性上方添加该注解,在执行数据插入时会将枚举类的该属性值存储到数据库中;与此同时,需要在配置文件中添加扫描通用枚举的配置项,如下:

    type-enum-package: com.example.demo.enum
    
  7. 使用配置类来配置MybatisPlus分页插件和乐观锁插件

    //可以将mapper接口扫描的注解从启动类移到此处
    @MapperScan("com.example.demo")
    public class MybatisPlusConfig{
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            //添加分页插件
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
            //添加乐观锁插件
            interceptor.addInnerInterceptor(new OptimisticLockInnerInterceptor());
            return interceptor;
        }
    }
    
  8. 全局配置数据库表前缀名称:需要在application.yml中配置以下内容:

    global-config:
    	db-config:
    		# 全局篇配置表名前缀
    		table-prefix: t_
    		# 全局主键生成策略
    		id-type: auto
    
  9. 使用QueryWrapper构造查询条件时,可以时用链式调用来同时设置多个条件,链式调用设置的各个条件默认以AND形拼接,若需要使用OR拼接查询条件,则可以在AND形式拼接和OR形式拼接的条件之间调用OR()方法

  10. 使用and()or()方法构造查询条件时如需设置条件的优先级,则可以将优先级较高的条件以lambda表达式的Consumer方式进行书写

  11. 组装select子句

    queryWrapper.select("column1","column2","column3")
    
  12. 组装子查询

    queryWrapper.inSql("uid","select uid from user where uid <= 100")