运维开发网

映射层和服务层的类标注方法和CRUD方法

运维开发网 https://www.qedev.com 2022-05-25 16:03 出处:网络
CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本

CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本


1 注解


1.1 @TableName

??在前面介绍的案例中,我们分析了:在mp底层方法生成的SQL语句中,表名是mapper或者通过服务接口传递的泛型类型的首字母是小写的,表中的字段名是泛型类的封装属性。如果表名与类名不对应,那么应该在实体类上使用@TableName注释来修改由实体类绑定的表。

@TableName("对应的表名")

??有时,我们会使用一个公共前缀来命名一个项目中使用的所有表,用配置文件设置后,前缀会拼接在所有实体类对应的表名上。

mybatis-plus:
global-config:
d b-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。自动)

??除了用注释单独设置实体类的主键生成策略外,还可以通过配置文件设置所有实体类的主键生成策略。

mybatis-plus:
全局配置:
d b-config:
id-type:auto

雪花算法

雪花算法(Snowflake algorithm)是Twitter发布的分布式主键生成算法,可以保证不同表主键的不重复和同一表主键的排序。由雪花算法生成的id的长度是64位(长类型)。

最高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,即不删除),实体类创建的对应属性要标记注释:

@TableLogicprivate Integer isDeleted;

使用@TableLogic批注后,所有删除操作都是伪删除,即把tag字段的值改为1。

@Testpublic void deleteBatchIdsTest() { Listlt;Longgt; list = Arrays.asList(26L, 27L, 28L); // UPDATE user SET is_deleted=1 WHERE cid IN ( #63; , #63; , #63; ) AND is_deleted=0 int result = mapper.deleteBatchIds(list); System.out.println("受影响的行数: " + result);}

查询时会增加一个判断条件,即如果标签字段的值为0,则显示。

@Testpublic void selectListTest() { // SELECT cid AS uid,name,age,email,is_deleted FROM user WHERE is_deleted=0 Listlt;Usergt; users = mapper.selectList(null); users.forEach(System.out::println);}

??在MP中,mapper和service定义了很多CRUD方法,可以像通用API一样直接调用和使用。根据方法参数,这些方法主要分为两类。一个参数是下一章要解释的包装器,另一个是下一个参数不是包装器方法。


2 mapper层的CRUD方法

??Mapper层接口继承BaseMapper接口,传入需要操作的实体类泛型。

// spring框架创建mapper接口相对应的接口实现类@Mapperpublic interface UserMapper extends BaseMapperlt;Usergt; {}


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

如果未设置主键id,默认情况下将使用雪花算法。


2.2 删(delete)

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

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

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

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

多条件删除(deleteByMap)

@Test public void deleteByMapTest() { HashMaplt;String, Objectgt; map = new HashMaplt;gt;(); map.put("name", "张三"); map.put("age", 23); // DELETE FROM user WHERE name = #63; AND age = #63; 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=#63;, age=#63; WHERE id=#63; 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=#63; User user = mapper.selectById(4L); System.out.println("查询结果为:" + user); }

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

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

多条件查询(selectByMap)

@Test public void selectByMapTest() { HashMaplt;String, Objectgt; map = new HashMaplt;gt;(); map.put("name", "张三"); map.put("age", 20); // SELECT id,name,age,email FROM user WHERE name = #63; AND age = #63; Listlt;Usergt; users = mapper.selectByMap(map); System.out.print("查询结果为:"); users.forEach(System.out::println); }

查询表中的所有记录(选择列表)

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

添加、删除和修改mapper层的方法中的小知识点

??的所有添加、删除和修改方法的返回值都是受影响的行数(记录数)。

??以上都是添加、删除、查询单个表的简单操作。如果这些函数不能满足你的需求,你可以自定义SQL。您可以在默认路径(resources文件夹下的mapper文件夹)下创建一个映射器映射文件,或者在其他位置创建一个映射文件并使用配置文件(mybatis-plus.mapper-locations)指定它。其他操作同mybatis(接口方法、映射文件、调用方法)。


3 service层的CRUD方法

??服务层接口继承IService接口,传入需要操作的实体类泛型。

public interface UserService extends IServicelt;Usergt; {}

??服务接口的实现类不仅实现了接口,还继承了ServiceImpl类,并将其传入泛型类(mapper层接口,实体类)。这样做的好处是,您还可以在实现类中实现定制的业务方法。

@Servicepublic class UserServiceImpl extends ServiceImpllt;UserMapper, Usergt; implements UserService {}


3.1 批量添加或者更新

添加批次保存批次

@Testpublic void saveBatchTest() { // INSERT INTO user ( id, name, age ) VALUES ( #63;, #63;, #63; ) Listlt;Usergt; list = new ArrayListlt;gt;(); for (int i = 0; i lt; 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属性在表中存在)@Testpublic void saveOrUpdateBatchTest() { // UPDATE user SET name=#63;, age=#63; WHERE id=#63; Listlt;Usergt; list = new ArrayListlt;gt;(); for (int i = 0; i lt; 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 查询表中总记录数@Testpublic void getCountTest() { // SELECT COUNT( * ) FROM user long count = userService.count(); System.out.println(count);}

关于Mybatis-Plus实体类注释方法和映射器层和服务层的CRUD方法的这篇文章到此为止。关于Mybatis-Plus CRUD方法的更多信息,请搜索搜源网之前的文章或者继续浏览下面的相关文章。

0

精彩评论

暂无评论...
验证码 换一张
取 消