之前是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})")