Mybatis注解开发之动态SQL通过类方法注解

之前是xml和直接在mapper方法上面写sql,发现太麻烦了,然后上网查了一下发现个好玩的方法,就是通过类的方法来注解开发(才开始学习写博客,有问题烦请多担待)后续将继续更新,更新完毕后将取消这段说明文字

1.写对应的动态sql的类和相应方法(这里我因为马虎了,踩了大半天的坑,后来同事帮我看的时候我才注意到我哪里写错了,学习还是要仔细点啊!!!我踩得坑就在new SQL(){}里面,注意哟,new SQL(){ 这里已经有一个{了,但是下一行还有一个{哦,这样才对,可以用idea跟下源码,因为INSERT_INTO(TABLENAME)是在静态代码块里面的,如果你发现你写出来的INSERT_INTO(TABLENAME)需要让你override这个方法的话那就是因为你少了对{},同样,如果你在用userInfo信息的时候用不了也是因为你没把它放在静态代码块里去!!!

package com.xuanyuan.demo.util.sql;

import com.xuanyuan.demo.domain.UserInfo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;


/**
 * @program: now
 * @description: 用户操作相关动态sql类
 * @author: Mr.Long
 * @create: 2018-10-26 11:24
 **/
public class UserDynamicSqlProvider{

    public String insertUserSql(UserInfo userInfo){
        return new SQL(){
            {
                INSERT_INTO("user_info");
                if(userInfo.getUserName() != null && !"".equals(userInfo.getUserName())){
                    VALUES("userName","#{userName}");
                }
                if (userInfo.getLoginName() != null && !"".equals(userInfo.getLoginName())) {
                    VALUES("loginName", "#{loginName}");
                }
                if (userInfo.getUserPassword() != null && !"".equals(userInfo.getUserPassword())) {
                    VALUES("userPassword", "#{userPassword}");
                }
                if (userInfo.getUserCode() != null && !"".equals(userInfo.getUserCode())) {
                    VALUES("userCode", "#{userCode}");
                }
                if (userInfo.getUserPhone() != null && !"".equals(userInfo.getUserPhone())) {
                    VALUES("userPhone", "#{userPhone}");
                }
                if (userInfo.getUserSex() != null && !"".equals(userInfo.getUserSex())) {
                    VALUES("userSex", "#{userSex}");
                }
                if (userInfo.getUserEmail() != null && !"".equals(userInfo.getUserEmail())) {
                    VALUES("userEmail", "#{userEmail}");
                }
                if (userInfo.getUserIDcard() != null && !"".equals(userInfo.getUserIDcard())) {
                    VALUES("userIDcard", "#{userIDcard}");
                }
                if (userInfo.getUserAge() != null && !"".equals(userInfo.getUserAge())) {
                    VALUES("userAge", "#{userAge}");
                }
            }
        }.toString();
    }
}

2.mapper接口的方法上加(记得type里面要写成类名.class哦,防止新手踩坑,method就是对应的拼接sql的方法)

@XXXProvider(type = XXXClass.class,method = "XXXmethod")
package com.xuanyuan.demo.dao;

import com.xuanyuan.demo.domain.UserInfo;
import com.xuanyuan.demo.util.sql.UserDynamicSqlProvider;
import org.apache.ibatis.annotations.*;

@Mapper
public interface UserMapper {

    /**
     * 注册
     * @param userInfo  注册人信息
     * @return
     */
    @InsertProvider(type = UserDynamicSqlProvider.class,method = "insertUserSql")
    @Options(useGeneratedKeys = true,keyColumn = "userId",keyProperty = "userId")
    Integer insert(UserInfo userInfo);
}

 

PS:直接写注解的话是这样的:

在其他博客主那里看到写JdbcType的作用如下:

MyBatis 插入空值时,需要指定JdbcType 
mybatis insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换,
 

@Insert("insert into user_info(userName,loginName,userPassword,userAge,userSex,userCode,userPhone,userIDcard,userEmail) value(#{userName,jdbcType=VARCHAR},#{loginName,jdbcType=VARCHAR},#{userPassword,jdbcType=VARCHAR},#{userAge,jdbcType=INTEGER},#{userSex,jdbcType=VARCHAR},#{userCode,jdbcType=VARCHAR},#{userPhone,jdbcType=VARCHAR},#{userIDcard,jdbcType=VARCHAR},#{userEmail,jdbcType=VARCHAR})")

 

你可能感兴趣的:(我的Mybatis踩坑之旅)