亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot整合TKMyBatis實現(xiàn)單表增刪改查操作

 更新時間:2023年01月03日 15:06:06   作者:欲無緣  
據(jù)說tk.mybatis能夠讓我不寫sql代碼就可以所有單表操作問題,作為熱愛偷懶的我,怎么能放過這種機(jī)會。talk is cheap, show me the code。趕緊搞個例子爽一把先

什么是TKMybatis

TKMybatis 是基于Mybatis 框架開發(fā)的一個工具,內(nèi)部實現(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>

實體類注解

@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ù)實體中的屬性值進(jìn)行查詢,查詢條件使用等號
     */
    public List<User> selectByUserName(String userName){
        User user = new User();
        user.setUserName(userName);
        return userMapper.select(user);
    }
    /**
     *  根據(jù)實體中的屬性進(jìn)行查詢,只能有一個返回值,有多個結(jié)果是拋出異常,查詢條件使用等號。
     *  但是如果存在某個屬性為int,則會初始化為0??赡苡绊懙綄嶋H使用
     */
    public User selectOneByUserName(String userName){
        User user = new User();
        user.setUserName(userName);
        return userMapper.selectOne(user);

    }
    /**
     *  根據(jù)實體中的屬性查詢總數(shù),查詢條件使用等號
     */
    public Integer selectUserCount(String userName){
        User user = new User();
        user.setUserName(userName);
        return userMapper.selectCount(user);
    }
    /**
     *  保存一個實體,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ù)據(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ù)實體屬性作為條件進(jìn)行刪除,查詢條件使用等號
     */
    public void deleteByName(String userName){
        User user = new User();
        user.setUserName(userName);
        userMapper.delete(user);
    }
    /**
     *  根據(jù)主鍵更新實體全部字段,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

圖中接口都有一個共同點,就是需要 Example 對象作為方法的參數(shù),Example 對象包含了我們各種自定義的查詢條件,相當(dāng)于 sql 語句中 where 部分的條件。

每個接口都包含了一個方法,供我們調(diào)用。總結(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ù)實體對象
andBetween(String property, Object value1, Object value2)where property between value1 and value2 ,范圍條件,包含兩端
andEqualTo(Object param)實體對象中不為 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實現(xiàn)單表增刪改查操作的文章就介紹到這了,更多相關(guān)SpringBoot增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java利用phantomjs進(jìn)行截圖實例教程

    java利用phantomjs進(jìn)行截圖實例教程

    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文件

    這篇文章主要介紹了SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件,poi-tl是一個基于Apache?POI的Word模板引擎,也是一個免費開源的Java類庫
    2022-08-08
  • SpringMVC的Dispatcher解讀

    SpringMVC的Dispatcher解讀

    這篇文章主要介紹了SpringMVC的Dispatcher用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • zookeeper的watch機(jī)制原理解析

    zookeeper的watch機(jī)制原理解析

    Watcher,異步通知客戶端,并且刪除哈希表中對應(yīng)的 Key-Value,這篇文章主要介紹了zookeeper的watch機(jī)制詳細(xì)講解,需要的朋友可以參考下
    2022-06-06
  • java?zip文件解壓后無法刪除原zip文件問題

    java?zip文件解壓后無法刪除原zip文件問題

    這篇文章主要介紹了java?zip文件解壓后無法刪除原zip文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Hibernate Validation自定義注解校驗的實現(xiàn)

    Hibernate Validation自定義注解校驗的實現(xiàn)

    這篇文章主要介紹了Hibernate Validation自定義注解校驗的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java響應(yīng)式編程之Reactor使用示例解析

    java響應(yīng)式編程之Reactor使用示例解析

    這篇文章主要為大家介紹了java響應(yīng)式編程之Reactor使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 詳解SpringBoot構(gòu)建Docker鏡像的3種方式

    詳解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

    這篇文章主要介紹了SpringBoot如何優(yōu)雅地使用Swagger2,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java生成非對稱型加密公鑰和私鑰的方法

    Java生成非對稱型加密公鑰和私鑰的方法

    這篇文章主要介紹了Java生成非對稱型加密公鑰和私鑰的方法,涉及java非對稱加密的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論