Mybatis-Plus实体类注解方法与mapper层和service层的CRUD方法

目录
  • 1 注解
    • 1.1 @TableName
    • 1.2 @TableId
    • 1.3 @TableField
    • 1.4 @TableLogic
  • 2 mapper层的CRUD方法
    • 2.1 增(insert)
    • 2.2 删(delete)
    • 2.3 改(update)
    • 2.4 查(select)
  • 3 service层的CRUD方法
    • 3.1 批量添加或者更新
    • 3.2 查询表中总记录数

1 注解

1.1 @TableName

  之前在入门案例中我们分析过:使用mp底层方法生成的SQL语句中,表名为mapper或者service接口传入的泛型首字母小写,表中字段名为泛型类的封装属性,如果表名与泛型名不对应的话,这个时候就需要在实体类上使用@TableName注解来修改实体类绑定的表

@TableName("对应的表名")

  有些时候我们会将一个项目所用的所有表在命名上使用一个公共前缀,使用配置文件设置之后就会在所有的实体类所对应的的表名上拼接该前缀

mybatis-plus:
global-config:
db-config:
table-prefix: 表名的公共前缀

1.2 @TableId

  mp中会默认将实体类中命名为id的属性作为主键与表的id主键相对应,但是如果实体类属性与表中的主键命名一致但不是id而是cid或者uid等的话,就会因为找不到主键而无法实现功能报错。于是就需要在实体类的属性上使用@TableId注解标注该属性对应的表中字段为该表的主键

@TableId

  现在有这么一个情况,如果实体类中的属性与表中主键不一样的话,就该在实体类的属性上使用@TableId注解的value属性将两者对应起来

@TableId(value = "该属性在表中对应的字段名")

  通过上一篇博客对mapper接口的insert方法测试发现,通过insert方法插入的记录,如果不设置id主键值的情况下,mp默认使用雪花算法(下面有拓展)生成一个id号插入到表中。如果想要将生成的id设置成根据表中主键值进行自增插入的话,首先应该将表中的主键字段设置成自增,然后将实体类的属性上使用@TableId注解的value属性设置

@TableId(type = IdType.AUTO)

  除了使用注解单个设置实体类的主键生成策略之外,还可以通过配置文件设置所有实体类的主键生成策略

mybatis-plus:
global-config:
db-config:
id-type: auto

雪花算法

雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表主键的不重复性,以及相同表主键的有序性。通过雪花算法生成的id长度共64bit(一个long型)。

  • 最高1bit是符号位正0负1,id一般是正数
  • 41bit时间截(毫秒级)
  • 10bit作为机器的ID
  • 12bit作为毫秒内的流水号

优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高

1.3 @TableField

  mp会默认将表中的字段名里的下划线转换成驼峰命名,也就是将实体类中的userName属性与数据库中的user_name字段相对应。主键不对应的话使用@TableId注解,普通字段对应不上的话,就可以在实体类的属性上使用@TableField注解

@TableField("表中对应的字段名")

1.4 @TableLogic

  @TableLogic注解就是设置字段为伪删除,也就是在执行删除方法的时候将该字段对应的值设置为1,再查询记录时不显示该字段为1的记录。 首先应该在数据库的表中创建一个字段用来标记是否删除(默认值为0即不删除),实体类创建相应的属性上用注解标注:

@TableLogic
private Integer isDeleted;

使用@TableLogic注解之后,所有的删除操作都是伪删除,就是将标记字段的值改为1

 @Test
public void deleteBatchIdsTest() {
    List<Long> list = Arrays.asList(26L, 27L, 28L);
    // UPDATE user SET is_deleted=1 WHERE cid IN ( ? , ? , ? ) AND is_deleted=0
    int result = mapper.deleteBatchIds(list);
    System.out.println("受影响的行数: " + result);
}

查询的时候会加入一个判断条件,就是标记字段的值要是0才显示

@Test
public void selectListTest() {
    // SELECT cid AS uid,name,age,email,is_deleted FROM user WHERE is_deleted=0
    List<User> users = mapper.selectList(null);
    users.forEach(System.out::println);
}

  在MP中mapper和service定义了很多的CRUD方法,可以像使用常见类API的方式直接调用使用,这些方法有很多按照方法参数的不同主要分为两大类,一种参数是wrapper放在下一章中进行讲解,另一种是接下来讲解的参数不是wrapper的方法

2 mapper层的CRUD方法

  mapper层接口继承BaseMapper接口并传入需要操作的实体类泛型

// spring框架创建mapper接口相对应的接口实现类
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

2.1 增(insert)

@Test
public void insertTest() {
   User user = new User();
   user.setName("张三");
   user.setAge(20);
   // sql语句:INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )
   int result = mapper.insert(user);
   System.out.println("受影响的行数 " + result);
}

主键id不设置的话默认使用雪花算法生成

2.2 删(delete)

根据主键删除单条记录(deleteById)

@Test
public void deleteByIdTest() {
   // DELETE FROM user WHERE id=?
   int result = mapper.deleteById(1502966571370401793L);
   System.out.println("受影响的行数: " + result);
}

根据主键删除多条记录(deleteBatchIds)

@Test
public void deleteBatchIdsTest() {
    List<Long> list = Arrays.asList(1L, 2L, 3L);
    // DELETE FROM user WHERE id IN ( ? , ? , ? )
    int result = mapper.deleteBatchIds(list);
    System.out.println("受影响的行数: " + result);
} 

多条件删除(deleteByMap)

@Test
public void deleteByMapTest() {
   HashMap<String, Object> map = new HashMap<>();
   map.put("name", "张三");
   map.put("age", 23);
   // DELETE FROM user WHERE name = ? AND age = ?
   int result = mapper.deleteByMap(map);
   System.out.println("受影响的行数: " + result);
} 

2.3 改(update)

根据主键id修改(updateById)

@Test
public void updateByIdTest() {
    User user = new User();
    user.setId(4L);
    user.setName("张三");
    user.setAge(20);
    // UPDATE user SET name=?, age=? WHERE id=?
    int result = mapper.updateById(user);
    System.out.println("受影响的行数: " + result);
}

2.4 查(select)

根据主键id查找一条记录(selectById)

@Test public void selectTest() {
    // SELECT id,name,age,email FROM user WHERE id=?
    User user = mapper.selectById(4L);
    System.out.println("查询结果为:" + user);
}

根据主键id查找多条记录(selectBatchIds)

@Test
public void selectByBatchIdsTest() {
   List<Long> list = Arrays.asList(4L, 5L);
   // SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
   List<User> users = mapper.selectBatchIds(list);
   System.out.print("查询结果为:");
   users.forEach(System.out::println);
} 

多条件查询(selectByMap)

@Test
public void selectByMapTest() {
    HashMap<String, Object> map = new HashMap<>();
    map.put("name", "张三");
    map.put("age", 20);
    // SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
    List<User> users = mapper.selectByMap(map);
    System.out.print("查询结果为:");
    users.forEach(System.out::println);
}

查询表中所有的记录(selectList)

@Test
public void selectListTest() {
    // SELECT id,name,age,email FROM user
    List<User> users = mapper.selectList(null);
    users.forEach(System.out::println);
} 

mapper层增删改查方法中的小知识点

 所有的增删改方法返回值都是受影响的行(记录)数

 以上都是单表的简单增删改查操作,如果这些功能无法满足你的需求,可以自定义SQL。可以在默认的路径(resources文件夹下的mapper文件夹)下创建mapper映射文件,或者在别的地方创建映射文件使用配置文件指定(mybatis-plus.mapper-locations),其他的操作和mybatis一样(接口方法、映射文件、调用方法)

3 service层的CRUD方法

  service层接口继承IService接口并传入需要操作的实体类泛型

public interface UserService extends IService<User> {
}

  service接口的实现类除了实现接口之外,还要继承ServiceImpl类并传入传泛型(mapper层接口,实体类),这样做的好处是还可以在实现类里实现自定义业务方法

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

3.1 批量添加或者更新

批量添加saveBatch

@Test
public void saveBatchTest() {
    // INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )
    List<User> list = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        User user = new User();
        user.setName("tom" + i);
        user.setAge(20 + i);
        list.add(user);
    }
    boolean b = userService.saveBatch(list);
    System.out.println(b);
}

批量添加或者更新saveOrUpdateBatch

第二个方法既可以用于批量添加还可以皮力量更新,判断是批量添加还是更新的依据是:看传入的列表中实体类对象是否设置了id属性或者说这个id值在表中是否存在,如果设置了id且id在表中存在的话就是批量更新,如果不设置id属性或者表中没有这个字段值的话就是批量添加。简而言之,有则改无则添

// 批量修改(因为user对象设置的id属性在表中存在)
@Test
public void saveOrUpdateBatchTest() {
    // UPDATE user SET name=?, age=? WHERE id=?
    List<User> list = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        User user = new User();
        user.setId(10L + i);
        user.setName("jack" + i);
        user.setAge(20 + i);
        list.add(user);
    }
    boolean b = userService.saveOrUpdateBatch(list);
    System.out.println(b);
}

3.2 查询表中总记录数

@Test
public void getCountTest() {
    // SELECT COUNT( * ) FROM user
    long count = userService.count();
    System.out.println(count);
}

到此这篇关于Mybatis-Plus实体类注解方法与mapper层和service层的CRUD方法的文章就介绍到这了,更多相关Mybatis-Plus CRUD方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis plus框架@TableField注解不生效问题及解决方案

    目录 一.问题描述 二.解决方案 三.关于@TableField注解失效原因的思考 四.Mapper接口LambdaQuery方法调用过程梳理 1.Mapper接口调用实际上使用的是动态代理技术 2.mybatisplus对查询的单独处理 3.findOne实际上还是要查询List 4.mybatis接口上下文信息MappedStatement 5.mybatisplus别名自动设置的逻辑 6.mybatisplus的sql日志打印 7.最终查询的执行 8.结果集处理 9.每一条数据的单独处理

  • Mybatis-Plus环境配置与入门案例分析

    目录 1 初识Mybatis-Plus 2 入门案例 前期环境准备 各层代码编写 入门案例查询结果 1 初识Mybatis-Plus   MyBatis-Plus简称 MP,是一个 MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发.提高效率而生.MyBatis-Plus有很多的特点支持很多的标准数据库,具体等学到相关特性的时候再去详细了解.MyBatis-Plus的官方文档:https://baomidou.com/ 关于MyBatis-Plus的框架结构,也就是框

  • springboot整合mybatis-plus基于注解实现一对一(一对多)查询功能

    因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来应该会实现此功能. 由于本人开发习惯的原因,实在是太讨厌大量的xml充斥在整个项目中,尤其是表的mapper.xml,虽然有代码生成器可以生成,但是有些复杂的查询还是需要手写配置文件里的动态sql,这点比较反感(至于为什么反感,也是有多方面原因的). 不过可能是大量的java开发人员已经被虐惯了,已

  • MyBatisPlus使用@TableField注解处理默认填充时间的问题

    目录 使用@TableField注解处理默认填充时间的情况 1.利用数据库填写默认时间 2.使用自动填充默认填充插入或更新数据库时 给实体类的属性添加@TableField注解 测试 测试成功的结果状态 类型设置 使用@TableField注解处理默认填充时间的情况 在数据库的表中创建时间,修改时间!这些个操作一般都是自动化完成的,我们不希望手动更新. 阿里巴巴开发手册:所有的数据库表:gmt_create,gmt_modified几乎所有的表都要配置上!而且需要自动化! 1.利用数据库填写默认

  • java开发MyBatis中常用plus实体类注解符详解

    目录 mybatis-plus常用注解符 1. 表名注解(@TableName) 2. 主键注解(@TableId) 3. 属性注解(@TableField) mybatis-plus常用注解符 1. 表名注解(@TableName) 作用:实体类和数据库中表建立对应关系:如 @TableName("thotset") public class HotsetEntity implements Serializable { private static final long serial

  • Mybatis plus逻辑删除注解@TableLogic的使用

    目录 物理删除和逻辑删除 @TableLogic注解 @TableLogic注解默认值: @TableLogic注解用法 首先这个注解是苞米豆出品,也就是我们常说的mybatis升级版的东西. 简单讲一下这个注解的用法:我们在做数据库设计的时候有时候哪怕是删除也不会真的走物理删除,毕竟这样很多数据就不可恢复了,大多数时候很多删除都是用逻辑删除. 物理删除和逻辑删除 简单来说物理删除就是真的把这条数据从数据库删除了.而逻辑删除主要是把表中的某一个字段作为标识符,一般我们常用的会默认初始为0,当我们

  • Springboot+mybatis-plus+注解实现数据权限隔离

    目录 1.创建注解 2. 具体实现 1.创建注解 当此注解打在类上,不需要传参,该类下所有查询接口开启数据隔离:打在方法上默认开启数据隔离,传参为false则该方法关闭验证 /** * 数据权限验证注解 * @author xiaohua * @date 2021/6/23 */ @Documented @Target({METHOD, ANNOTATION_TYPE, TYPE}) @Retention(RUNTIME) public @interface DataPermission { /

  • mybatisplus @Select注解中拼写动态sql异常问题的解决

    目录 mybatisplus @Select注解中拼写动态sql异常 出现原因 解决方案 在注解上使用动态SQL(@select使用if) 用script标签包围 用Provider去实现SQL拼接 说明 mybatisplus @Select注解中拼写动态sql异常 使用mybatisplus后,手写SQL语句很少了,偶尔使用@Select时, 之前一直用实体类传递参数,完全能够正常使用,今天换成了参数传递,报下面的错误 @Select("<script>" +"

  • MyBatis-Plus如何通过注解使用TypeHandler

    目录 通过注解使用TypeHandler 官方示例 Kotlin案例 自定义TypeHandler使用 通过注解使用TypeHandler 在使用MyBatis时,我们与数据表中字段映射的java中的bean的属性字段,往往包含了自定义复杂类型,比如一个varchar保存的json字符串映射到的java字段是Person类型的时候,就需要用到 “字段类型处理器了”,也就是TypeHandler. 使用MyBatis的TypeHandler的时候,自定义实现起来还是比较麻烦,需要统一配置,自动识别

  • Mybatis-Plus实体类注解方法与mapper层和service层的CRUD方法

    目录 1 注解 1.1 @TableName 1.2 @TableId 1.3 @TableField 1.4 @TableLogic 2 mapper层的CRUD方法 2.1 增(insert) 2.2 删(delete) 2.3 改(update) 2.4 查(select) 3 service层的CRUD方法 3.1 批量添加或者更新 3.2 查询表中总记录数 1 注解 1.1 @TableName   之前在入门案例中我们分析过:使用mp底层方法生成的SQL语句中,表名为mapper或者

  • Mybatis中实体类属性与数据列表间映射方法介绍

    Mybatis不像Hibernate中那么自动化,通过@Column注解或者直接使用实体类的属性名作为数据列名,而是需要自己指定实体类属性和 数据表中列名之间的映射关系,这一点让用惯了Hibernate的人很不习惯,所幸经过探索找到了建立映射关系的三种办法,其中总也有比较 简单的. 首先先定义一个实体类,如下: public class User implements Serializable { private Integer userId; private String userName;

  • springboot+mybatis通过实体类自动生成数据库表的方法

    前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</ve

  • mybatis plus实体类中字段映射mysql中的json格式方式

    目录 mybatis plus实体类中字段映射mysql中的json格式 1.实体类中有个属性是其他对象 2.那么取出时怎么进行映射呢,有分为两种情况 mybatis-plus 实体 json 处理 本文总共三个步骤 mybatis plus实体类中字段映射mysql中的json格式 1.实体类中有个属性是其他对象 或者是List:在数据库中存储时使用的是mysql的json格式,此时可以用mybatis plus的一个注解 @TableField(typeHandler = JacksonTy

  • 一文带你掌握JPA实体类注解

    目录 基本注解 @Entity @Table @Basic(未加注解的默认注解) @Transient @Column @Id @GeneratedValue @GenericGenerator 其他注解 @Enumerated @Temporal @DynamicInsert.@DynamicUpdate @Access 复合主键 @EmbeddedId + @Embeddable @IdClass @Embedded + @AttributeOverride 实体间关联关系 @OneToOn

  • java反射遍历实体类属性和类型,并赋值和获取值的简单方法

    实例如下: import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date; /** * 获取实体类型的属性名和类型 * @param model 为实体类 * @author kou 为传入参数 */ public class GetModelNameAndType { public

  • Spring main方法中如何调用Dao层和Service层的方法

    目录 Spring main方法调用Dao层和Service层的方法 如何在普通类中直接访问service层或dao层 第一种方案 第二种方案 Spring main方法调用Dao层和Service层的方法 在web环境中,一般serviceImpl中的dao之类的数据库连接都由容器启动的时候创建好了,不会报错. 但是在main中,没有这个环境,所以需要获取环境: ApplicationContext ctx = new FileSystemXmlApplicationContext("src/

  • 关于Controller层和Service层的类报错问题及解决方案

    目录 Controller层和Service层的类报错 Controller层和Service层的作用 1.在controller和service里都写那些代码? 2.在整个项目中什么时候加异常?异常怎么处理? Controller层和Service层的类报错 当出现以下这种情况的时候,可以看看pom.xml文件中是否少了jar包. 当我出现这种情况的时候,我去看pom.xml包发现,如不其然我少了一个jar包 这就是我少了的那个jar包(spring-web),把这个加上之后就可以了. <!-

  • mybatis generator 使用方法教程(生成带注释的实体类)

    引言: 最近的一个项目,由于数据库表巨多,导致需要创建N多个java实体.dao.mapper.xml映射文件,如果均使用纯手工编写,无疑需要耗费大量时间和精力.于是上网学习了mybatis generator的使用. 现在项目写完了,闲暇之余把干货奉上,供大家直接使用. 需求场景: 当你的java 项目数据库有N张表需要使用mybatis进行数据库操作时,建议使用mybatis generator 自动生成工具.可以自动帮助你生成java实体类.dao.mapper.xml等. 首先给大家分享

随机推荐