SpringBoot整合TKMyBatis實(shí)現(xiàn)單表增刪改查操作
什么是TKMybatis
TKMybatis 是基于Mybatis 框架開(kāi)發(fā)的一個(gè)工具,內(nèi)部實(shí)現(xiàn)了對(duì)單表的基本數(shù)據(jù)操作,只需要簡(jiǎn)單繼承 TKMybatis 提供的接口,就能夠?qū)崿F(xiàn)無(wú)需編寫(xiě)任何 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ù)庫(kù)表信息,主要屬性有name(表名)、schema、catalog、uniqueConstraints等。
@Id:指定表主鍵字段,無(wú)屬性值。
@Column:描述數(shù)據(jù)庫(kù)字段信息,主要屬性有name(字段名)、columnDefinition、insertable、length、nullable(是否可為空)、precision、scale、table、unique、updatable等。
@ColumnType:描述數(shù)據(jù)庫(kù)字段類型,可對(duì)一些特殊類型作配置,進(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ù)必須包含完整的主鍵屬性,查詢條件使用等號(hào) */ public User selectUserById(String userId){ return userMapper.selectByPrimaryKey(userId); } /** * 查詢?nèi)拷Y(jié)果 */ public List<User> selectAll(){ return userMapper.selectAll(); } /** * 根據(jù)實(shí)體中的屬性值進(jìn)行查詢,查詢條件使用等號(hào) */ public List<User> selectByUserName(String userName){ User user = new User(); user.setUserName(userName); return userMapper.select(user); } /** * 根據(jù)實(shí)體中的屬性進(jìn)行查詢,只能有一個(gè)返回值,有多個(gè)結(jié)果是拋出異常,查詢條件使用等號(hào)。 * 但是如果存在某個(gè)屬性為int,則會(huì)初始化為0。可能影響到實(shí)際使用 */ public User selectOneByUserName(String userName){ User user = new User(); user.setUserName(userName); return userMapper.selectOne(user); } /** * 根據(jù)實(shí)體中的屬性查詢總數(shù),查詢條件使用等號(hào) */ public Integer selectUserCount(String userName){ User user = new User(); user.setUserName(userName); return userMapper.selectCount(user); } /** * 保存一個(gè)實(shí)體,null的屬性也會(huì)保存,不會(huì)使用數(shù)據(jù)庫(kù)默認(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); } /** * 保存一個(gè)實(shí)體,忽略空值,即沒(méi)提交的值會(huì)使用使用數(shù)據(jù)庫(kù)默認(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)行刪除,查詢條件使用等號(hào) */ public void deleteByName(String userName){ User user = new User(); user.setUserName(userName); userMapper.delete(user); } /** * 根據(jù)主鍵更新實(shí)體全部字段,null值會(huì)被更新 */ 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
圖中接口都有一個(gè)共同點(diǎn),就是需要 Example 對(duì)象作為方法的參數(shù),Example 對(duì)象包含了我們各種自定義的查詢條件,相當(dāng)于 sql 語(yǔ)句中 where 部分的條件。
每個(gè)接口都包含了一個(gè)方法,供我們調(diào)用??偨Y(jié)如下表:
方法 | 功能描述 |
---|---|
int deleteByExample(Object var1); | 一般參數(shù)就是Example對(duì)象,按照條件進(jìn)行刪除,返回刪除的記錄數(shù) |
List selectByExample(Object var1); | 一般參數(shù)就是Example對(duì)象,按照條件進(jìn)行查詢,返回查詢結(jié)果集 |
int selectCountByExample(Object var1); | 一般參數(shù)就是Example對(duì)象,按照條件進(jìn)行查詢,返回符合查詢條件的記錄數(shù) |
T selectOneByExample(Object var1); | 一般參數(shù)就是Example對(duì)象,按照條件進(jìn)行查詢,結(jié)果只能為空或者一個(gè),否則拋出異常 |
int updateByExample(@Param(“record”) T var1, @Param(“example”) Object var2); | 第一個(gè)參數(shù)是新記錄,第二參數(shù)是example對(duì)象,用新記錄替換掉符合條件的舊記錄 |
int updateByExampleSelective(@Param(“record”) T var1, @Param(“example”) Object var2); | 功能同上,只是可以僅替換掉記錄的部分字段 |
List selectByRowBounds(T var1, RowBounds var2); | 第一個(gè)參數(shù)是查詢條件,第二個(gè)參數(shù)是 RowBounds 對(duì)象(包含2個(gè)屬性,offset 和 limit),offset 表示起始行,limit 表示需要的記錄數(shù);方法的功能是按照查詢條件進(jìn)行查詢,再按照 offset 和 limit 在結(jié)果集中取相應(yīng)數(shù)量的記錄。 |
List selectByExampleAndRowBounds(Object var1, RowBounds var2); | 第一個(gè)參數(shù)是 Example 對(duì)象,第二個(gè)參數(shù)是 RowBounds 對(duì)象,先根據(jù) example 條件進(jìn)行查詢,再按照 offset 和 limit 取相應(yīng)數(shù)量的記錄。 |
List selectByConditionAndRowBounds(Object var1, RowBounds var2); | 同上 |
Example 條件設(shè)置
先創(chuàng)建 Example 對(duì)象,再創(chuàng)建 Example.criteria 對(duì)象,借助這兩個(gè)對(duì)象,可以靈活地設(shè)置各種條件。Example 對(duì)象可以理解為 sql 語(yǔ)句層次的設(shè)置, 而 Example.criteria 對(duì)象可以理解為 sql 語(yǔ)句中的一個(gè)單一的條件表達(dá)式設(shè)置。
原理上可以理解為:一個(gè) example 包含了若干個(gè) criteria ,每個(gè) criteria 就是 sql 語(yǔ)句中條件部分的一個(gè)括號(hào)部分(沒(méi)有嵌套),比如 (id = 5),criteria 包含了一個(gè)方法 void setAndOr(String andOr),它的意思相當(dāng)于在括號(hào)前面加上 and 還是 or,比如執(zhí)行了方法 setAndOr(“and”),那么 criteria 相當(dāng)于 and (id = 5),而 example 就把這些 criteria 拼湊起了,比如 example 包含了 2 個(gè) 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í)體對(duì)象 |
andBetween(String property, Object value1, Object value2) | where property between value1 and value2 ,范圍條件,包含兩端 |
andEqualTo(Object param) | 實(shí)體對(duì)象中不為 null 的字段作為 where 后面的判斷條件 |
andEqualTo(String property, Object value) | 某一個(gè)<字段,值>作為 where 后面的判等條件 |
andGreaterThan(String property, Object value) | 大于條件,某個(gè)字段大于某個(gè)值 |
andGreaterThanOrEqualTo(String property, Object value) | 大于等于條件,某個(gè)字段大于等于某個(gè)值 |
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)該是一個(gè)匹配表達(dá)式 |
andNotBetween(String property, Object value1, Object value2) | 范圍條件,不包含兩端 |
andNotEqualTo(String property, Object value) | 要求字段不等于某個(gè)值 |
andNotIn(String property, Iterable values) | 要求字段不在某個(gè)范圍內(nèi) |
andNotLike(String property, String value) | 模糊查詢,要求不 like。 |
void setAndOr(String andOr) | 上面已經(jīng)介紹過(guò)了 |
上表的方法都是“與”關(guān)系,即 and。 同樣的,有相應(yīng)的 “或” 關(guān)系,即 or。比如 orAllEqualTo、orGreaterThan 等等,都是將方法名中的 “and” 換成 “or”。
那 criteria 能否嵌套呢?能否有更方便的使用方式呢?回答:能,有。如下表:
方法 | 功能描述 |
---|---|
Example.Criteria orCondition(String condition, Object value) | condition參數(shù)是個(gè)sql字符串,可以拼接進(jìn) sql 語(yǔ)句的,value 是一個(gè)值,會(huì)拼接到 condition 后面的,此方法的最終結(jié)果為 or condition + value。 |
Example.Criteria orCondition(String condition) | 功能同上,只是更加直接,一個(gè)字符串搞定,只是字符串參數(shù)可以寫(xiě)成類似這種 “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)行唯一性過(guò)濾,true表示過(guò)濾,false(默認(rèn))表示不過(guò)濾。 |
void setOrderByClause(String orderByClause) | 查詢結(jié)果按照某個(gè),或者某些字段進(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í),此方法可以設(shè)置想要查詢的字段是哪些,比如我只需要查詢一張表的部分字段。 |
Example.OrderBy orderBy(String property) | 排序,與 setOrderByClause 功能一樣,只是用法不同,比如 orderBy(“id”).asc() 表示按照 id 升序, orderBy(“id”).asc().orderBy(“age”).desc() 表示按照 id 升序,再按照 age 降序 |
Example.Criteria or() | 創(chuàng)建一個(gè) or 方式的、空的criteria,具體的 criteria 內(nèi)容可以稍后設(shè)置。 |
void or(Example.Criteria criteria) | 直接以 or 的方式添加一個(gè)現(xiàn)有的 criteria |
Example.Criteria and() | 同上,不過(guò)是 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) 這里直接簡(jiǎn)寫(xiě)了 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java SpringBoot整合JSP和MyBatis
- SpringBoot中整合MyBatis-Plus-Join使用聯(lián)表查詢的實(shí)現(xiàn)
- IDEA創(chuàng)建SpringBoot項(xiàng)目整合mybatis時(shí)mysql-connector-java報(bào)錯(cuò)異常的詳細(xì)分析
- SpringBoot整合mybatis-generator插件流程詳細(xì)講解
- SpringBoot整合Mybatis與MybatisPlus方法詳細(xì)講解
- SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動(dòng)態(tài)表名操作
- 手把手教你SpringBoot整合Mybatis
相關(guān)文章
java利用phantomjs進(jìn)行截圖實(shí)例教程
PlantomJs是一個(gè)基于javascript的webkit內(nèi)核無(wú)頭瀏覽器 也就是沒(méi)有顯示界面的瀏覽器,你可以在基于 webkit 瀏覽器做的事情,它都能做到。下面這篇文章主要給大家介紹了關(guān)于java利用phantomjs進(jìn)行截圖的相關(guān)資料,需要的朋友可以參考下2018-10-10SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件
這篇文章主要介紹了SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件,poi-tl是一個(gè)基于Apache?POI的Word模板引擎,也是一個(gè)免費(fèi)開(kāi)源的Java類庫(kù)2022-08-08java?zip文件解壓后無(wú)法刪除原zip文件問(wèn)題
這篇文章主要介紹了java?zip文件解壓后無(wú)法刪除原zip文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Hibernate Validation自定義注解校驗(yàn)的實(shí)現(xiàn)
這篇文章主要介紹了Hibernate Validation自定義注解校驗(yàn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04詳解SpringBoot構(gòu)建Docker鏡像的3種方式
這篇文章主要介紹了SpringBoot構(gòu)建Docker鏡像的3種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06SpringBoot如何優(yōu)雅地使用Swagger2
這篇文章主要介紹了SpringBoot如何優(yōu)雅地使用Swagger2,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07