mybatis系列-tkmybatis-06-使用注解方式扩展接口,进行多表关联查询

        前面介绍了使用xml方式扩展数据库操作接口,其实,mybatis 注解方式 和 XML配置方式两者的使用基本上相同,只有在构建 SQL 脚本有所区别,所以这里重点介绍两者之间的差异,还是以多表关联查询举个例子。

示例

    还是上一章的需求,相比于上一章,我们在UsersMapper中增加selectAllUsersOrdersByAnnotation方法,然后在该方法上增加@Select注解和用于将返回结果映射到pojo对象中的@Results注解(跟xml中的ResultMap类似)

package com.example.demotkmybatisgeneralsecond.mapper;

import com.example.demotkmybatisgeneralsecond.pojo.UserOrders;

import com.example.demotkmybatisgeneralsecond.pojo.Users;

import org.apache.ibatis.annotations.Result;

import org.apache.ibatis.annotations.Results;

import org.apache.ibatis.annotations.Select;

import org.apache.ibatis.type.JdbcType;

import tk.mybatis.mapper.common.Mapper;

import java.util.List;



public interface UsersMapper extends Mapper<Users> {

    /*xml方式扩展接口*/

    List<UserOrders> selectAllUsersOrders();

    List<UserOrders> selectUsersOrders(String userId);



    /*注解方式扩展接口*/

    @Select(

            {

                    "SELECT a.*, b.id as order_id, b.receiver_name , b.total_amount, b.real_pay_amount\n" +

                            "    FROM users a LEFT JOIN orders b on a.id = b.user_id\n" +

                            "    WHERE b.id is not NULL"

            }

    )

    @Results({

            @Result(column="id", jdbcType= JdbcType.VARCHAR, property="id",id=true),

            @Result(column="username",jdbcType=JdbcType.VARCHAR,property="username"),

            @Result(column="password",jdbcType=JdbcType.VARCHAR,property="password"),

            @Result(column="nickname",jdbcType=JdbcType.VARCHAR,property="nickname"),

            @Result(column="realname",jdbcType=JdbcType.VARCHAR,property="realname"),

            @Result(column="face",jdbcType=JdbcType.VARCHAR,property="face"),

            @Result(column="mobile",jdbcType=JdbcType.VARCHAR,property="mobile"),

            @Result(column="email",jdbcType=JdbcType.VARCHAR,property="email"),

            @Result(column="sex",jdbcType=JdbcType.INTEGER,property="sex"),

            @Result(column="birthday",jdbcType=JdbcType.DATE,property="birthday"),

            @Result(column="created_time",jdbcType=JdbcType.TIMESTAMP,property="createdTime"),

            @Result(column="updated_time",jdbcType=JdbcType.TIMESTAMP,property="updatedTime"),

            @Result(column="order_id",jdbcType=JdbcType.VARCHAR,property="orderId"),

            @Result(column="receiver_name",jdbcType=JdbcType.VARCHAR,property="receiverName"),

            @Result(column="total_amount",jdbcType=JdbcType.INTEGER,property="totalAmount"),

            @Result(column="real_pay_amount",jdbcType=JdbcType.INTEGER,property="realPayAmount")

    })

    List<UserOrders> selectAllUsersOrdersByAnnotation();

}

 

        按如上方式修改UserMapper后,重启服务,注入到Service层中的UserMapper就增加了自定义的联表查询方法。

 

主要注解介绍

mybatis 注解方式的最大特点就是取消了 Mapper 的 XML 配置,具体的 SQL 脚本直接写在 Mapper 类上动态生成 。

mybatis 提供的常用注解有: @Insert 、@Update 、@Select、 @Delete 等标签,这些注解其实就是 MyBatis 提供的来取代其 XML配置文件的。

1、@Select 注解

@Select,主要在查询的时候使用,查询类的注解,一般简单的查询可以使用这个注解。

@Select({

"select",

"id, company_id, username, password, nickname, age, sex, job, face_image, province, ",

"city, district, address, auth_salt, last_login_ip, last_login_time, is_delete, ",

"regist_time",

"from sys_user",

"where id = #{id,jdbcType=VARCHAR}"

})

@Results({

@Result(column="id", property="id", jdbcType=JdbcType.VARCHAR, id=true),

@Result(column="company_id", property="companyId", jdbcType=JdbcType.VARCHAR),

@Result(column="face_image", property="faceImage", jdbcType=JdbcType.VARCHAR),

@Result(column="auth_salt", property="authSalt", jdbcType=JdbcType.VARCHAR),

@Result(column="last_login_ip", property="lastLoginIp", jdbcType=JdbcType.VARCHAR),

@Result(column="last_login_time", property="lastLoginTime", jdbcType=JdbcType.TIMESTAMP),

@Result(column="is_delete", property="isDelete", jdbcType=JdbcType.INTEGER),

@Result(column="regist_time", property="registTime", jdbcType=JdbcType.TIMESTAMP)

})

User selectByPrimaryKey(String id);

注意:如果是多个参数,需要将 #后面的参数和传入的变量名保持一致。

 

2、@Insert 注解

@Insert,插入数据时使用,直接传入数据实体类,mybatis 会属性自动解析到对应的参数。所以需要将 #后面的参数和实体类属性保持一致。

 

@Insert({

"insert into sys_user (id, company_id, ",

"username, password, ",

"nickname, age, sex, ",

"job, face_image, ",

"province, city, ",

"district, address, ",

"auth_salt, last_login_ip, ",

"last_login_time, is_delete, ",

"regist_time)",

"values (#{id,jdbcType=VARCHAR}, #{companyId,jdbcType=VARCHAR}, ",

"#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, ",

"#{nickname,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{sex,jdbcType=INTEGER}, ",

"#{job,jdbcType=INTEGER}, #{faceImage,jdbcType=VARCHAR}, ",

"#{province,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, ",

"#{district,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, ",

"#{authSalt,jdbcType=VARCHAR}, #{lastLoginIp,jdbcType=VARCHAR}, ",

"#{lastLoginTime,jdbcType=TIMESTAMP}, #{isDelete,jdbcType=INTEGER}, ",

"#{registTime,jdbcType=TIMESTAMP})"

})

int insert(User record);

 

注意:需要将 #后面的参数和实体类属性保持一致。

 

3、@Update 注解

@Update,一般数据更新操作可以使用 @Update注解实现。

@Update({

"update sys_user",

"set company_id = #{companyId,jdbcType=VARCHAR},",

"username = #{username,jdbcType=VARCHAR},",

"password = #{password,jdbcType=VARCHAR},",

"nickname = #{nickname,jdbcType=VARCHAR},",

"age = #{age,jdbcType=INTEGER},",

"sex = #{sex,jdbcType=INTEGER},",

"job = #{job,jdbcType=INTEGER},",

"face_image = #{faceImage,jdbcType=VARCHAR},",

"province = #{province,jdbcType=VARCHAR},",

"city = #{city,jdbcType=VARCHAR},",

"district = #{district,jdbcType=VARCHAR},",

"address = #{address,jdbcType=VARCHAR},",

"auth_salt = #{authSalt,jdbcType=VARCHAR},",

"last_login_ip = #{lastLoginIp,jdbcType=VARCHAR},",

"last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},",

"is_delete = #{isDelete,jdbcType=INTEGER},",

"regist_time = #{registTime,jdbcType=TIMESTAMP}",

"where id = #{id,jdbcType=VARCHAR}"

})

int updateByPrimaryKey(User record);

4、@Delete 注解

@Delete 数据删除的注解

@Delete({

"delete from sys_user",

"where id = #{id,jdbcType=VARCHAR}"

})

int deleteByPrimaryKey(String id);

 

5、@Results 和 @Result 注解 

@Results 和 @Result 主要作用是,当有一些特殊的场景需要处理,查询的返回结果与期望的数据格式不一致时,可以将将数据库中查询到的数值自动转化为具体的属性或类型,,修饰返回的结果集。比如查询的对象返回值属性名和字段名不一致,或者对象的属性中使用了枚举等。如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。

 

@Select({

"select",

"id, company_id, username, password, nickname, age, sex, job, face_image, province, ",

"city, district, address, auth_salt, last_login_ip, last_login_time, is_delete, ",

"regist_time",

"from sys_user",

"where id = #{id,jdbcType=VARCHAR}"

})

@Results({

@Result(column="id", property="id", jdbcType=JdbcType.VARCHAR, id=true),

@Result(column="company_id", property="companyId", jdbcType=JdbcType.VARCHAR),

@Result(column="face_image", property="faceImage", jdbcType=JdbcType.VARCHAR),

@Result(column="auth_salt", property="authSalt", jdbcType=JdbcType.VARCHAR),

@Result(column="last_login_ip", property="lastLoginIp", jdbcType=JdbcType.VARCHAR),

@Result(column="last_login_time", property="lastLoginTime", jdbcType=JdbcType.TIMESTAMP),

@Result(column="is_delete", property="isDelete", jdbcType=JdbcType.INTEGER),

@Result(column="regist_time", property="registTime", jdbcType=JdbcType.TIMESTAMP)

})

User selectByPrimaryKey(String id);

 

上面的例子可以看到,数据库中的company_id 字段和实体类中定义的 companyId 属性的名称不一致,需要Result 转换。

 

以上就是项目中常用的增、删、改、查的操作, 当然这些在基本的方法不需要手动写,不管是tkMybatis还是Mybatis Spring默认都是支持的。讲这些主要是熟悉这些常用的注解。

传参方式

上面介绍了mybatis 常用的注解,如何实现增删改查的操作,相信很多人会有疑问了: mybatis 是如何将参数传递到 SQL 中的呢,都有哪几种传参方式呢? 下面就来一一介绍mybatis 注解版的传参方式。其实跟xml配置比较类似。

1、直接传参

对于单个参数的方法,可直接使用 #{id} 的方式接收同名的变量参数。

@Delete("delete from sys_user where id = #{id,jdbcType=VARCHAR}")

int deleteByPrimaryKey(String id);

 

2、使用 @Param 注解

@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 。如果你的方法有多个参数,@Param 注解 会在方法的参数上就能为它们取自定义名字,参数则先以 "param" 作前缀,再加上它们的参数位置作为参数别名。例如, #{param1}、 #{param2},这个是默认值。如果注解是 @Param("person"),那么参数就会被命名为 #{person}。

@Select("SELECT * FROM sys_user WHERE username = #{username} and password = #{password}")

List<User> getListByUserSex(@Param("username") String userName, @Param("password") String password);


// 不自定义param 时,默认使用 param + 参数序号 或者 0,1,值就是参数的值。

@Select("SELECT * FROM sys_user WHERE username = #{param1} and password = #{param2}")

List<User> getListByUserSex(String userName, String password);

 

3、Map 传值 

需要传送多个参数时,也可以考虑使用 Map的形式。

@Select("SELECT * FROM sys_user WHERE username=#{username} AND password = #{password}")

List<User> getListByNameAndSex(Map<String, Object> map);

//调用时将参数依次加入到 Map 中即可。

Map param= new HashMap();

param.put("username","admin");

param.put("password","123456");

List<User> users = userMapper.getListByNameAndSex(param)

 

4、使用pojo对象

使用pojo对象传参是比较常用的传参方式。像上面的insert、update 等方法。都是直接传入user对象。

@Update({

"update sys_user",

"set company_id = #{companyId,jdbcType=VARCHAR},",

"username = #{username,jdbcType=VARCHAR},",

"password = #{password,jdbcType=VARCHAR},",

"nickname = #{nickname,jdbcType=VARCHAR},",

"age = #{age,jdbcType=INTEGER},",

"sex = #{sex,jdbcType=INTEGER},",

"job = #{job,jdbcType=INTEGER},",

"face_image = #{faceImage,jdbcType=VARCHAR},",

"province = #{province,jdbcType=VARCHAR},",

"city = #{city,jdbcType=VARCHAR},",

"district = #{district,jdbcType=VARCHAR},",

"address = #{address,jdbcType=VARCHAR},",

"auth_salt = #{authSalt,jdbcType=VARCHAR},",

"last_login_ip = #{lastLoginIp,jdbcType=VARCHAR},",

"last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},",

"is_delete = #{isDelete,jdbcType=INTEGER},",

"regist_time = #{registTime,jdbcType=TIMESTAMP}",

"where id = #{id,jdbcType=VARCHAR}"

})

int updateByPrimaryKey(User record);

以上,就是Mybatis 传参的四种方式。根据方法的参数选择合适的传值方式。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Mybatis-Plus是一个基于Mybatis的增强工具,它提供了很多方便的注解进行多表查询。其中常用的注解有: 1. @TableName:用于指定实体类对应的数据库表名。 2. @TableField:用于指定实体类属性对应的数据库字段名。 3. @TableId:用于指定实体类属性对应的数据库主键字段名。 4. @JoinTable:用于指定多表查询中的关联表和关联字段。 5. @Select:用于指定查询语句,可以使用Mybatis的动态SQL语句。 6. @Results:用于指定查询结果集的映射关系。 使用这些注解可以方便地进行多表查询,减少手写SQL的工作量。同时,Mybatis-Plus还提供了很多其他的增强功能,如自动填充、逻辑删除等,可以大大提高开发效率。 ### 回答2: MyBatis-Plus是一个开源的MyBatis框架的增强工具,可以极大地简化开发人员在使用MyBatis框架时的开发难度,其提供的注解和方法大大简化了开发的过程。当我们需要进行多表查询时,MyBatis-Plus也提供了相应的注解来帮助我们快速完成这个任务。 1. @TableJoin注解 @TableJoin注解表明了我们进行多表连接查询,其支持以下的参数: - type:连接类型,有LEFT_JOIN、RIGHT_JOIN、INNER_JOIN、FULL_JOIN。 - entity:需要连接的实体类。 - alias:连接的实体类别名。 2. @PageableDefault注解 @PageableDefault注解可以应用于方法参数级别,指定分页参数的默认值。 3. @Select注解 @Select注解指定一个查询操作的SQL语句,其支持以下的参数: - value: SQL语句。 - countQuery:查询总数的SQL语句 。 4. @SelectProvider注解 @SelectProvider注解指定具体的Provider类,在这个类中我们会实现查询SQL的生成逻辑。 总的来说,MyBatis-Plus提供了多种多表查询的注解来满足我们开发中的需求,这些注解可以极大的减少我们的开发成本,让我们更加专注于业务的实现。同时,MyBatis-Plus也提供了完备的文档,这些文档包含了所有需要用到的注解以及具体的使用方法,让我们更加快捷地进行开发。 ### 回答3: MyBatis-Plus是基于MyBatis的一个增强工具,其提供了很多实用的功能,其中包括多表查询注解多表查询注解使用非常简单,只需要在需要查询的实体类上添加对应的注解即可,例如: ```java @TableName(value = "user") public class User { @TableId(value = "id") private Long id; @TableField(value = "username") private String username; private String password; // getter和setter省略 } @TableName(value = "order") public class Order { @TableId(value = "id") private Long id; private Long userId; private BigDecimal amount; // getter和setter省略 } ``` 假设需要查询用户信息和每个用户的订单总金额,可以通过使用@SqlSelect注解和@Join注解来实现: ```java @SqlSelect("select u.*, sum(o.amount) as total_amount from user u left join order o on u.id = o.user_id group by u.id") public class UserOrderVo { @TableId(value = "id") private Long id; @TableField(value = "username") private String username; private String password; @TableField(value = "total_amount") private BigDecimal totalAmount; // getter和setter省略 } ``` 上述代码中,@SqlSelect注解表示自定义SQL查询语句,@Join注解表示关联查询,其中on属性表示关联条件,type属性表示关联类型,joinColumns和referencedColumns属性表示连接的两个表的关联字段。 除了@SqlSelect和@Join注解MyBatis-Plus还提供了@SqlSeq和@SqlKey注解,用于自定义序列查询和主键生成策略。总之,MyBatis-Plus多表查询注解可以极大地简化复杂的多表查询操作,提高工作效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值