需求:
存在一張 message 表,且已有對應的實體類 Message,實現message 表的 CRUD 操作我們需要做什么呢?
基於 Mybatis:
需要編寫 MessageMapper 接口,並在 MessageMapper.xml 映射文件中手動編寫 CRUD 方法對應的sql語句。
基於 MP:
只需要創建 MessageMapper 接口, 並繼承 BaseMapper 接口。
我們已經有了Message、message了,並且MessageDao也繼承了BaseMapper了,接下來就使用crud方法。
前言:
mybatis在持久層框架中還是比較火的,一般項目都是基於ssm。雖然mybatis可以直接在xml中通過SQL語句操作數據庫,很是靈活。但正其操作都要通過SQL語句進行,就必須寫大量的xml文件,很是麻煩。mybatis-plus就很好的解決了這個問題。
一、mybatis-plus簡介:
Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。這是官方給的定義,關於mybatis-plus的更多介紹及特性,可以參考mybatis-plus官網。那么它是怎么增強的呢?其實就是它已經封裝好了一些crud方法,我們不需要再寫xml了,直接調用這些方法就行,就類似於JPA。
二、spring整合mybatis-plus:
正如官方所說,mybatis-plus在mybatis的基礎上只做增強不做改變,因此其與spring的整合亦非常簡單。只需把mybatis的依賴換成mybatis-plus的依賴,再把sqlSessionFactory換成mybatis-plus的即可。接下來看具體操作:
1、pom.xml:
核心依賴如下:
<!-- druid數據庫連接池啟動器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.46</version>
</dependency>
<!-- mybatis-plus啟動器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.0.1</version>
</dependency>
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.username=root spring.datasource.password=123 spring.datasource.url=jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
3、 編寫實體類:
/** * @create 2019.08.14 **/ @AllArgsConstructor @NoArgsConstructor @Accessors @Data @TableName(value = "message") public class Message implements Serializable { //value與數據庫主鍵列名一致,若實體類屬性名與表主鍵列名一致可省略value
@TableId(value = "id",type = IdType.AUTO)//指定自增策略
private Integer id; private Integer mid; private String content; @TableField(value = "column_200") private String column1; @TableField(value = "column_500") private String column2; @TableField(value = "column_5000") private String column3; }
解說:(1)@TableName是mybatis plus對表的注解,每個實體必須要加,不然會導致表不存在異常。
(2)@TableId對主鍵的注解 @TableId中有一個屬性叫type是枚舉類型,該屬性主要作用是主鍵以什么形式存在,例如IdType.AUTO自增或UUID。
(3)@TableField像及了mybatis中的resultMap,在mybatis中為什么要使用resultMap,因為當實體中的屬性名與數據庫中的表不一致時需要手動映射,resultMap的作用在於手動映射,既然說了resultMap就不能不說resultType,resultType當實體屬性與表字段一致時自動映射。 在mybatis plus使用@TableField的場景與mybatis中使用resultMap的是一致的。@TableField中還有一個屬性不能不提,就是exist,這個屬性屬於boolean類型,默認為true,意思是是否在數據表中存在,true存在,false不存在,這個的應用場景是當某個實體中需要包含其他實體時,可使用該屬性,否則自動生成的查會報錯,使用自動生成的查有關方法,默認是查所有數據表所有字段,當然可使用setSqlSelect()方法指定需要查的字段,可以在一定程度上避免該錯誤的出現,不然導致的錯誤最有可能就是找不到該字段異常(column not exist),使用exist屬性可直接避免,當然也可以在該屬性中加入static或transient修飾,與exist的作用本質上是一樣的。
4.、編寫mapper接口繼承BaseMapper接口的數據操作方法:
/** * @create 2019.08.14 **/ @Mapper public interface MessageMapper extends BaseMapper<Message> {}
解說:BaseMapper<T>中包含的就是一系列增刪改查,maven項目中可Ctrl+鼠標點擊進去查看源碼,源碼所有注釋都有,非常淺顯易懂,如果你需要加入自定義sql直接寫就行,跟mybatis一樣,在該類中新增方法,只需在對應的xml中配置即可
5、編寫Service
/** * @create 2019.08.14 **/
public interface MessageService { List<Message> getAllMessage(); List<Message> getMessageByMid(Integer mid); Integer fetchOne(Integer id,Integer mid); Integer updateMessageByModuleIdAndMessageId(Message message); Integer addMessage(Message message); Integer deleteMessage(Integer mid,Integer id); }
Service實現類:
/** * @create 2019.08.14 **/ @Service public class MessageServiceImpl implements MessageService { @Autowired private MessageMapper messageMapper; private Logger logger = LoggerFactory.getLogger(getClass()); @Override public List<Message> getAllMessage() { return messageMapper.selectList(new QueryWrapper<Message>()); } @Override public List<Message> getMessageByMid(Integer mid) { return messageMapper.selectList(new QueryWrapper<Message>().eq("mid",mid)); } @Override public Integer fetchOne(Integer id,Integer mid){ return messageMapper.selectCount(new QueryWrapper<Message>().eq("id",id).eq("mid",mid)); } @Override public Integer updateMessageByModuleIdAndMessageId(Message message){ System.out.println(message); logger.debug(message.toString()); return messageMapper.updateById(message); } @Override public Integer addMessage(Message message){ System.out.println(message); logger.debug(message.toString()); return messageMapper.insert(message); } @Override public Integer deleteMessage(Integer mid,Integer id){ logger.debug(mid+"-"+id); return messageMapper.delete(new QueryWrapper<Message>().eq("id",id).eq("mid",mid)); } }
解說:@Service注解的作用也是同mybatis之前那樣也是一樣,這個注解的作用掃描Service層,自動注解spring容器
6、編寫Controller
/** * @create 2019.08.14 **/ @RestController public class MainController { @Autowired private MessageService messageService; @GetMapping("/messages") public ModelMap getMessages(){ ModelMap map = new ModelMap(); return map.addAttribute("messages",messageService.getAllMessage()); } @GetMapping("module1") public Object getMessageType1(){ return messageService.getMessageByMid(1); } @GetMapping("module2") public Object getMessageType2(){ return messageService.getMessageByMid(2); } @PostMapping("/message") public ModelMap addMessage(@RequestBody Message message){ ModelMap map = new ModelMap(); Integer result = messageService.addMessage(message); if (result==1){ map.addAttribute("result",true); map.addAttribute("tip","添加成功!"); }else{ map.addAttribute("result",false); map.addAttribute("tip","添加失敗!"); } return map; } @DeleteMapping("/{mid}/{id}") public ModelMap deleteMessage(@PathVariable Integer mid,@PathVariable Integer id){ System.out.println(mid); System.out.println(id); ModelMap map = new ModelMap(); Integer result = messageService.deleteMessage(mid,id); if (result==1){ map.addAttribute("result",true).addAttribute("tip","刪除成功!"); }else{ map.addAttribute("result",false).addAttribute("tip","刪除失敗!"); } return map; } @PatchMapping("/message") public ModelMap updateMessage(@RequestBody Message message){ Integer one = messageService.fetchOne(message.getId(), message.getMid()); ModelMap map = new ModelMap(); if (one==1){ Integer result = messageService.updateMessageByModuleIdAndMessageId(message); if (result==1){ map.addAttribute("result",true).addAttribute("tip","更新成功!"); }else{ map.addAttribute("result",false).addAttribute("tip","更新失敗!"); } System.out.println(message); }else{ map.addAttribute("tip","查詢異常!"); } return map; } }
7、顯示結果: