mybatis的mapper接口怎么注入到service层,mybatis 实体注解

  mybatis的mapper接口怎么注入到service层,mybatis 实体注解

  00-1010 1注1.1 @ tablename 1.2 @ tableid 1.3 @ tablefield 1.4 @ tablelogic 2 mapper层CRUD方法2.1添加(插入)2.2删除(删除)2.3更改(更新)2.4检查(选择)3服务层CRUD方法3.1批量添加或更新3.2查询表中的总记录

  

目录

 

  00-1010之前我们在入门案例中分析过:mp底层方法生成的SQL语句中,表名是mapper或者服务接口传入的泛型类型的首字母是小写,表中的字段名是泛型类的封装属性。如果表名与类名不对应,则需要在实体类上使用@TableName注释来修改此时由实体类绑定的表。

  @TableName(对应的表名)

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

  my Batis-Plus : Global-config 3360 db-config 3360 table-Prefix :表名的公共前缀

  在00-1010 MP中,实体类中名为id的属性将被用作主键,以默认对应于表的id主键。但是,如果实体类的属性与表中的主键同名,但不是id而是cid或uid等。由于找不到主键,功能将无法实现,并报错。因此,需要在实体类的属性上使用@TableId注释,将属性对应的表中的字段标记为表的主键。

  @TableId

  现在,有一种情况,如果实体类中的属性不同于表中的主键,则应该在实体类的属性上使用@TableId注释的value属性,以将两者对应起来。

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

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

  @TableId(type=IdType。自动)

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

  my batis-plus : global-config : db-config : id-type : auto

  雪花算法

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

  最高位是符号位加0减1,id一般是41位(毫秒级)10位的正数。作为机器的ID,12位作为毫秒内的序列号,整体上有按时间递增排序的优点,整个分布式系统不会发生ID冲突,效率高。

  00-1010 MP默认会将表中字段名中的下划线转换成驼峰名,即实体类中的userName属性对应数据库中的user_name字段。如果主键不对应,使用@TableId批注;如果公共字段不对应,可以在实体类的属性上使用@TableField注释。

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

  00-1010 @ tablelogic注释是将字段设置为伪删除,即在执行删除方法时,将该字段对应的值设置为1,然后查询该记录时将不显示字段为1的记录。首先要在数据库表中创建一个字段来标记是否删除(默认值为0,即不删除),实体类创建的对应属性要标记注释:

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

  @ Testpublic 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才显示

  

@Testpublic 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接口相对应的接口实现类@Mapperpublic interface UserMapper extends BaseMapper<User> {}

 

  

2.1 增(insert)

@Testpublic 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层接口,实体类),这样做的好处是还可以在实现类里实现自定义业务方法

 

  

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

 

  

3.1 批量添加或者更新

批量添加saveBatch

 

  

@Testpublic 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属性在表中存在)@Testpublic 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 查询表中总记录数

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

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

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: