使用springboot整合mybatis,通用mapper


使用springboot整合mybatis,使用通用mapper和mapper分頁插件,

1.數據庫的tingint對應java是boolean類型。

導包<!--分頁插件 -->,mybatis的springboot新建的時候選擇了。
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.5</version>
</dependency>
<!--tkmybatis -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>1.1.4</version>
</dependency>

 

yml配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=UTF-8&serverTimezone= UTC
    username: root
    password: 123456
mybatis:
  type-aliases-package: com.zy.msgaliyun.entity

 

 

  1. 創建表

CREATE TABLE `tb_user` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT,

  `username` varchar(50) NOT NULL COMMENT '用戶名',

  `password` varchar(32) NOT NULL COMMENT '密碼,加密存儲',

  `phone` varchar(20) DEFAULT NULL COMMENT '注冊手機號',

  `created` datetime NOT NULL COMMENT '創建時間',

  `salt` varchar(32) NOT NULL COMMENT '密碼加密的salt值',

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COMMENT='用戶表';

  1. 編寫實體類
@Data
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Length(min = 4, max = 30, message = "用戶名只能在4~30位之間")
    private String username;// 用戶名
    @JsonIgnore
    @Length(min = 6, max = 30, message = "密碼只能在4~30位之間")
    private String password;// 密碼
    @Pattern(regexp = "^1[35678]\\d{9}$", message = "手機號格式不正確")
    private String phone;// 電話
    private Date created;// 創建時間
    @JsonIgnore 這是jackson的注解,表示不會把該字段序列化返回給前端。
            @Column(name = "salt")

    private String salt;// 密碼的鹽值
}

l  @Table 標示數據庫表名

l  @Id  主鍵id,bigint類型

l  @GeneratedValue(strategy = GenerationType.IDENTITY)  主鍵自增長,前提是數據庫字段必須設置成autoincreament

/*

*  使用的是jpa的策略生成器

*JPA提供的四種標准用法為TABLE,SEQUENCE,IDENTITY,AUTO. 

* TABLE:使用一個特定的數據庫表格來保存主鍵。 

* SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列

* IDENTITY:主鍵由數據庫自動生成(主要是自動增長型) 

* AUTO:主鍵由程序控制。

*/

l  @Column 如果類字段和數據庫字段名不一致,用這個指定數據庫的字段名做映射。

l  @Transient 表名該字段不是數據庫的字段,不會和數據庫發生映射。

 

3編寫mapper,
 public interface UserMapper extends Mapper<User> {
}
4.配置類開啟mapper注解
@SpringBootApplication
@MapperScan("com.zy.msgaliyun.mapper")
public class MsgAliyunApplication {
    public static void main(String[] args) {
        SpringApplication.run(MsgAliyunApplication.class, args);
    }
}
5.使用
@RestController
public class TestController {
    @Autowired
    UserMapper userMapper;
    @GetMapping("/users")
    public List<User> getAllUser(){
        return userMapper.selectAll();
    }
}
 
5通用mapper提供了很多簡單的增刪改查。
 
兩種新增
 
//會有選擇性的新增, 智能判斷 brand里面有沒有空的字段,有值,用這個值,沒有值而使用數據庫的默值
insertSelective(brand) 
 
// 假如前端提交過來的 brand里面的數據是全的,用詞方法
brandMapper.insert(brand);
 
簡單查詢
/**
 * 根據實體中的屬性值進行查詢,查詢條件使用等號
 * @param record
 * @return
 */
@SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
List<T> select(T record);
 
 
/**
 * 根據實體中的屬性值進行查詢,查詢條件使用等號
 * @param record
 * @return
 */
@SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
List<T> select(T record);
 
 
/**
 * 查詢全部結果
 * @return
 */
@SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
List<T> selectAll();
 
 
/**
 * 根據實體中的屬性進行查詢,只能有一個返回值,有多個結果是拋出異常,查詢條件使用等號
 * @param record
 * @return
 */
@SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
T selectOne(T record);
 
 
/**
 * 根據實體中的屬性查詢總數,查詢條件使用等號
 * @param record
 * @return
 */
@SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
int selectCount(T record);
簡單刪除
Copy
/**
 * 根據主鍵字段進行刪除,方法參數必須包含完整的主鍵屬性
 * @param key
 * @return
 */
@DeleteProvider(type = BaseDeleteProvider.class, method = "dynamicSQL")
int deleteByPrimaryKey(Object key);
 
 
/**
 * 根據實體屬性作為條件進行刪除,查詢條件使用等號
 * @param record
 * @return
 */
@DeleteProvider(type = BaseDeleteProvider.class, method = "dynamicSQL")
int delete(T record);
 
如何玩修改?
/**
 * 根據主鍵更新屬性不為null的值
 * @param record
 * @return
 */
@UpdateProvider(type = BaseUpdateProvider.class, method = "dynamicSQL")
int updateByPrimaryKeySelective(T record);
看到這個方法有沒有覺得很爽? 它根據主鍵,修改不為null的屬性,意思就是說,我們把不需要修改的地方設置為null就好了
,這樣看,前面需要我們一頓整,整啥呢? 結合實際的業務邏輯,把前端給交過來的數據最新的數據放到我們的bean中直接修改,把不需要修改的屬性設置為null,有屬性可能需要直接刪除,有的屬性可能要去別的表中查詢(別忘了加上事務 @Transactional )
/**
 * 根據主鍵更新實體全部字段,null值會被更新
 * @param record
 * @return
 */
@UpdateProvider(type = BaseUpdateProvider.class, method = "dynamicSQL")
int updateByPrimaryKey(T record);
這個方法和上面的神似
二 .分頁,過濾(模糊查詢),搜索#
API
Copy
mapper.selectByExample(example)
參照下面原生的sql.拼接查詢條件
Copy
 select * from 表名
        where name like '% X %' or  letter== 'x'
        order by  id desc
邏輯
public VO queryBrandByPage(Integer page, String key, Integer rows, String sortBy, Boolean desc) {
    //分頁  -- 使用分頁助手,在我們真正查詢之前,調用這個下面的方法,開啟分頁查詢,他很智能,會用mybatis的攔截器
    // 對接下來要執行查詢的sql進行攔截,自動的在其后面拼接  limit語句
    PageHelper.startPage(page,rows); //當前頁碼,每頁顯示的數目
 
    //過濾 --key     (StringUtils用的是comment lang3 下面的)
    // 過濾條件,key是前端用戶傳遞進來的,可能僅僅是一個 小米,  也可能是 小 ---  模糊查詢
   /*   select * from tb_brand
    where name like '% X %' or  letter== 'x'
    order by  id desc
    */
    Example example = new Example(Brand.class);
    if(StringUtils.isNotBlank(key)){  //不為空,過濾
       example.createCriteria().orLike("name","%"+key+"%").andEqualTo("letter",key.toUpperCase());
          }
 
    //排序
    if(StringUtils.isNotBlank(sortBy)) { //傳遞進來的排序不為空,設置我們的排序條件
        example.orderBy("age").desc();//排序
        
    }
 
    //查詢 獲取到list ,其實是  當前頁的數據 page對象
    List<Brand> list = brandMapper.selectByExample(example);
    if (CollectionUtils.isEmpty(list)){
        throw new Exception ;
    }
   // 解析List
    PageInfo<Brand> pageInfo = new PageInfo<>(list);
 
    return new PageResult<Brand>(pageInfo.getTotal(),list);
}
四 .拓展包--批量操作#
批量查詢,批量刪除
注意他的包啊!
Copy
import tk.mybatis.mapper.additional.idlist.IdListMapper;
public interface Mapper extends Mapper<Category> , IdListMapper<Category,Long> {}
Copy
/**
 * 根據主鍵字符串進行查詢,類中只有存在一個帶有@Id注解的字段
 * @param idList
 * @return
 */
@SelectProvider(type = IdListProvider.class, method = "dynamicSQL")
List<T> selectByIdList(@Param("idList") List<PK> idList);
 
/**
 * 根據主鍵字符串進行刪除,類中只有存在一個帶有@Id注解的字段
 * @param idList
 * @return
 */
@DeleteProvider(type = IdListProvider.class, method = "dynamicSQL")
int deleteByIdList(@Param("idList") List<PK> idList);
 
批量插入:
Copy
import tk.mybatis.mapper.additional.insert.InsertListMapper;
public interface BaseMapper<T> extends InsertListMapper<T> {}
 
 
@RegisterMapper
public interface InsertListMapper<T> {
@InsertProvider(
    type = InsertListProvider.class,
    method = "dynamicSQL"
)
int insertList(List<? extends T> var1);
}
 
 


免責聲明!

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



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