通用Mapper使用


通用Mapper介紹

產生背景

使用Mybatis的開發者大多會因為繁多的XML映射配置而頭痛不已😔,即使使用注解,大量的SQL語句也是不可避免的,當數據庫表結構發生變動時,所有對應的sql和實體類都得修改,基於此,通用Mapper出現了😊

基本概念

通用Mapper是一款用於單表增刪改查的Mybatis插件,開發人員可以省去編寫sql語句和在DAO層編寫任何方法,就能輕松實現單表的常用操作。

項目地址

支持國產,從我做起。👍通用Mapper的作者是一位國人。項目地址:

環境導入

環境說明

平台:windows
jdk版本:1.8
IDE:IDEA
數據庫:mysql(8)

項目創建

  1. 新建一個Springboot項目

    新建項目就沒啥好說了,使用IDEA自帶的Spring Initializer,一直下一步就完事了,省心

  2. 添加通用mapper依賴

    <dependency>
         <groupId>tk.mybatis</groupId>
         <artifactId>mapper-spring-boot-starter</artifactId>
         <version>2.1.5</version>
    </dependency>
    
  3. SpringBoot配置文件

    #JDBC配置
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    spring.datasource.username=root
    spring.datasource.password=root
    #mybatis配置
    mybatis.configuration.map-underscore-to-camel-case=true
    
    logging.level.root = debug
    

數據准備

  1. 建表語句
create table user(
     id int(10) auto_increment primary key,  
     name varchar(20) null,  
     email varchar(50) null 
   );

實體類編寫

package com.panda.domain;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "user")
public class User {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Integer id;
 @Column
 private String name;
 @Column
 private String email;
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getEmail() {
 return email;
 }
 public void setEmail(String email) {
 this.email = email;
 }
}

說明

  1. 表名默認使用類名,駝峰會轉換為下划線,如UserInfo對應的表名為user_info.當不滿足上述對應關系時,類名上使用@Table注解,使用name屬性指定tableName;

  2. 類的屬性名默認會采用駝峰法轉換為表字段名,如userName轉化為user_name;不滿足上述對應關系時,字段名上使用@Column注解,使用name屬性指定表字段名;

  3. 表字段沒有的屬性,可以使用@Transient注解。

  4. 至少有一個字段使用@Id標識主鍵,多個@Id注解生成聯合主鍵。

  5. @GeneratedValue指定主鍵生成策略。

Dao層

Dao層使用通用Mapper接口,只需要讓我們的接口實現Mapper 即可。

此處需注意導入的是tk.mybatis.mapper.common.Mapper而不是mybatis的Mapper

繼承該Mapper后,會獲取父接口的常用方法。

package com.panda.mapper;  
import com.panda.domain.User;  
import tk.mybatis.mapper.common.Mapper;  
public interface UserDao extends Mapper {  
}  

業務層

業務層接口:

package com.panda.service;
import com.panda.domain.User;
import java.util.List;

public interface UserService {
    User selectOne(String id);
    int addOne(User user);
    int deleteOne(int id);
    int updateOne(User user);
    List<User> selectOneNameLike(String name);
    List<User> selectAll();
}

業務層實現:

import com.panda.domain.User;
 import com.panda.mapper.UserDao;
 import com.panda.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import tk.mybatis.mapper.entity.Example;
 import java.util.List;
 @Service
 public class UserServiceImpl implements UserService {
 @Autowired
 UserDao userDao; //此處如果報錯為誤報,忽略即可
 @Override
 public User selectOne(String id) {
 return userDao.selectByPrimaryKey(id);
 }
 @Override
 public int addOne(User user) {
 return userDao.insertSelective(user);
 }
 @Override
 public int deleteOne(int id) {
 return userDao.deleteByPrimaryKey(id);
 }
 @Override
 public int updateOne(User user) {
 return userDao.updateByPrimaryKeySelective(user);
 }
 @Override
 public List<User> selectOneNameLike(String name) {
 Example example = new Example(User.class);
 example.createCriteria().andLike("name","%"+name+"%");
 return userDao.selectByExample(example);
 }
 @Override
 public List<User> selectAll() {
 return userDao.selectAll();
 }
}

通用Mapper的常見方法解析:

  • 基本增刪改查

    1. 查詢

      select(T t) :根據傳入對象屬性查詢,返回實體類元素集合。

      selectOne(T t)) :根據傳入的對象屬性查詢,存在多個返回值時拋出異常。

      selectAll() :返回實體類元素集合。

      selectCount(T t)) :根據傳入的對象屬性查詢,返回總記錄數。

    2. 刪除

      delete(T t)) 根據傳入對象屬性,刪除所有查找到的記錄。

      deleteByPrimaryKey(Object key) 根據傳入的主鍵,刪除對應記錄。

    3. 更新

      updateByPrimaryKey(Object o) 根據傳入對象屬性,更新所有字段 。

      updateByPrimaryKeySelective(T t) 只更新對象屬性非空字段 。

    4. 插入

      insert(T t)) 根據傳入對象屬性,插入所有屬性對應的字段。

      insertSelective(T t)) 根據傳入對象屬性,只插入對象屬性非空字段

  • 復雜條件查詢

    通用Mapper復雜條件查詢使用的是Example,示例語法如下:

     Example example = new Example(User.class);
     Criteria criteria = example.createCriteria()
     criteria.andLike("name","%"+name+"%");
     userDao.selectByExample(example);
    

    其中,Criteria對象可使用的方法很多,基本可以滿足常用的條件查詢:
    所有方法
    上面的方法基本從方法名就可以看出其作用,使用起來也比較方便。

顯示層

controller實現:

package com.panda.controller;
import com.panda.domain.User;
import com.panda.mapper.UserDao;
import com.panda.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Controller
public class UserController {
 @Autowired
 UserService userService;
 //增加一個
 @RequestMapping("/addOne")
 @ResponseBody
 public int addOne(){
 User user = new User();
 user.setName("uzi");
 user.setEmail("uzi@rng.com");
 return userService.addOne(user);
 }
 //刪除一個
 @RequestMapping("/deleteOne")
 @ResponseBody
 public int deleteOne(int id){
 return userService.deleteOne(id);
 }
 //更新一個
 @RequestMapping("/updateOne")
 @ResponseBody
 public int updateOne(@RequestBody User user){
 return userService.updateOne(user);
 }
 //查詢一個
 @RequestMapping("/selectOne")
 @ResponseBody
 public User selectOne(String id){
 return userService.selectOne(id);
 }
 //查詢所有
 @RequestMapping("/selectAll")
 @ResponseBody
 public List<User> selectAll(){
 return userService.selectAll();
 }
 //name模糊查詢
 @RequestMapping("/selectOneNameLike")
 @ResponseBody
 public List<User> selectOneNameLike(String name){
 return userService.selectOneNameLike(name);
 }
}

測試

  1. 測試插入
    瀏覽器輸入:[http://localhost:8080/addOne],可以看到數據庫成功插入一個,當然正常情況應該是前端請求的 時候傳入一個json對象給我們來插入數據 庫,這里偷懶使用了自己創建的User對象,不過無傷大雅。
  2. 測試更新
    瀏覽器輸入:[http://localhost:8080/updateOne],通用使用我們自己創建User對象來更新數據庫記錄。
  3. 測試查詢:[http://localhost:8080/selectOne?id=1],成功查詢到id=1的用戶
  4. 測試刪除:[http://localhost:8080/deleteOne?id=1],成功刪除id=1的用戶

通用Mapper的原理簡介

通用Mapper通過讓dao層接口繼承Mapper<T.class> 接口,在運行期通過反射獲取實體類T的信息,並構造出對應的SQL,dao層接口只需要直接調用父接口提供的方法,便可完成對應SQL的調用和數據庫查詢。

更加詳細執行過程在此🙅‍贅述,有感興趣的朋友可以訪問:

[MyBatis 通用 Mapper 實現原理](https://blog.csdn.net/chenyao1994/article/details/79254941

最后

感謝您閱讀本文,源碼已上傳github,歡迎訪問:github


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM