Mybatis的注解开发使用

注解的作用就是代替映射xml文件,这个操作由mybatis自己实现。从上面这句话我们就知道 MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置。

注意事项:

  1. 不要再@Select等中SQL套SQL,也就是不要子查询
  2. 再service层调用mapper的时候入参也不能包含mapper的调用

我们就拿一个springboot项目来说,前提是已经在pom.xml中假如了mybatis的依赖。

第一步:在启动类上添加mapper扫描的注解

启动类上得加一个@MapperScan(“com.lc.mybatis.mapper,这是mapper获得dao文件的类全名”) 扫描某个包目录下的Mapper,将Mapper接口类交给Spring进行管理。
也可以用通配符代替包名,如:com.lc..mapper,
多个路径用逗号隔开
,如“com.lc.mybatis1.mapper”,“com.lc.mybatis2.mapper”

第二步:在mapper或者dao层的接口上添加让mybatis管理的接口

@Mapper,该注解目的就是为了不再写mapper映射文件 (UserMapper.xml),而把这个功能交给mybatis去完成,且将实现类的对象存储到spring容器中。

@Mapper
public interface UserMapper { // dao层
     User selectById(Integer id);
}

第三步:在dao或mapper的接口方法上使用注解添加sql语句

sql语句可以分为动态SQL和普通SQL,在注解这方面也是这样划分的。
注意:无论是增删改查的slq,其对于的注解功能都是一样的,划分这么多个知识为了规范和区分,就像@Component@Controller这类的注解一样。

普通SQL

都是直接在接口方法上面加注解就行

增 @Insert 插入注解 的一些特殊性

通常我们建表的时候会设置主键id,那我用注解会实现主键ID的添加吗?
对此基本上有三种方案,分别是:

  • 手动指定(应用层)
    理解就是,mybatis不知道那个字段是主键字段,都看成一般字段来处理
@Insert("INSERT INTO t_user (id, username, passwd) VALUES (#{id}, #{username}, #{passwd})")
int addUserAssignKey(User user);
// user看成当前的了上下文,那#{}里面直接填写user的属性
  • 自增主键(数据层单表)
    使用Option注解来确定哪个字段为主键,且使什么增长模式,userGeneratordKeys表示要使用自增主键,keyProperty用来指定主键字段的字段名。自增主键会使用数据库底层的自增特性。
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("INSERT INTO t_user (username, passwd) VALUES (#{username}, #{passwd})")
int addUserGeneratedKey(User user);
  • 选择主键(数据层多表) 很少用
    选择主键从数据层生成一个值,并用这个值作为主键的值。

动态SQL

动态SQL的注解实现,得结合代码;

  • @SelectProvider
  • @InsertProvider + @Options
  • @UpdateProvider
  • @DeleteProvider

以上注解由两个属性:
type 只当一个类的class对象
method 上面属性指定的类里面的某个方法名,就是我门要执行的sql,这个方法返回是一个定义了sql语句的sql对象;

注意: method引用的方法和dao层接口的方法入参要一致

例子:

public interface EmployeeMapper {
    @SelectProvider(type=Intefaceproxy.Dyno.EmployeeDynaSqlProvider.class,method="selectWhitParamSql")
    List<Employee> selectWithParam(Map<String,Object> param);
}
public class EmployeeDynaSqlProvider {
    //方法中的关键字是区分大小写的  SQL SELECT WHERE
    //该方法会根据传递过来的map中的参数内容  动态构建sql语句
    public String selectWhitParamSql(Map<String, Object> param) {
        return new SQL() {
            {
                SELECT("*");
                FROM("tb_employee");
                if (param.get("id")!=null) {
                    WHERE("id=#{id}");
                }
                if(param.get("loginname")!=null) {
                    WHERE("loginname=#{loginname}");
                }
                if(param.get("password")!=null) {
                    WHERE("password=#{password}");
                }
                if(param.get("name")!=null) {
                    WHERE("name=#{name}");
                }
                if(param.get("sex")!=null) {
                    WHERE("sex=#{sex}");
                }
                if(param.get("age")!=null) {
                    WHERE("age=#{age}");
                }
                if(param.get("phone")!=null) {
                    WHERE("phone=#{phone}");
                }
                if(param.get("sal")!=null) {
                    WHERE("sal=#{sal}");
                }
                if(param.get("state")!=null) {
                    WHERE("state=#{state}");
                }
            }
        }.toString();
    }
}

在这里插入图片描述

public String insertEmployeeSql(Employee employee) {
    return new SQL() {
      {
        INSERT_INTO("tb_employee");
        if(employee.getLoginname()!=null) {
          VALUES("loginname","#{loginname}");
        }
        if(employee.getPassword()!=null) {
          VALUES("password", "#{password}");
        }
        if(employee.getName()!=null) {
          VALUES("name", "#{name}");
        }
        if(employee.getSex()!=null) {
         VALUES("sex", "#{sex}");
       }
       if(employee.getAge()!=``null) {
          VALUES("age", "#{age}");
        }
        if(employee.getPhone()!=null) {
          VALUES("phone", "#{phone}"`);
        }
        if(employee.getSal()!=null) {
          VALUES("sal", "#{sal}");
        }
        if(employee.getState()!=null) {
          VALUES("state", "#{state}");
        }
      }
    }.toString();
 }
//updateEmployeeSql
  public String updateEmployeeSql(Employee employee) {
    return` `new` `SQL() {
      ``{
        UPDATE(``"tb_employee"``);
        if``(employee.getLoginname()!=``null``) {
          SET(``"loginname=#{loginname}"``);
        }
        if``(employee.getPassword()!=``null``) {
          SET(``"password=#{password}"``);
        }
       if``(employee.getName()!=``null``) {
          SET(``"name=#{name}"``);
        }
        if``(employee.getSex()!=``null``) {
          SET(``"sex=#{sex}"``);
        }
        if``(employee.getAge()!=``null``) {
          SET(``"age=#{age}"``);
        }
        if``(employee.getPhone()!=``null``) {
          SET(``"phone=#{phone}"``);
        }
        if(employee.getSal()!=``null``) {
         SET(``"sal=#{sal}"``);
        }
        if(employee.getState()!=``null``) {
          SET(``"state=#{state}"``);
        }
        WHERE(``"id=#{id}"``);
      }
    }.toString();
  }
//deleteEmployeeSql
public String deleteEmployeeSql(Employee employee) {
	return new SQL() {    {     
		DELETE_FROM("tb_employee");     
		if(employee.getLoginname()!=null) {     
			WHERE("loginname=#{loginname}");      	}
		if(employee.getPassword()!=null) {
			WHERE("password=#{password}");    }   
		if(employee.getName()!=null) {  
		WHERE("name=#{name}");     }
	}  }.toString();
}

扩展:

order,limit等等
在这里插入图片描述

最后,特殊情况

假如实体类的属性名称和表字段名称对不上
@Results 用于查询到的列和实体类之间的映射,把不匹配的名字匹配上

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LC超人在良家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值