最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年01月03日 15:06:06   作者:欲無緣  
據(jù)說tk.mybatis能夠讓我不寫sql代碼就可以所有單表操作問題,作為熱愛偷懶的我,怎么能放過這種機會。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ù)庫字段類型,可對一些特殊類型作配置,進行特殊處理,主要屬性有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ù)主鍵字段進行查詢,方法參數(shù)必須包含完整的主鍵屬性,查詢條件使用等號
     */
    public User selectUserById(String userId){
        return userMapper.selectByPrimaryKey(userId);
    }
    /**
     *  查詢?nèi)拷Y(jié)果
     */
    public List<User> selectAll(){
        return userMapper.selectAll();
    }
    /**
     *  根據(jù)實體中的屬性值進行查詢,查詢條件使用等號
     */
    public List<User> selectByUserName(String userName){
        User user = new User();
        user.setUserName(userName);
        return userMapper.select(user);
    }
    /**
     *  根據(jù)實體中的屬性進行查詢,只能有一個返回值,有多個結(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ù)庫默認值
     */
    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ù)庫默認值
     */
    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ù)主鍵字段進行刪除,方法參數(shù)必須包含完整的主鍵屬性
     */
    public void deleteById(String userId){
        userMapper.deleteByPrimaryKey(userId);
    }
    /**
     *  根據(jù)實體屬性作為條件進行刪除,查詢條件使用等號
     */
    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)用??偨Y(jié)如下表:

方法功能描述
int deleteByExample(Object var1);一般參數(shù)就是Example對象,按照條件進行刪除,返回刪除的記錄數(shù)
List selectByExample(Object var1);一般參數(shù)就是Example對象,按照條件進行查詢,返回查詢結(jié)果集
int selectCountByExample(Object var1);一般參數(shù)就是Example對象,按照條件進行查詢,返回符合查詢條件的記錄數(shù)
T selectOneByExample(Object var1);一般參數(shù)就是Example對象,按照條件進行查詢,結(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ù);方法的功能是按照查詢條件進行查詢,再按照 offset 和 limit 在結(jié)果集中取相應(yīng)數(shù)量的記錄。
List selectByExampleAndRowBounds(Object var1, RowBounds var2);第一個參數(shù)是 Example 對象,第二個參數(shù)是 RowBounds 對象,先根據(jù) example 條件進行查詢,再按照 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 語句中的一個單一的條件表達式設(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)該是一個匹配表達式
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字符串,可以拼接進 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é)果是否要進行唯一性過濾,true表示過濾,false(默認)表示不過濾。
void setOrderByClause(String orderByClause)查詢結(jié)果按照某個,或者某些字段進行升序,降序。比如參數(shù)是 “id asc” 就是按照 id 進行升序,“id asc,age desc” 就是按照 id 升序,在 id 相等的情況下,按照 age 降序。
Example selectProperties(String… properties)當(dāng)利用 example 進行查詢時,此方法可以設(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)文章

最新評論

白玉县| 麟游县| 邯郸市| 龙陵县| 吉安县| 金山区| 沙洋县| 高雄县| 绥芬河市| 阿克苏市| 楚雄市| 修武县| 旬邑县| 姜堰市| 海伦市| 昌平区| 大安市| 中牟县| 宣武区| 凌云县| 陇川县| 嘉峪关市| 班玛县| 营口市| 公安县| 延寿县| 观塘区| 丰顺县| 武川县| 玉田县| 古田县| 平阳县| 中牟县| 恩施市| 公安县| 阿坝县| 绥江县| 镇安县| 奎屯市| 盐源县| 雅江县|