SpringBoot整合TKMyBatis實(shí)現(xiàn)單表增刪改查操作
什么是TKMybatis
TKMybatis 是基于Mybatis 框架開發(fā)的一個工具,內(nèi)部實(shí)現(xiàn)了對單表的基本數(shù)據(jù)操作,只需要簡單繼承 TKMybatis 提供的接口,就能夠?qū)崿F(xiàn)無需編寫任何 sql 即能完成單表操作。
SpringBoot整合TKMybatis
添加maven依賴
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
實(shí)體類注解
@Setter
@Getter
@Table(name = "user")
public class User {
/**
* 用戶ID
*/
@Id
private String id;
/**
* 用戶姓名
*/
private String userName;
/**
* 用戶密碼
*/
private String passWord;
/**
* 年齡
*/
private Integer age;
/**
* 性別
*/
private String gender;
}
@Table:描述數(shù)據(jù)庫表信息,主要屬性有name(表名)、schema、catalog、uniqueConstraints等。
@Id:指定表主鍵字段,無屬性值。
@Column:描述數(shù)據(jù)庫字段信息,主要屬性有name(字段名)、columnDefinition、insertable、length、nullable(是否可為空)、precision、scale、table、unique、updatable等。
@ColumnType:描述數(shù)據(jù)庫字段類型,可對一些特殊類型作配置,進(jìn)行特殊處理,主要屬性有jdbcType、column、typeHandler等。
其他注解如:@Transient、@ColumnResult、@JoinColumn、@OrderBy、@Embeddable等暫不描述
TKMapper接口如何使用
單表操作,只需要繼承 tk.mybatis 下的 BaseMappe接口即可使用
@Mapper
public interface UserMapper extends Mapper<User>, MySqlMapper {
}
基本增刪改操作
@Service
public class UserService {
@Resource
private UserMapper userMapper;
/**
* 根據(jù)主鍵字段進(jìn)行查詢,方法參數(shù)必須包含完整的主鍵屬性,查詢條件使用等號
*/
public User selectUserById(String userId){
return userMapper.selectByPrimaryKey(userId);
}
/**
* 查詢?nèi)拷Y(jié)果
*/
public List<User> selectAll(){
return userMapper.selectAll();
}
/**
* 根據(jù)實(shí)體中的屬性值進(jìn)行查詢,查詢條件使用等號
*/
public List<User> selectByUserName(String userName){
User user = new User();
user.setUserName(userName);
return userMapper.select(user);
}
/**
* 根據(jù)實(shí)體中的屬性進(jìn)行查詢,只能有一個返回值,有多個結(jié)果是拋出異常,查詢條件使用等號。
* 但是如果存在某個屬性為int,則會初始化為0。可能影響到實(shí)際使用
*/
public User selectOneByUserName(String userName){
User user = new User();
user.setUserName(userName);
return userMapper.selectOne(user);
}
/**
* 根據(jù)實(shí)體中的屬性查詢總數(shù),查詢條件使用等號
*/
public Integer selectUserCount(String userName){
User user = new User();
user.setUserName(userName);
return userMapper.selectCount(user);
}
/**
* 保存一個實(shí)體,null的屬性也會保存,不會使用數(shù)據(jù)庫默認(rèn)值
*/
public void addUser(String userName,String passWord,Integer age,String gender){
User user = new User();
user.setId(String.valueOf(UUID.randomUUID()));
user.setUserName(userName);
user.setAge(age);
user.setGender(gender);
user.setPassWord(passWord);
userMapper.insert(user);
}
/**
* 保存一個實(shí)體,忽略空值,即沒提交的值會使用使用數(shù)據(jù)庫默認(rèn)值
*/
public void addUserService(String userName,String passWord){
User user = new User();
user.setId(String.valueOf(UUID.randomUUID()));
user.setUserName(userName);
user.setPassWord(passWord);
userMapper.insertSelective(user);
}
/**
* 根據(jù)主鍵字段進(jìn)行刪除,方法參數(shù)必須包含完整的主鍵屬性
*/
public void deleteById(String userId){
userMapper.deleteByPrimaryKey(userId);
}
/**
* 根據(jù)實(shí)體屬性作為條件進(jìn)行刪除,查詢條件使用等號
*/
public void deleteByName(String userName){
User user = new User();
user.setUserName(userName);
userMapper.delete(user);
}
/**
* 根據(jù)主鍵更新實(shí)體全部字段,null值會被更新
*/
public void updateById(String userId,String userName){
User user = new User();
user.setId(userId);
user.setUserName(userName);
userMapper.updateByPrimaryKey(user);
}
/**
* 根據(jù)主鍵更新屬性不為null的值
*/
public void updateByIdSelective(String userId,String userName){
User user = new User();
user.setId(userId);
user.setUserName(userName);
userMapper.updateByPrimaryKeySelective(user);
}
}批量查詢和刪除
批量查詢 批量刪除集成 SelectByIdsMapper, DeleteByIdsMappe 接口
@Mapper
public interface UserMapper extends Mapper<User>, SelectByIdsMapper, DeleteByIdsMapper {
}
/**
* 批量查詢
*/
public List<User> selectUserById(List<String> userIds){
StringJoiner stringJoiner = new StringJoiner(",");
for (String userId : userIds) {
stringJoiner.add(userId);
}
return userMapper.selectByIds(stringJoiner.toString());
}
/**
* 根據(jù)ID批量刪除
*/
public void deleteById(List<String> userIds){
StringJoiner stringJoiner = new StringJoiner(",");
for (String userId : userIds) {
stringJoiner.add(userId);
}
userMapper.deleteByIds(stringJoiner.toString());
}
批量添加
批量添加需要繼承MySqlMappe接口
@Mapper
public interface UserMapper extends Mapper<User>, MySqlMapper, SelectByIdsMapper, DeleteByIdsMapper {
}
/**
* 批量添加
*/
public void batchAdd(){
List<User> list = new ArrayList();
for (int i = 1; i < 6; i++) {
User user = new User();
user.setId(String.valueOf(i));
user.setUserName("zs");
}
userMapper.insertList(list);
}
自定義查詢條件Example
圖中接口都有一個共同點(diǎn),就是需要 Example 對象作為方法的參數(shù),Example 對象包含了我們各種自定義的查詢條件,相當(dāng)于 sql 語句中 where 部分的條件。


每個接口都包含了一個方法,供我們調(diào)用??偨Y(jié)如下表:
| 方法 | 功能描述 |
|---|---|
| int deleteByExample(Object var1); | 一般參數(shù)就是Example對象,按照條件進(jìn)行刪除,返回刪除的記錄數(shù) |
| List selectByExample(Object var1); | 一般參數(shù)就是Example對象,按照條件進(jìn)行查詢,返回查詢結(jié)果集 |
| int selectCountByExample(Object var1); | 一般參數(shù)就是Example對象,按照條件進(jìn)行查詢,返回符合查詢條件的記錄數(shù) |
| T selectOneByExample(Object var1); | 一般參數(shù)就是Example對象,按照條件進(jìn)行查詢,結(jié)果只能為空或者一個,否則拋出異常 |
| int updateByExample(@Param(“record”) T var1, @Param(“example”) Object var2); | 第一個參數(shù)是新記錄,第二參數(shù)是example對象,用新記錄替換掉符合條件的舊記錄 |
| int updateByExampleSelective(@Param(“record”) T var1, @Param(“example”) Object var2); | 功能同上,只是可以僅替換掉記錄的部分字段 |
| List selectByRowBounds(T var1, RowBounds var2); | 第一個參數(shù)是查詢條件,第二個參數(shù)是 RowBounds 對象(包含2個屬性,offset 和 limit),offset 表示起始行,limit 表示需要的記錄數(shù);方法的功能是按照查詢條件進(jìn)行查詢,再按照 offset 和 limit 在結(jié)果集中取相應(yīng)數(shù)量的記錄。 |
| List selectByExampleAndRowBounds(Object var1, RowBounds var2); | 第一個參數(shù)是 Example 對象,第二個參數(shù)是 RowBounds 對象,先根據(jù) example 條件進(jìn)行查詢,再按照 offset 和 limit 取相應(yīng)數(shù)量的記錄。 |
| List selectByConditionAndRowBounds(Object var1, RowBounds var2); | 同上 |
Example 條件設(shè)置
先創(chuàng)建 Example 對象,再創(chuàng)建 Example.criteria 對象,借助這兩個對象,可以靈活地設(shè)置各種條件。Example 對象可以理解為 sql 語句層次的設(shè)置, 而 Example.criteria 對象可以理解為 sql 語句中的一個單一的條件表達(dá)式設(shè)置。
原理上可以理解為:一個 example 包含了若干個 criteria ,每個 criteria 就是 sql 語句中條件部分的一個括號部分(沒有嵌套),比如 (id = 5),criteria 包含了一個方法 void setAndOr(String andOr),它的意思相當(dāng)于在括號前面加上 and 還是 or,比如執(zhí)行了方法 setAndOr(“and”),那么 criteria 相當(dāng)于 and (id = 5),而 example 就把這些 criteria 拼湊起了,比如 example 包含了 2 個 criteria,分別是 (id = 5) 和 and (name = “張三”),那么此 example 的效果就是 (id = 5) and (name = “張三”)。
Example example = new Example(User.class); Example.Criteria criteria = example.createCriteria();
| 方法 | 功能描述 |
|---|---|
| andAllEqualTo(Object param) | 所有字段都作為 where 后面的判斷條件,判斷值就是參數(shù)實(shí)體對象 |
| andBetween(String property, Object value1, Object value2) | where property between value1 and value2 ,范圍條件,包含兩端 |
| andEqualTo(Object param) | 實(shí)體對象中不為 null 的字段作為 where 后面的判斷條件 |
| andEqualTo(String property, Object value) | 某一個<字段,值>作為 where 后面的判等條件 |
| andGreaterThan(String property, Object value) | 大于條件,某個字段大于某個值 |
| andGreaterThanOrEqualTo(String property, Object value) | 大于等于條件,某個字段大于等于某個值 |
| andIn(String property, Iterable values) | where property in (),范圍條件 |
| andIsNotNull(String property) | where property is not null,判空條件 |
| andIsNull(String property) | where property is null,判空條件 |
| andLessThan(String property, Object value) | 小于條件 |
| andLessThanOrEqualTo(String property, Object value) | 小于等于條件 |
| andLike(String property, String value) | where property like value,注意 value 應(yīng)該是一個匹配表達(dá)式 |
| andNotBetween(String property, Object value1, Object value2) | 范圍條件,不包含兩端 |
| andNotEqualTo(String property, Object value) | 要求字段不等于某個值 |
| andNotIn(String property, Iterable values) | 要求字段不在某個范圍內(nèi) |
| andNotLike(String property, String value) | 模糊查詢,要求不 like。 |
| void setAndOr(String andOr) | 上面已經(jīng)介紹過了 |
上表的方法都是“與”關(guān)系,即 and。 同樣的,有相應(yīng)的 “或” 關(guān)系,即 or。比如 orAllEqualTo、orGreaterThan 等等,都是將方法名中的 “and” 換成 “or”。
那 criteria 能否嵌套呢?能否有更方便的使用方式呢?回答:能,有。如下表:
| 方法 | 功能描述 |
|---|---|
| Example.Criteria orCondition(String condition, Object value) | condition參數(shù)是個sql字符串,可以拼接進(jìn) sql 語句的,value 是一個值,會拼接到 condition 后面的,此方法的最終結(jié)果為 or condition + value。 |
| Example.Criteria orCondition(String condition) | 功能同上,只是更加直接,一個字符串搞定,只是字符串參數(shù)可以寫成類似這種 “id = ”+getId(),“( id = “+getId()+”)”,一樣靈活,此方法的最終結(jié)果為 or condition。 |
| Example.Criteria andCondition(String condition) | 不再贅述 |
| Example.Criteria andCondition(String condition, Object value) | 不再贅述 |
Example 類包含的方法總結(jié)如下表:
| 方法 | 功能描述 |
|---|---|
| void setDistinct(boolean distinct) | 查詢的結(jié)果是否要進(jìn)行唯一性過濾,true表示過濾,false(默認(rèn))表示不過濾。 |
| void setOrderByClause(String orderByClause) | 查詢結(jié)果按照某個,或者某些字段進(jìn)行升序,降序。比如參數(shù)是 “id asc” 就是按照 id 進(jìn)行升序,“id asc,age desc” 就是按照 id 升序,在 id 相等的情況下,按照 age 降序。 |
| Example selectProperties(String… properties) | 當(dāng)利用 example 進(jìn)行查詢時,此方法可以設(shè)置想要查詢的字段是哪些,比如我只需要查詢一張表的部分字段。 |
| Example.OrderBy orderBy(String property) | 排序,與 setOrderByClause 功能一樣,只是用法不同,比如 orderBy(“id”).asc() 表示按照 id 升序, orderBy(“id”).asc().orderBy(“age”).desc() 表示按照 id 升序,再按照 age 降序 |
| Example.Criteria or() | 創(chuàng)建一個 or 方式的、空的criteria,具體的 criteria 內(nèi)容可以稍后設(shè)置。 |
| void or(Example.Criteria criteria) | 直接以 or 的方式添加一個現(xiàn)有的 criteria |
| Example.Criteria and() | 同上,不過是 and 方式 |
| void and(Example.Criteria criteria) | 同上,and 方式 |
Example 使用
public List<User> getUserByExample(String userName,String age){
Example example = new Example(User.class);
//Example.Criteria criteria = example.and();
//criteria.andEqualTo("age",age) 這里直接簡寫了
example.and().andEqualTo("age",age)
.andLike("userName",'%' +userName + '%');
List<User> users = userMapper.selectByExample(example);
return users;
}
到此這篇關(guān)于SpringBoot整合TKMyBatis實(shí)現(xiàn)單表增刪改查操作的文章就介紹到這了,更多相關(guān)SpringBoot增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java SpringBoot整合JSP和MyBatis
- SpringBoot中整合MyBatis-Plus-Join使用聯(lián)表查詢的實(shí)現(xiàn)
- IDEA創(chuàng)建SpringBoot項目整合mybatis時mysql-connector-java報錯異常的詳細(xì)分析
- SpringBoot整合mybatis-generator插件流程詳細(xì)講解
- SpringBoot整合Mybatis與MybatisPlus方法詳細(xì)講解
- SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名操作
- 手把手教你SpringBoot整合Mybatis
相關(guān)文章
java利用phantomjs進(jìn)行截圖實(shí)例教程
PlantomJs是一個基于javascript的webkit內(nèi)核無頭瀏覽器 也就是沒有顯示界面的瀏覽器,你可以在基于 webkit 瀏覽器做的事情,它都能做到。下面這篇文章主要給大家介紹了關(guān)于java利用phantomjs進(jìn)行截圖的相關(guān)資料,需要的朋友可以參考下2018-10-10
SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件
這篇文章主要介紹了SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件,poi-tl是一個基于Apache?POI的Word模板引擎,也是一個免費(fèi)開源的Java類庫2022-08-08
Hibernate Validation自定義注解校驗的實(shí)現(xiàn)
這篇文章主要介紹了Hibernate Validation自定義注解校驗的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
詳解SpringBoot構(gòu)建Docker鏡像的3種方式
這篇文章主要介紹了SpringBoot構(gòu)建Docker鏡像的3種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot如何優(yōu)雅地使用Swagger2
這篇文章主要介紹了SpringBoot如何優(yōu)雅地使用Swagger2,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07

