动态sql

(大概梳理一下所学的知识,格式之后再编辑)

调用Mapper接口的方法,实际上是调用了自动生成的实现类(是由 MyBatis 在运行时通过动态代理技术生成的),MyBatis 会在运行时创建一个代理对象来实现这个接口,然后在代理对象中调用相应的 SQL 语句。这个代理对象会将方法调用转发到实际执行 SQL 语句的地方。

也就是说,我们只需要面向接口编程,直接调用接口的方法。

接口不是不能new对象吗,那是怎么实现调用接口的方法的?

是因为@Mapper 注解。这个注释用于:

标识接口为Mapper接口(Mapper接口定义了一组与数据库交互的方法)这个@Mapper 注解是MyBatis提供的,这样,MyBatis 在运行时会扫描带有@Mapper  注解的接口,并为其生成实现类。这个实现类中包含了针对接口中定义的 SQL 方法的具体 SQL 语句的执行逻辑。

而且为接口生成的实例将会加入到 IOC 容器中管理。这样,其他组件就可以通过依赖注入的方式来获取这些 Mapper 接口的实例,并调用其中的方法。

所以在变量上加一个@Autowired 注解,会自动将这个Mapper接口的IOC对象实例,注入到被@Autowired 标记的变量。

然后我们就可以用这个对象调用Mapper接口里的方法了。

说到里面的方法。

先确定要做什么操作,增、删、改、查?

@Select @Update @Delete @Insert

这些都是mybatis提供的注解,作用是将标记了该注解的方法与一个特定的 SQL 语句关联起来,从而在调用该方法时执行对应的 SQL 操作。@Options可以用于配置一些额外的选项,比如是否使用自动生成的主键、设置批处理大小等。

确定操作,并且定义方法的返回值和参数,比如根据id查询员工信息,参数是Integer,返回类型是一个Emp对象。

想好sql语句怎么写,比如查询id为1的员工信息:select * from emp where id = 1

方法是:void Emp selectById(Integer id)

但是这个1要被替换成#{id}

select * from emp where id = #{id}

#{ }是 MyBatis 中的参数占位符,里面是要你准备要传入的数据,这个数据就来源于实例对象的属性值,所以命名要和类的属性名保持一致,这里面的参数名要和数据库的字段名一致,mybatis才会自动封装,否则mybatis无法正确填充到sql语句的对应位置。

如果不一致(因为字段名通常是下划线,而java的属性名是驼峰命名)可以通过以下方法:

    //1.给字段起一个别名,让字段别名和类的属性名保持一致
    @Select("select id, username, password, name, gender, image, job, entrydate, "+
            "dept_id deptId, create_time createTime, update_time updateTime from emp where id = #{id};")
    public Emp getById(Integer id);

    //2.@Results注解或@Result注解手动映射封装
        @Results({
                @Result(column = "dept_id",property = "deptId"),
                @Result(column = "create_time",property = "createTime"),
                @Result(column = "update_time",property = "updateTime")
        })
        @Select("select * from emp where id = #{id};")
        public Emp getById(Integer id);

 或者

3.在application.properties配置文件里

#开启mybaties的驼峰命名映射开关  ---自动将a_column封装到驼峰命名的属性当中
mybatis.configuration.map-underscore-to-camel-case=true

用注解写sql有个啥问题呢,就是,每个sql语句中都是#{ },如果条件查询呢?想根据几个字段去查询员工信息呢?比如:

    @Select("select * from emp where name LIKE '%${name}%' and gender = #{gender} and entrydate "+
            "between #{begin} and #{end} order by update_time desc;")//{}里是形参名
    public List<Emp> list(String name, short gender, LocalDate begin,LocalDate end);

如果我只想根据name字段去查询呢?那其他的参数都是null,就查询不到信息了。

sql语句固定死了,我们想要实现的效果是,如果只传入name的值,就只根据name字段进行查询,所以sql语句应该根据输入的条件,动态地组装。

此时我们就通过mybatis的动态sql来解决,在xml中通过<if>标签,条件为true时,才会拼接sql语句,不成立是不会拼接sql语句的。动态sql中还有很多常见的标签。

当使用 MyBatis 定义 SQL 映射关系时,可以采用两种主要的方式:

  1. 注解方式(Annotation-based):

    • 特点: 在 Mapper 接口的方法上使用注解来定义 SQL 语句以及参数和结果的映射关系。

    • 优点: 简洁直观,无需额外的 XML 配置文件,适合于简单的 CRUD 操作和快速开发。

    • 适用场景: 适合于简单的 SQL 操作、小型项目和对 XML 配置文件不太熟悉的开发者。

  2. XML 映射文件方式(XML-based):

    • 特点: 将 SQL 语句、参数映射和结果映射等内容以 XML 格式进行配置。

    • 优点: 更加灵活,可以实现更复杂的 SQL 操作和定制化需求。

    • 适用场景: 适合于复杂的 SQL 查询、大型项目和需要大量定制化的场景。

在 XML 映射文件中,可以使用 MyBatis 提供的标签来编写复杂的 SQL 逻辑,比如 ifchoosewhenotherwise 等标签,以及动态 SQL 标签如 foreachif 等。这些标签能够让根据不同的条件来动态生成 SQL 语句,实现灵活的逻辑控制。

而在注解方式中,SQL 语句通常是直接硬编码在注解中的字符串中,因此不太适合编写复杂的逻辑判断。虽然可以在注解方式中使用 Java 代码来实现逻辑判断,但是这样会使得注解变得臃肿,并且可读性会大大降低,不利于代码的维护和管理。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值