1.MyBatis注解开发

1.1.Lombok的基本使用

Lombok是SpringBoot2.1.X版本与IDEA官方支持的一个插件,它是为简化POJO类中繁杂重复代码:geter/setter/toString/hashcode/equals等,提供了一种

全注解的方式来简化我们日常项目中的代码,如今在SpringBoot与微服务项目中,Lombok是一款非常流行的插件,使用了解它可以提高我们日常的开发效率。

Lombok的使用非常简单:

①首先需要在IDEA的Settings-Plugins中去下载并安装Lombok的应用插件:

②在Maven项目中引入Lombok的依赖包:

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>

Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。

③在IDEA中设置开启对Lombok的注解Anno支持:

开启该项是为了让Lombok注解在编译阶段起到作用。

④在项目中的POJO类中使用Lombok的注解开发:

日常项目中比较常用的高频率注解:

  • @Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor;
  • @NoArgsConstructor:生成无参构造器;
  • @AllArgsConstructor:生成全参构造器;
  • @Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解

1.2.Mybatis常用注解

  • @Select:实现查询
  • @Insert:实现插入
  • @Update:实现更新
  • @Delete:实现删除
  • @Result:实现结果集封装
  • @Results:可以与@Result连用,封装多个结果集
  • @One:一对一关系结果封装
  • @Many:多对一、多对多结果封装

1.3.简单增删改查

非常简单,直接上Mapper注解查询:

public interface CustomerMapper {
@Select("select id, name, age, password, birthday from customer")
List<Customer> selectCustomers(); @Insert("insert into customer values (#{id}, #{name}, #{age}, #{password}, #{birthday})")
int insert(Customer customer); @Update("update customer set name = #{name}, password = #{password} where id = #{id}")
int update(Customer customer); @Delete("delete from customer where id = #{id}")
int delete(int id); @Select("select * from customer where id = #{id}")
Customer findOneById(int id);
}

需要注意的是需要在mybatis-config.xml配置文件中添加对应Mapper所在的类配置:

 <mappers>
<mapper class="com.fengye.mapper.CustomerMapper"></mapper>
</mappers>

1.4.一对一关联查询

表关系模型:

顾客与订单号的关系:一个顾客对应多个订单,一个订单从属于一个顾客。

设计查询思路:从一方出发,查询商品订单同时,根据当前的uid查询出当前订单对应的顾客。

对应Mapper接口及相应配置:

public interface OrderMapper {
/**
* 一对一:订单对应一个客户
* @return
*/
@Select("select * from orders")
@Results(value = {
@Result(column = "id", property = "id", id = true),
@Result(column = "ordertime", property = "orderTime"),
@Result(column = "total", property = "total"),
@Result(column = "price", property = "price"),
@Result(property = "customer", one = @One(select = "com.fengye.mapper.CustomerMapper.findOneById"), column = "uid")
})
List<Orders> selectAll(); @Select("select * from orders where uid = #{uid}")
List<Orders> findByUid(@Param("uid") int id);
} public interface CustomerMapper {
@Select("select * from customer where id = #{id}")
Customer findOneById(int id);
}

因为使用到了两个Mapper接口中的方法,所以需要引入对应的两个Mapper接口类:

 <mappers>
<mapper class="com.fengye.mapper.CustomerMapper"></mapper>
<mapper class="com.fengye.mapper.OrderMapper"></mapper>
</mappers>

1.5.一对多关联查询

相反,对应一个顾客的订单可能是多个,那么从顾客角度分析,顾客与订单的关系就是一对多关系。

相应的查询设计思路:

封装对应的Mapper注解查询接口如下:

public interface CustomerMapper {
@Select("select * from customer")
@Results({
@Result(property = "id", column = "id", id = true),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age"),
@Result(property = "password", column = "password"),
@Result(property = "birthday", column = "birthday"),
@Result(property = "ordersList", many = @Many(select = "com.fengye.mapper.OrderMapper.findByUid"),
column = "id", javaType = List.class)
})
List<Customer> selectAllList();
} public interface OrderMapper {
@Select("select * from orders where uid = #{uid}")
List<Orders> findByUid(@Param("uid") int id);
}

1.6.多对多关联查询

多对多最经典的还是用户与角色的关系,一个用户对应多个角色,一个角色可以对应多个用户。

查询设计思路:

可以从角色入手,也可以从用户入手,在设计POJO时对应在多方肯定有一个集合的属性字段,假设从用户角度出发,设计查询语句如下:

对应的Mapper接口层注解封装如下:

public interface UserMapper {
/**
* 查询出所有用户及其对应的角色
* @return
*/
@Select("select * from sys_user")
@Results({
@Result(property = "id", column = "id", id = true),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "birthday", column = "birthday"),
@Result(property = "roleList", many = @Many(select = "com.fengye.mapper.RoleMapper.findRoleListByUid"),
column = "id", javaType = List.class)
})
List<User> findAllUserRole();
} public interface RoleMapper {
@Select("select * from sys_role r, sys_user_role ur where r.id = ur.roleId and ur.userId = #{uid}")
List<Role> findRoleListByUid(@Param("uid") int uid);
}

注解开发优缺点:

注解开发相对于传统的xml可以在实际项目中一定程度的减少大量的xml配置,针对于基础简单的sql语句非常实用;

但是注解开发并不能完全替代xml,比如动态sql使用<if>条件查询等复杂sql的场景,最好还是使用xml。

本博客写作参考文档:

https://www.jianshu.com/p/2543c71a8e45  《Lombok的基本使用》

https://www.bilibili.com/video/BV1XV411e7hm?p=30  《Mybatis注解开发》

示例代码已上传至Github地址:

https://github.com/devyf/MyBatisReview/tree/master/fengye_mybatis_annotation

【java框架】MyBatis(7)--MyBatis注解开发的更多相关文章

  1. MyBatis:使用注解开发

    面向接口编程 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大 ...

  2. 8、MyBatis之使用注解开发

    9.使用注解开发 mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的.而到MyBatis 3提供了新的基于注解的配置.不幸的是,Java 注解的的表达力和灵活性十分 ...

  3. mybatis学习——使用注解开发

    前言: 一个语句既可以通过 XML 定义,也可以通过注解定义.不过,由于 Java 注解的一些限制以及某些 MyBatis 映射的复杂性,要使用大多数高级映射(比如:嵌套联合映射),仍然需要使用 XM ...

  4. Mybatis学习笔记-注解开发

    面向接口编程 根本原因:[解耦],[可拓展],[更高规范性] 接口类型: abstract class interface 使用注解开发 简单语句可用注解开发(直接查询,列名与属性名相同) 本质:反射 ...

  5. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...

  6. Mybatis之使用注解开发CRUD

    上一篇演示了怎样使用XML来操作Mybatis实现CRUD,可是大量的XML配置文件的编写是很烦人的.因此 Mybatis也提供了基于注解的配置方式,以下我们来演示一下使用接口加注解来实现CRUD的的 ...

  7. JAVA框架 Spring 和Mybatis整合(传统dao)

    一:我们使用spring处理service,mybaits处理dao层. 二:导入jar包 pom.xml文件内容: <?xml version="1.0" encoding ...

  8. java框架之Spring(5)-注解驱动开发

    准备 1.使用 maven 创建一个 java 项目,依赖如下: <dependency> <groupId>org.springframework</groupId&g ...

  9. JAVA框架 Spring 和Mybatis整合(动态代理)

    一.使用传统方式的dao的书写方式,不建议.目前采用的是动态代理的方式交给mybatis进行处理. 首先回顾下动态代理要求: 1)子配置文件的中,namespace需要是接口的全路径,id是接口的方法 ...

  10. (七)Mybatis总结之注解开发

    请移步到 https://www.cnblogs.com/lxnlxn/p/5996707.html

随机推荐

  1. HTTP笔记4--HTTP 状态码

    状态码作用.组成 HTTP 状态码负责表示客户端 HTTP 请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作.状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果. 状态码如 ...

  2. MySQL 事务日志

    重做日志(Redo log) 重做日志(Redo log),也叫做前滚日志,存放在如下位置,轮询使用,记录着内存中数据页的变化,在事务 ACID 过程中,主要实现的是 D(Durability)的作用 ...

  3. Kubernetes安装EFK教程(非存储持久化方式部署)

    1.简介 这里所指的EFK是指:ElasticSearch,Fluentd,Kibana ElasticSearch Elasticsearch是一个基于Apache Lucene的开源搜索和数据分析 ...

  4. POJ 1742 Coins 【可行性背包】【非原创】

    People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony ...

  5. Leetcode(20)-有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...

  6. CNN可视化技术总结(四)--可视化工具与项目

    CNN可视化技术总结(一)-特征图可视化 CNN可视化技术总结(二)--卷积核可视化 CNN可视化技术总结(三)--类可视化 导言: 前面介绍了可视化的三种方法--特征图可视化,卷积核可视化,类可视化 ...

  7. React 权限管理

    React 权限管理 react in depth JWT token access_token & refresh_token access token & refresh toke ...

  8. CF102920L Two Buildings【分治】【决策单调性】

    优秀的分治题目.是"2020-2021 ACM-ICPC, Asia Seoul Regional Contest"的一道题. Description There are \(n\ ...

  9. .net core 和 WPF 开发升讯威在线客服系统:怎样实现拔网线也不丢消息的高可靠通信(附视频)

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...

  10. 随手一记,关于Java日期时间格式化

    在Java中,我们大多数情况下格式化日期都是使用simpleDateFormat,比如把一个日期格式化成:2019-12-31的形式,我们一般定义模板为:yyyy-MM-dd的形式. 我们需要注意的是 ...