MyBatis 使用的注意事项

1. MyBatis 中#{}和${}的区别

  • #{}: 解析为一个 JDBC 预编译语句(PreparedStatement )的参数标记符,一个 #{ } 代表一个占位符 ,可预防大部分 SQL 注入
  • ${}: 纯粹的 String 拼接,在动态 SQL 解析阶段将会进行变量替换,当需要传入表名或者按照列排序时可使用

2. MyBatis-plus 的字段非 null 更新

使用 Mapper 通过 bean 对象更新数据库记录的时候,字段更新的策略会影响更新的结果,mybatis-plus的字段默认策略是 FieldStrategy.NOT_NULL。该特性可在数据库表映射生成的 bean 的属性上通过以下注解使用

@TableField(value = "FstrLoanOrder",updateStrategy = FieldStrategy.NOT_EMPTY)
private String loanOrder;
public class GlobalConfig implements Serializable {

       ......
       /**
         * 字段验证策略之 insert
         *
         * @since 3.1.2
         */
        private FieldStrategy insertStrategy = FieldStrategy.NOT_NULL;
        /**
         * 字段验证策略之 update
         *
         * @since 3.1.2
         */
        private FieldStrategy updateStrategy = FieldStrategy.NOT_NULL;
        /**
         * 字段验证策略之 select
         *
         * @since 3.1.2
         */
        private FieldStrategy selectStrategy = FieldStrategy.NOT_NULL;
    }
}
public enum FieldStrategy {
    /**
     * 忽略判断
     */
    IGNORED,
    /**
     * 非NULL判断, bean 对象属性为 NULL 则不更新对应表字段
     */
    NOT_NULL,
    /**
     * 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)
     */
    NOT_EMPTY,
    /**
     * 默认的,一般只用于注解里
     * <p>1. 在全局里代表 NOT_NULL</p>
     * <p>2. 在注解里代表 跟随全局</p>
     */
    DEFAULT,
    /**
     * 不加入 SQL
     */
    NEVER
}

3. MyBatis-plus 使用技巧

3.1 自定义 sql 使用条件构造器作为参数

MyBatis-plus 中使用 @Select 等注解自定义了部分 SQL 语句,同时想使用其条件构造器时,只需要将构造器入参用@Param(Constants.WRAPPER)修饰,再在自定义语句中添加 ${ew.customSqlSegment} 占位即可

 @Select("select FuiQuota from fund.t_fund_quota ${ew.customSqlSegment}")
 Long queryQuota(@Param(Constants.WRAPPER) LambdaQueryWrapper<FundQuota> queryWrapper);

3.2 inSql 子查询

通常在代码中都是简单查询,但是在完成某些比较奇葩的需求时可能需要用到嵌套子查询,MyBatis-plus 为此在查询构造器中提供了 inSql()方法

 LambdaQueryWrapper<Request> wrapper = Wrappers.<MatchRequest>lambdaQuery().inSql(Request::getId, insql)

3.3 and / or / nested 语句嵌套

有些复杂的查询会用到嵌套语句,也就是包裹在括号中的语句,来表示一种条件的并列。这种场景需要动态拼接 SQL 语句,一个示例如下:OR 嵌套中存在两个 AND 连接的条件,可表示语句 OR (FuiProductId = ? AND FuiTradeId IN (?, ?))。如果 or() 方法不传入任何参数,则属于外层普通的 OR 连接符号

wrapper.or(orWrapper -> {
    orWrapper.eq(Target::getProductId, item.getProductId());
    if (!CollectionUtils.isEmpty(item.getTradeIds())) {
        orWrapper.in(Target::getTradeId, item.getTradeIds());
    }
}

3.4 读写分离

整合 dynamic-datasource-spring-boot-starter 可以方便地使用 @DS 注解实现数据源切换,写入时在Mapper方法上使用@DS("master")切换主库,读取则使用@DS("slave")切换从库即可

spring:
  datasource:
    dynamic:
      # 默认的数据源或者数据源组
      primary: master 
      datasource:
      # 主库名称 master
        master:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
          # 重点配置,主库所在服务器 url
          url: jdbc:mysql://xx.xx.xx.xx:3306/request?characterEncoding=utf8&useSSL=false
          druid: # 以下参数针对每个库可以重新设置druid参数
            initial-size:
            validation-query: select 1 FROM DUAL #比如oracle就需要重新设置这个
        # 从库名称 slave
        slave:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
          # 重点配置,从库所在服务器 url
          url: jdbc:mysql://xx.xx.xx.xx:3306/request?characterEncoding=utf8&useSSL=false
          druid: # 以下参数针对每个库可以重新设置druid参数
            initial-size:
            validation-query: select 1 FROM DUAL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.junit 常用注解 @Before 初始化方法,每次测试方法调用前都执行一次。 @After 释放资源:每次测试方法调用后都执行一次 @Test 测试方法:在这里可以测试期望异常和超时时间 @ignore 忽略的测试方法 @BeforeClass 针对所有测试,只执行一次,且必须为static void @AfterClass 针对所有测试,只执行一次,且必须为static void @RunWith 指定测试类使用的某个运行器参数SpringJUnit4ClassRunner.class @Parameters 指定参数类的参数数据集合 @Rule 允许灵活添加或重新定义测试类中的每个测试方法的行为 @FixMethodOrder 指定测试方法的执行顺序 @ContextConfiguration 参数locations="classpath:spring-mybatis.xml" 指向src下的该文件 执行顺序: @BeforeClass---@Before---@Test---@After---@Before ---@Test---@After---@AfterClass junit与main方法相比的优势:代码量少、结构清晰、灵活性更好 main:一个类中只能有一个main方0法 层次结构方面不够清晰 运行具体某一个方法时,要将其他的方法注释掉 2.mybatis的基本配置 1.dao层接口 2.mapper.xml:编辑需要执行的sql语句 (1)mapper标签的namespace属性:指定该xml对应的dao层接口的路径 3.spring-mybatis.xml:spring集成mybatils的配置文件 (1)配置sqlSessionFactory指定要操作的数据库,以及mapper.xml的所在目录 (2)配置指定的dao层接口的目录 3.mybatis注意事项 1.xml中的sql不得有分号 2.sql语句操作的表明和列名 3.xml中的小于号:$lt;大于号¥> 4.取变量时,如果dao层接口使用的是@param("别名")注解,则根据别名取值 5.mapper.xml中$和#取值的区别 4.mybatis的xml中如何设置返回值 resultType返回的数据类型 5.$和#区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中。如:order by ${user_id}, 如果传入 的值是id,则解析成的sql为order by id. 3. #方式能够很大程度防止sql注入。 4. $方式无法防止Sql注入。 5. $方式一般用于传入数据库对象,例如传入表名. 6. 一般能用#的就别用$ MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值