springboot整合mybatis,使用通用mapper和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>
<!--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
- 建立表
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='使用者表';
- 編寫實體類
@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)) { //傳遞進來的排序不為空,設定我們的排序條件
// 上面的 order by 可以幫我們生成, 但是後面的 id desc 需要我們自己寫
// String orderByClause = "id desc" ; 寫死了
String orderByClause = sortBy + (desc ? " DESC " : " ASC "); //坑坑坑 注意要加上 空格 不然拼接完了 就是 orderBy idASC 而不是orderBy id ASC
example.setOrderByClause(orderByClause);
}
//查詢 獲取到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);
}