欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

什么是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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

    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-10
  • SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件

    SpringBoot如何基于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-08
  • SpringMVC的Dispatcher解讀

    SpringMVC的Dispatcher解讀

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

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

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

    java?zip文件解壓后無(wú)法刪除原zip文件問(wèn)題

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

    Hibernate 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
  • 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種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot如何優(yōu)雅地使用Swagger2

    SpringBoot如何優(yōu)雅地使用Swagger2

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

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

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

最新評(píng)論