MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具包,只做增强不做改变,为简化开发工作、提高生产效率而生。

一、Service CRUD 接口


【说明】:【1】通用 Service CRUD 封装 MP提供的 IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页,前缀命名方式区分 Mapper层避免混淆。
【2】采用泛型实现重复利用,泛型 T为任意实体对象。
【3】建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类[IService]
【4】对象 Wrapper 为条件构造器,可以使用 Condition代替 Wrapper。Wrapper 使用时需要 new,Condition通过静态方法创建。

Save 方法


【1】插入一条记录(选择字段,策略插入)

boolean save(T entity);

【2】批量插入

boolean saveBatch(Collection<T> entityList);

【3】批量插入,batchSize表时插入批次数量

boolean saveBatch(Collection<T> entityList, int batchSize);

【SaveOrUpdate】


【1】TableId 主键如果在表中存在则更新记录,否则插入一条新记录

boolean saveOrUpdate(T entity);

【2】根据 updateWrapper尝试更新,否继续执行 saveOrUpdate(T)方法。Wrapper 的使用后续单独说明。

boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

【3】批量修改插入or修改

boolean saveOrUpdateBatch(Collection<T> entityList);

【4】 批量修改插入or修改,同时使用 batchSize限制批次插入的数量

boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

【Remove】


【1】根据 entity 条件,删除记录

boolean remove(Wrapper<T> queryWrapper);

【2】根据 ID 删除

boolean removeById(Serializable id);

【3】根据 columnMap 条件,删除记录。传入的是表字段[不是类对象] map 对象

boolean removeByMap(Map<String, Object> columnMap);

【4】 删除(根据ID 批量删除)

boolean removeByIds(Collection<? extends Serializable> idList);

【Update】


【1】根据 UpdateWrapper 条件,更新记录需要设置 sqlset

boolean update(Wrapper<T> updateWrapper);

【2】根据 whereEntity 条件,更新记录

boolean update(T entity, Wrapper<T> updateWrapper);

【3】 根据 ID 选择修改

boolean updateById(T entity);

【4】 根据ID 批量更新

boolean updateBatchById(Collection<T> entityList);

【4】 根据ID 批量更新,batchSize 表示更新批次数量

boolean updateBatchById(Collection<T> entityList, int batchSize);

【Get】


【1】根据 ID 查询

T getById(Serializable id);

【2】根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

T getOne(Wrapper<T> queryWrapper);

【3】根据 Wrapper,查询一条记录,throwEx 有多个值时,是否抛错

T getOne(Wrapper<T> queryWrapper, boolean throwEx);

【4】 根据 Wrapper,查询一条记录,Wrapper<T> 实体对象封装操作类 QueryWrapper

Map<String, Object> getMap(Wrapper<T> queryWrapper);

【5】 根据 Wrapper,查询一条记录,Function 表示转化函数

<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

【List】


【1】查询所有

List<T> list();

【2】查询列表

List<T> list(Wrapper<T> queryWrapper);

【3】查询(根据ID 批量查询)

Collection<T> listByIds(Collection<? extends Serializable> idList);

【4】查询(根据 columnMap 条件)

Collection<T> listByMap(Map<String, Object> columnMap);

【5】查询所有列表

List<Map<String, Object>> listMaps();

【6】查询列表

List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);

【7】查询全部记录

List<Object> listObjs();

【8】查询全部记录

<V> List<V> listObjs(Function<? super Object, V> mapper);

【9】根据 Wrapper 条件,查询全部记录

List<Object> listObjs(Wrapper<T> queryWrapper);

【10】根据 Wrapper 条件,查询全部记录

<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

【Page】


【1】无条件翻页查询

IPage<T> page(IPage<T> page);

【2】翻页查询

IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);

【3】无条件翻页查询

IPage<Map<String, Object>> pageMaps(IPage<T> page);

【4】翻页查询

IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

【Count】


【1】查询总记录数

int count();

【2】根据 Wrapper 条件,查询总记录数

int count(Wrapper<T> queryWrapper);

Chain-query】


【1】链式查询普通

QueryChainWrapper<T> query();

【2】链式查询 lambda 式。注意:不支持 Kotlin

LambdaQueryChainWrapper<T> lambdaQuery();

【3】示例:

query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();

Chain-update】


【1】链式更改普通

UpdateChainWrapper<T> update();

【2】链式更改 lambda 式。注意:不支持 Kotlin

LambdaUpdateChainWrapper<T> lambdaUpdate();

【3】示例:

1 update().eq("column", value).remove();
2 lambdaUpdate().eq(Entity::getId, value).update(entity);

二、Mapper CRUD 接口


说明【1】通用 CRUD 封装 BaseMapper接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器;
【2】泛型 T 为任意实体对象;
【3】参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键;
对象 Wrapper 为 条件构造器

【Select】


【1】根据 ID 查询

T selectById(Serializable id);

【2】根据 entity 条件,查询一条记录

T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【3】查询(根据ID 批量查询)

List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

【4】根据 entity 条件,查询全部记录

List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【5】查询(根据 columnMap 条件)

List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

【6】根据 Wrapper 条件,查询全部记录

List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【7】根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值

List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【8】根据 entity 条件,查询全部记录(并翻页)

IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【9】根据 Wrapper 条件,查询全部记录(并翻页)

IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【10】根据 Wrapper 条件,查询总记录数

Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【Insert】


【1】插入一条记录,entity表示实体对象;

int insert(T entity);

【Delete】


【1】根据 entity 条件,删除记录

int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);

【2】删除(根据ID 批量删除)

int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

【3】根据 ID 删除

int deleteById(Serializable id);

【4】根据 columnMap 条件,删除记录

int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

【Update】


【1】根据 whereEntity 条件,更新记录

int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

【2】根据 ID 修改

int updateById(@Param(Constants.ENTITY) T entity);

【Select】


【1】根据 ID 查询

T selectById(Serializable id);

【2】根据 entity 条件,查询一条记录

T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【3】查询(根据ID 批量查询)

List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

【4】根据 entity 条件,查询全部记录

List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【5】查询(根据 columnMap 条件)

List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

【6】根据 Wrapper 条件,查询全部记录

List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【7】根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值

List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【8】根据 entity 条件,查询全部记录(并翻页)

IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【9】根据 Wrapper 条件,查询全部记录(并翻页)

IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【10】根据 Wrapper 条件,查询总记录数

Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

类型 参数名 描述
Serializable id 主键ID
Wrapper<T> queryWrapper 实体对象封装操作类(可以为 null)
Collection<? extends Serializable> idList 主键ID列表(不能为 null 以及 empty)
Map<String, Object> columnMap 表字段 map 对象
IPage<T> page 分页查询条件(可以为 RowBounds.DEFAULT)

三、条件构造器


【1】以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中
【2】以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true
【3】以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)
【4】以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例:Entity::getId,Entity为实体类,getId为字段id的getMethod)
【5】以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名,另当R具体类型为SFunction时项目runtime不支持eclipse自家的编译器!
【6】以下举例均为使用普通wrapper,入参为Map和List的均以json形式表现!
【7】使用中如果入参的Map或者List为空,则不会加入最后生成的sql中!

警告:不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输:
①、wrapper 很重
②、传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)
③、正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作
④、我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr

【AbstractWrapper】


说明:QueryWrapper(LambdaQueryWrapper) UpdateWrapper(LambdaUpdateWrapper) 的父类用于生成 sql 的 where 条件,entity 属性也用于生成 sql 的 where 条件。注意:entity 生成的 where 条件与使用各个 api 生成的 where 条件没有任何关联行为

allEq】


个别参数说明:
【1】params:key为数据库字段名,value为字段值;
【2】null2IsNull:为true则在 map的 value为 null时调用 isNull 方法,为false时则忽略 value为 null的;

1 allEq(Map<R, V> params)
2 allEq(Map<R, V> params, boolean null2IsNull)
3 allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
4
5 例1: allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null
6 例2: allEq({id:1,name:"老王",age:null}, false)--->id = 1 and name = '老王'

个别参数说明:
【1】filter:过滤函数,是否允许字段传入比对条件中
【2】params 与 null2IsNull:同上

1 allEq(BiPredicate<R, V> filter, Map<R, V> params)
2 allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
3 allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
4
5 例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})--->name = '老王' and age is null
6 例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)--->name = '老王'

【eq】

1 //等于 =
2 eq(R column, Object val)
3 eq(boolean condition, R column, Object val)
4
5 例: eq("name", "老王")--->name = '老王'

【ne】

1 //不等于 <>
2 ne(R column, Object val)
3 ne(boolean condition, R column, Object val)
4
5 例: ne("name", "老王")--->name <> '老王'

【gt】

1 //大于 >
2 gt(R column, Object val)
3 gt(boolean condition, R column, Object val)
4
5 例: gt("age", 18)--->age > 18

【ge】

1 //大于等于 >=
2 ge(R column, Object val)
3 ge(boolean condition, R column, Object val)
4
5 例: ge("age", 18)--->age >= 18

【lt】

1 //小于 <
2 lt(R column, Object val)
3 lt(boolean condition, R column, Object val)
4
5 例: lt("age", 18)--->age < 18

【le】

1 //小于等于 <=
2 le(R column, Object val)
3 le(boolean condition, R column, Object val)
4
5 例: le("age", 18)--->age <= 18

【between】

1 //BETWEEN 值1 AND 值2
2 between(R column, Object val1, Object val2)
3 between(boolean condition, R column, Object val1, Object val2)
4
5 例: between("age", 18, 30)--->age between 18 and 30

【notBetween】

1 //NOT BETWEEN 值1 AND 值2
2 notBetween(R column, Object val1, Object val2)
3 notBetween(boolean condition, R column, Object val1, Object val2)
4
5 例: notBetween("age", 18, 30)--->age not between 18 and 30

【like】

1 //LIKE '%值%'
2 like(R column, Object val)
3 like(boolean condition, R column, Object val)
4
5 例: like("name", "王")--->name like '%王%'

【notLike】

1 //NOT LIKE '%值%'
2 notLike(R column, Object val)
3 notLike(boolean condition, R column, Object val)
4
5 例: notLike("name", "王")--->name not like '%王%'

【likeLeft】

1 //LIKE '%值'
2 likeLeft(R column, Object val)
3 likeLeft(boolean condition, R column, Object val)
4
5 例: likeLeft("name", "王")--->name like '%王'

【likeRight】

1 //LIKE '值%'
2 likeRight(R column, Object val)
3 likeRight(boolean condition, R column, Object val)
4
5 例: likeRight("name", "王")--->name like '王%'

【isNull】

1 //字段 IS NULL
2 isNull(R column)
3 isNull(boolean condition, R column)
4
5 例: isNull("name")--->name is null

【isNotNull】

1 //字段 IS NOT NULL
2 isNotNull(R column)
3 isNotNull(boolean condition, R column)
4
5 例: isNotNull("name")--->name is not null

【in】

 1 //字段 IN (value.get(0), value.get(1), ...)
2 in(R column, Collection<?> value)
3 in(boolean condition, R column, Collection<?> value)
4
5 例: in("age",{1,2,3})--->age in (1,2,3)
6
7 //字段 IN (v0, v1, ...)
8 in(R column, Object... values)
9 in(boolean condition, R column, Object... values)
10
11 例: in("age", 1, 2, 3)--->age in (1,2,3)

【notIn】

 1 //字段 IN (value.get(0), value.get(1), ...)
2 notIn(R column, Collection<?> value)
3 notIn(boolean condition, R column, Collection<?> value)
4
5 例: notIn("age",{1,2,3})--->age not in (1,2,3)
6
7 //字段 NOT IN (v0, v1, ...)
8 notIn(R column, Object... values)
9 notIn(boolean condition, R column, Object... values)
10
11 例: notIn("age", 1, 2, 3)--->age not in (1,2,3)

【inSql】

1 //字段 IN ( sql语句 )
2 where id < 3)
3 inSql(R column, String inValue)
4 inSql(boolean condition, R column, String inValue)
5
6 例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
7 例: inSql("id", "select id from table where id < 3")--->id in (select id from table

【notInSql】

1 //字段 NOT IN ( sql语句 )
2 notInSql(R column, String inValue)
3 notInSql(boolean condition, R column, String inValue)
4
5 例: notInSql("age", "1,2,3,4,5,6")--->age not in (1,2,3,4,5,6)
6 例: notInSql("id", "select id from table where id < 3")--->id not in (select id from table where id < 3)

【groupBy】

1 //分组:GROUP BY 字段, ...
2 groupBy(R... columns)
3 groupBy(boolean condition, R... columns)
4
5 例: groupBy("id", "name")--->group by id,name

【orderByAsc】

1 //排序:ORDER BY 字段, ... ASC
2 orderByAsc(R... columns)
3 orderByAsc(boolean condition, R... columns)
4
5 例: orderByAsc("id", "name")--->order by id ASC,name ASC

【orderByDesc】

1 //排序:ORDER BY 字段, ... DESC
2 orderByDesc(R... columns)
3 orderByDesc(boolean condition, R... columns)
4
5 例: orderByDesc("id", "name")--->order by id DESC,name DESC

【orderBy】

1 //排序:ORDER BY 字段, ...
2 orderBy(boolean condition, boolean isAsc, R... columns)
3
4 例: orderBy(true, true, "id", "name")--->order by id ASC,name ASC

【having】

1 //HAVING ( sql语句 )
2 having(String sqlHaving, Object... params)
3 having(boolean condition, String sqlHaving, Object... params)
4
5 例: having("sum(age) > 10")--->having sum(age) > 10
6 例: having("sum(age) > {0}", 11)--->having sum(age) > 11

【or】

1 //拼接 OR
2 or()
3 or(boolean condition)
4
5 例: eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'

注意事项:主动调用 or表示紧接着下一个方法不是用 and连接!(不调用or则默认为使用and连接)

1 //OR 嵌套
2 or(Consumer<Param> consumer)
3 or(boolean condition, Consumer<Param> consumer)
4
5 例: or(i -> i.eq("name", "李白").ne("status", "活着"))--->or (name = '李白' and status <> '活着')

【and】

1 //AND 嵌套
2 and(Consumer<Param> consumer)
3 and(boolean condition, Consumer<Param> consumer)
4
5 例: and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着')

【nested】

1 //正常嵌套 不带 AND 或者 OR
2 nested(Consumer<Param> consumer)
3 nested(boolean condition, Consumer<Param> consumer)
4
5 例: nested(i -> i.eq("name", "李白").ne("status", "活着"))--->(name = '李白' and status <> '活着')

【apply】

1 //拼接 sql
2 apply(String applySql, Object... params)
3 apply(boolean condition, String applySql, Object... params)
4
5 例: apply("id = 1")--->id = 1
6 例: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
7 例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")

注意事项:该方法可用于数据库函数 动态入参的 params对应前面 applySql内部的{index}部分。这样是不会有 sql注入风险的,反之会有。

【last】

1 //无视优化规则直接拼接到 sql 的最后
2 last(String lastSql)
3 last(boolean condition, String lastSql)
4
5 例: last("limit 1")

注意事项:只能调用一次,多次调用以最后一次为准。有 sql注入的风险,请谨慎使用

【exists】

1 //拼接 EXISTS ( sql语句 )
2 exists(String existsSql)
3 exists(boolean condition, String existsSql)
4
5 例: exists("select id from table where age = 1")--->exists (select id from table where age = 1)

【notExists】

1 //拼接 NOT EXISTS ( sql语句 )
2 notExists(String notExistsSql)
3 notExists(boolean condition, String notExistsSql)
4
5 例: notExists("select id from table where age = 1")--->not exists (select id from table where age = 1)

【QueryWrapper】

说明:继承自 AbstractWrapper,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper,可以通过 new QueryWrapper().lambda() 方法获取。

【select】

 1 //设置查询字段
2 select(String... sqlSelect)
3 select(Predicate<TableFieldInfo> predicate)
4 select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
5
6 //案例
7 //TestVO 查询的表对应的实体类
8 QueryWrapper<TestVO> wrapper = new QueryWrapper<>();
9 //data_type、value_code、column_a、column_b 均为数据库中的字段名,不是实体对象的属性
10 QueryWrapper<TestVO> queryWrapper = moduleInfoVOQueryWrapper.select("data_type", "value_code", "column_a", "column_b");
11 //我们将获取的值封装到 map 中传递
12 List<Map<String, Object>> maps = moduleInfoDAO.selectMaps(queryWrapper);

说明:过滤查询字段(主键除外),入参不包含 class 的调用前需要 wrapper内的 entity属性有值。这两类方法重复调用以最后一次为准

1 例: select("id", "name", "age")
2 例: select(i -> i.getProperty().startsWith("test"))

【UpdateWrapper】

说明:继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaUpdateWrapper,可以通过 new UpdateWrapper().lambda() 方法获取。

【set】

1 //SQL SET 字段
2 set(String column, Object val)
3 set(boolean condition, String column, Object val)
4
5 例: set("name", "老李头")
6 例: set("name", "")--->数据库字段值变为空字符串
7 例: set("name", null)--->数据库字段值变为null

【setSql】

1 //设置 SET 部分 SQL
2 setSql(String sql)
3
4 例: setSql("name = '老李头'")

【lambda】

获取 LambdaWrapper,在 QueryWrapper中是获取 LambdaQueryWrapper在 UpdateWrapper中是获取 LambdaUpdateWrapper

MyBatisPlus 实战字典的更多相关文章

  1. Mybatis-Plus 实战完整学习笔记(一)------简介

    第一章    简介      1. 什么是MybatisPlus                MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只 ...

  2. Mybatis-Plus 实战完整学习笔记(九)------条件构造器核心用法大全(上)

    一.Mybatisplus通用(公共方法)CRUD,一共17种(3.0.3版),2.3系列也是这么多,这个新版本一定程度进行了改造和删减. 二.构造器UML图(3.0.3)-----实体包装器,主要用 ...

  3. Mybatis-Plus 实战完整学习笔记(四)------全局参数配置

    一.全局配置设置 (1)全局配置Id自动生成 <!--定义mybatisplus全局配置--> <bean id="globalConfig" class=&qu ...

  4. Mybatis-Plus 实战完整学习笔记(三)------导入MybatisPlus环境

    1.dao层接口引入 package com.baidu.www.mplus.mapper; import com.baidu.www.mplus.bean.Employee; import com. ...

  5. Mybatis-Plus 实战完整学习笔记(二)------环境搭建

     第二章    使用实例   1.搭建测试数据库 -- 创建库 CREATE DATABASE mp; -- 使用库 USE mp; -- 创建表 CREATE TABLE tbl_employee( ...

  6. Mybatis-Plus 实战完整学习笔记(十一)------条件构造器删除,修改,conditon

    1.修改功能--其他过滤方式跟select一样 /** * 修改条件构造器 * @throws SQLException */ @Test public void selectUpdate() thr ...

  7. Mybatis-Plus 实战完整学习笔记(十)------条件构造器核心用法大全(下)

    31.升序orderByAsc 31.升序orderByAsc List<Employee> employeeList = employeeMapper.selectList(new Qu ...

  8. Mybatis-Plus 实战完整学习笔记(八)------delete测试

    1.根据ID删除一个员工deleteById /** * 删除客户 * * @throws SQLException */ @Test public void deletedMethod() thro ...

  9. Mybatis-Plus 实战完整学习笔记(七)------select测试二

    1.查询selectOne  (3.0.3版) @Test public void selectMethod() throws SQLException { // 根据ID获取一个对象的数据 Empl ...

  10. Mybatis-Plus 实战完整学习笔记(六)------select测试一

    查询方法(3.0.3) 1.查询一个员工的数据 @Test public void selectMethod() throws SQLException { // 根据ID获取一个对象的数据 Empl ...

随机推荐

  1. Mysql--查询"01"课程比"02"课程成绩高的学生的信息及课程分数

    今天在写Mysql代码作业时,写到这个题,感觉值得分享!!!!!!! 查询"01"课程比"02"课程成绩高的学生的信息及课程分数 分析如下: 首先先查询&quo ...

  2. Luogu P3368 【模板】树状数组 2 [区间修改-单点查询]

    P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表 ...

  3. bzoj 4573

    LCT神题... 首先暴力的做法就是每次在一个区间上link,然后暴力查询,时间复杂度$O(爆炸)$ 但是我们可以发现的是,每棵树之间互不影响! 因此我们可以考虑离线之后分别统计每棵树 但是这样做其实 ...

  4. WKWebView与JS的交互

    转载:https://www.jianshu.com/p/253e76a74b38 用普通的UIWebView和JS交互 大概核心代码是这样的 - (void)setupWebView{ self.w ...

  5. 1903021126-申文骏-Java第十一周作业-Java中继承、多态及抽象类的使用

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 第十一周作业 博客名称 1903021126-申文骏-Java第十一周作业-Java中继承.多态及抽象类的使用 作业要求 每道题要有题目 ...

  6. Spring之IOC(控制反转)入门理解

    在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高(假如程序耦合性过高,改一处代码通常要对其他地方也要做大量修改,难以维护).控制反转(Invers ...

  7. delete、truncate、drop的区别

    delete:只删除数据,不删除结构.删除的数据存储在系统回滚段中,可以回滚.不会自动提交事务. 在InnoDB中,delete不会真的把数据删除,mysql实际上只是给删除的数据打了个标记为已删除, ...

  8. 循环结构(Java)

    基本介绍 while循环语法 while(布尔表达式){循环内容} 只要布尔表达式为true,循环则会一直循环下去 我们大多数会让循环停止下来,我们需要一个让表达式失效的方式来结束循环 少部分需要循环 ...

  9. OSIDP-I/O管理和磁盘调度-11

    I/O设备 I/O设备分类:人可读.机器可读和远程通信三类. I/O设备之间的差别: 1.数据传送速率 2.应用领域 3.控制的复杂性 4.传送单位 5.数据表示形式 6.错误条件 I/O功能的组织 ...

  10. [整理]String用法/转换substring

    substring(a)从a开始 substring(a,b) [a,b] s=123456789 s.substring(3):456789 s.substring(0,3):1234