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

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

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

什么是TKMybatis

TKMybatis 是基于Mybatis 框架開發(fā)的一個(gè)工具,內(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)行查詢,只能有一個(gè)返回值,有多個(gè)結(jié)果是拋出異常,查詢條件使用等號。
     *  但是如果存在某個(gè)屬性為int,則會(huì)初始化為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);
    }
    /**
     *  保存一個(gè)實(shí)體,null的屬性也會(huì)保存,不會(huì)使用數(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);
    }
    /**
     *  保存一個(gè)實(shí)體,忽略空值,即沒提交的值會(huì)使用使用數(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值會(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 對象作為方法的參數(shù),Example 對象包含了我們各種自定義的查詢條件,相當(dāng)于 sql 語句中 where 部分的條件。

每個(gè)接口都包含了一個(gè)方法,供我們調(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é)果只能為空或者一個(gè),否則拋出異常
int updateByExample(@Param(“record”) T var1, @Param(“example”) Object var2);第一個(gè)參數(shù)是新記錄,第二參數(shù)是example對象,用新記錄替換掉符合條件的舊記錄
int updateByExampleSelective(@Param(“record”) T var1, @Param(“example”) Object var2);功能同上,只是可以僅替換掉記錄的部分字段
List selectByRowBounds(T var1, RowBounds var2);第一個(gè)參數(shù)是查詢條件,第二個(gè)參數(shù)是 RowBounds 對象(包含2個(gè)屬性,offset 和 limit),offset 表示起始行,limit 表示需要的記錄數(shù);方法的功能是按照查詢條件進(jìn)行查詢,再按照 offset 和 limit 在結(jié)果集中取相應(yīng)數(shù)量的記錄。
List selectByExampleAndRowBounds(Object var1, RowBounds var2);第一個(gè)參數(shù)是 Example 對象,第二個(gè)參數(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 對象,借助這兩個(gè)對象,可以靈活地設(shè)置各種條件。Example 對象可以理解為 sql 語句層次的設(shè)置, 而 Example.criteria 對象可以理解為 sql 語句中的一個(gè)單一的條件表達(dá)式設(shè)置。

原理上可以理解為:一個(gè) example 包含了若干個(gè) criteria ,每個(gè) criteria 就是 sql 語句中條件部分的一個(gè)括號部分(沒有嵌套),比如 (id = 5),criteria 包含了一個(gè)方法 void setAndOr(String andOr),它的意思相當(dāng)于在括號前面加上 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í)體對象
andBetween(String property, Object value1, Object value2)where property between value1 and value2 ,范圍條件,包含兩端
andEqualTo(Object param)實(shí)體對象中不為 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ā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 語句的,value 是一個(gè)值,會(huì)拼接到 condition 后面的,此方法的最終結(jié)果為 or condition + value。
Example.Criteria orCondition(String condition)功能同上,只是更加直接,一個(gè)字符串搞定,只是字符串參數(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é)果按照某個(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()同上,不過是 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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

太仓市| 永春县| 介休市| 新疆| 岳普湖县| 长宁区| 德格县| 平江县| 浮梁县| 上栗县| 东至县| 灌南县| 南投县| 芦溪县| 建湖县| 边坝县| 犍为县| 贺兰县| 中方县| 永吉县| 桂东县| 衡水市| 咸阳市| 盘锦市| 尼木县| 双辽市| 江山市| 周宁县| 昂仁县| 卓资县| 青州市| 奉节县| 府谷县| 图们市| 兴文县| 宁都县| 藁城市| 五峰| 江阴市| 右玉县| 和田县|