范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

MybatisPlus入门实践

  简介
  Mybatis-Plus 简称 MP ,是 Mybatis 的增强工具,提供了一批开箱即用的功能、特性、接口、注解,简化了应用程序访问数据库的相关操作,完善了Mybatis作为ORM仅能做到半自动的不足,提高了开发人员的开发效率。
  MP是社区产品,当前源代码在Github上面进行维护,基于Apache2.0开源协议,可放心在商业项目上使用。  常用注解TableName:表名注解,标识实体类对应的数据库表  TableId:主键注解,标识此属性对应数据库中的主键字段  TableField:字段注解(非主键)  CRUD接口
  MP的宗旨就是简化编码,所以一般而言,都是尽量直接使用 service 层接口。若确需手写 sql , 在 mapper 层中编写注解,当然也可以编写xml,更加推荐注解方式,因为xml方式下类型推导和引用会失效。
  以下内容摘抄自官网  Service层接口save// 插入一条记录(选择字段,策略插入) boolean save(T entity); // 插入(批量) boolean saveBatch(Collection entityList); // 插入(批量) boolean saveBatch(Collection entityList, int batchSize);saveOrUpdate// TableId 注解存在更新记录,否插入一条记录 boolean saveOrUpdate(T entity); // 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法 boolean saveOrUpdate(T entity, Wrapper updateWrapper); // 批量修改插入 boolean saveOrUpdateBatch(Collection entityList); // 批量修改插入 boolean saveOrUpdateBatch(Collection entityList, int batchSize);remove// 根据 entity 条件,删除记录 boolean remove(Wrapper queryWrapper); // 根据 ID 删除 boolean removeById(Serializable id); // 根据 columnMap 条件,删除记录 boolean removeByMap(Map columnMap); // 删除(根据ID 批量删除) boolean removeByIds(Collection<? extends Serializable> idList);update// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset boolean update(Wrapper updateWrapper); // 根据 whereWrapper 条件,更新记录 boolean update(T updateEntity, Wrapper whereWrapper); // 根据 ID 选择修改 boolean updateById(T entity); // 根据ID 批量更新 boolean updateBatchById(Collection entityList); // 根据ID 批量更新 boolean updateBatchById(Collection entityList, int batchSize);get// 根据 ID 查询 T getById(Serializable id); // 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1") T getOne(Wrapper queryWrapper); // 根据 Wrapper,查询一条记录 T getOne(Wrapper queryWrapper, boolean throwEx); // 根据 Wrapper,查询一条记录 Map getMap(Wrapper queryWrapper); // 根据 Wrapper,查询一条记录  V getObj(Wrapper queryWrapper, Function<? super Object, V> mapper);list// 查询所有 List list(); // 查询列表 List list(Wrapper queryWrapper); // 查询(根据ID 批量查询) Collection listByIds(Collection<? extends Serializable> idList); // 查询(根据 columnMap 条件) Collection listByMap(Map columnMap); // 查询所有列表 List> listMaps(); // 查询列表 List> listMaps(Wrapper queryWrapper); // 查询全部记录 List listObjs(); // 查询全部记录  List listObjs(Function<? super Object, V> mapper); // 根据 Wrapper 条件,查询全部记录 List listObjs(Wrapper queryWrapper); // 根据 Wrapper 条件,查询全部记录  List listObjs(Wrapper queryWrapper, Function<? super Object, V> mapper);page// 无条件分页查询 IPage page(IPage page); // 条件分页查询 IPage page(IPage page, Wrapper queryWrapper); // 无条件分页查询 IPage> pageMaps(IPage page); // 条件分页查询 IPage> pageMaps(IPage page, Wrapper queryWrapper);count// 查询总记录数 int count(); // 根据 Wrapper 条件,查询总记录数 int count(Wrapper queryWrapper);chain// 链式查询 普通 QueryChainWrapper query(); // 链式查询 lambda 式。注意:不支持 Kotlin LambdaQueryChainWrapper lambdaQuery();  // 示例: query().eq("column", value).one(); lambdaQuery().eq(Entity::getId, value).list();Mapper层接口insert// 插入一条记录 int insert(T entity);delete// 根据 entity 条件,删除记录 int delete(@Param(Constants.WRAPPER) Wrapper wrapper); // 删除(根据ID 批量删除) int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 根据 ID 删除 int deleteById(Serializable id); // 根据 columnMap 条件,删除记录 int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap);update// 根据 whereWrapper 条件,更新记录 int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper whereWrapper); // 根据 ID 修改 int updateById(@Param(Constants.ENTITY) T entity);select// 根据 ID 查询 T selectById(Serializable id); // 根据 entity 条件,查询一条记录 T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);  // 查询(根据ID 批量查询) List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 根据 entity 条件,查询全部记录 List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); // 查询(根据 columnMap 条件) List selectByMap(@Param(Constants.COLUMN_MAP) Map columnMap); // 根据 Wrapper 条件,查询全部记录 List> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper); // 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值 List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper);  // 根据 entity 条件,查询全部记录(并翻页) IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); // 根据 Wrapper 条件,查询全部记录(并翻页) IPage> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); // 根据 Wrapper 条件,查询总记录数 Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);实践pom
  需要添加的maven依赖:  mysql-connector-java:Mysql 官方的jdbc驱动器  spring-boot-starter-jdbc:数据源自动配置;提供一个JdbcTemplate 简化使用;事物管理。  druid-spring-boot-starter:数据库连接池管理  mybatis-plus-boot-starter:MP的依赖,引入MP之后无需再次引入mybatis。  springfox-boot-starter:swagger3.0,接口自测工具
  jdbc是Java提供的一种标准规范,具体的实现由各个数据库厂商去实现。对开发者来说屏蔽了不同数据库之间的区别,可以使用相同的方式(Java API)去操作不同的数据库。两个设备之间要进行通信需要驱动,不同数据库厂商对jdbc的实现类就是去连接数据库的驱动,如mysql-connector-java连接mysql数据库的驱动。  配置文件数据源配置spring:   application:     name: mp-service   datasource:     #url: jdbc:mysql://192.168.1.152:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8     #username: root     #password: 123456     #driver-class-name: com.mysql.cj.jdbc.Driver     druid:       #或 spring.datasource.url       url: jdbc:mysql://192.168.1.152:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8       #或 spring.datasource.username       username: dev-luyubo       #或 spring.datasource.password       password: KjJhAjXJ       #或 spring.datasource.driver-class-name       driver-class-name: com.mysql.cj.jdbc.Driver日志配置#配置mp日志打印到输出。此配置若和logging.level.org.apache.ibatis.logging: debug 同时存在,后者将不生效 #mybatis-plus: #configuration: #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   logging:   level:     com.ramble: debug     #配置mp日志打印到项目配置的日志实现框架,默认为logback     org.apache.ibatis.logging: debug数据库表SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user`  (   `id` bigint NOT NULL COMMENT "主键ID",   `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT "姓名",   `age` int NULL DEFAULT NULL COMMENT "年龄",   `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT "邮箱",   `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,   PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, "Jone", 18, "test1@baomidou.com", NULL); INSERT INTO `user` VALUES (2, "Jack", 20, "test2@baomidou.com", NULL); INSERT INTO `user` VALUES (3, "Tom", 28, "test3@baomidou.com", NULL); INSERT INTO `user` VALUES (4, "Sandy", 21, "test4@baomidou.com", NULL); INSERT INTO `user` VALUES (5, "Billie", 24, "test5@baomidou.com", NULL); SET FOREIGN_KEY_CHECKS = 1;实体model@TableName("user") @Data @Accessors(chain = true) public class User implements Serializable {     @TableId     private Long id;     @TableField("name")     private String name;     private Integer age;     private String email; }repository
  若使用 Repository 注解,需手动设置扫描路径,建议使用 Mapper 注解  @Mapper public interface UserMapper extends BaseMapper { }service
  UserService:  public interface UserService  extends IService {     List findList(UserConditionDto condition);     Page search(UserConditionDto condition); }
  UserServiceImpl:  @Slf4j @Service @AllArgsConstructor public class UserServiceImpl extends ServiceImpl implements UserService {     /**      * 获取列表数据      *      * @param condition      * @return      */     @Override     public List findList(UserConditionDto condition) {         return this.list(this.buildQueryWrapper(condition));     }     /**      * 搜索数据      *      * @param condition      * @return      */     @Override     public Page search(UserConditionDto condition) {         QueryWrapper query = this.buildQueryWrapper(condition);         Page page = new Page<>(condition.getPageNum(), condition.getPageSize());         return this.page(page, query);     }     /**      * 构造 queryWrapper      *      * @param condition      * @return      */     private QueryWrapper buildQueryWrapper(UserConditionDto condition) {         Assert.notNull(condition, CommonErrorMsgEnum.PARAM_IS_NULL.toString());         QueryWrapper query = new QueryWrapper<>();         //name 模糊匹配         if (StringUtils.hasText(condition.getName())) {             query.like("name", condition.getName());         }         if (StringUtils.hasText(condition.getEmail())) {             query.like("email", condition.getEmail());         }         //id 精确查找         if (null != condition.getId() && condition.getId() > 0) {             query.eq("id", condition.getId());         }         //时间范围         if (null != condition.getStartTime()) {             if (null != condition.getEndTime()) {                 query.in("create_time", condition.getStartTime(), condition.getEndTime());             } else {                 LocalDateTime now = LocalDateTime.now();                 query.in("create_time", condition.getStartTime(), now);             }         } else {             if (null != condition.getEndTime()) {                 query.ge("create_time", condition.getEndTime());             }         }         //默认时间倒序         query.orderByDesc("create_time");         return query;     } }         /**      * 构造查询包装器,lambda 链式查询,不用手写字段名称,通过数据库实体映射      *      * @param param      * @return      */     private LambdaQueryWrapper buildQueryWrapper(TagInfoParam param) {         LambdaQueryWrapper query = new LambdaQueryWrapper<>();         if (null == param) {             return query;         }         query.like(StringUtils.isNotEmpty(param.getTagCode()), TagInfo::getTagCode, param.getTagCode())                 .like(StringUtils.isNotEmpty(param.getTagName()), TagInfo::getTagName, param.getTagName())                 .like(StringUtils.isNotEmpty(param.getTagSimpleName()), TagInfo::getTagSimpleName, param.getTagSimpleName())                 .eq(null != param.getTagId(), TagInfo::getId, param.getTagId()).eq(TagInfo::getIsDeleted, 0);         return query;     }Mapper层注解语法基础语法script  where  if  foreach  choose-when-otherwise(if-else ;switch-case-default)  package com.ramble.mybatisplus.repository; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ramble.mybatisplus.model.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Set; @Mapper public interface UserMapper extends BaseMapper {     @Select({             ""     })     User findUserById(@Param("user") User user);     @Select({             ""     })     List findUserByIds(@Param("ids") Set ids);     @Select({             ""     })     List findUser(@Param("user") User user, @Param("currentUserName") String currentUserName); }
华为P50Pro手机正式发售,必须给点赞从华为的万象新天新品发布会以后,我就一直在网上关注预购的信息。8月12日1008,华为P50Pro,搭载麒麟9000芯片,还带来了更多移动影像全新体验,让我惊喜不已。年度颜值最高的早鸟票已售罄,华为HDC开发者大会与你相约松山湖一年一度的华为HDC开发者大会是科技领域的盛会,2021年全新一届大会举办时间已定档,10月22日至24日,与你相约有着华为欧洲小镇之称的东莞松山湖。,作为一场技术干货的盛宴,也是华为P50Pro旗舰手机突破光学设计局限,引领业界画质革新就在前几日,华为P50Pro(麒麟9000)在华为商城各大授权电商华为授权体验店授权零售商等渠道正式开售。自从这个系列上市以后,就吸引了很多人的关注。华为P50Pro展示了华为在手华为P50Pro原色表现让人眼前一亮,带来最佳视觉体验华为P50Pro旗舰手机已经于8月12日1008正式开售了,除了保持着P系列对摄影和美学的不懈追求,华为P50Pro搭载的无界微曲屏幕看起来艳丽通透,让人眼前一亮。小编我出于对这款实力担当的华为智慧屏V75Super,秒杀老牌劲敌索尼华为中国的最强电子企业,一直致力于打造属于我国自己的顶尖产品,前不久华为推出鸿蒙电视华为智慧屏V75Super,这款智慧屏有着超高的颜值,在画面和音质上也充分体现了华为的用心,今天三星GalaxyS21最新发布日期,价格,规格和泄漏三星GalaxyS21即将面世。这是到目前为止我们所知道的一切。我们将看到所有这些三星GalaxyS21传闻的准确性如何。由于有关三星下一部手机的大多数细节都显示出过去几个月来不断有线网卡多少钱,有线网卡价格哪家好关于有线网卡多少钱,相信很多人对这行不太了解所以都很想知道,关于有线网卡价格型号和有线网卡厂商,具体如何能买到性价比高的有线网卡,下面就来解答下关于这方面相关的问题。1。有线网卡是性价比之选,坚果O1双模式征服消费者投影仪越来越成为家庭中必备的数码产品了,不过市场之大,很多用户都不知道自己想要的或者说是真正适合自己的产品类型,今天小编给大家分享一款性价比之选,这款投影仪既可以成为你的观影工具,苹果iPhone12ProMax相机评测大而美丽上个月,iPhone12ProMax被宣布为iPhone12家族中的顶级设备,它具有最大的屏幕和苹果新一批手机中指定的最令人印象深刻的主摄像头。主宽幅相机在一个具有1。7摄影位的12020年最好的智能手机相机,你的手机上榜了吗?在DXOMARK,我们每年都会测试大量智能手机相机,涵盖从预算到高端的众多品牌和型号。如果您想了解特定型号与竞争对手相比的整体相机性能,只需查看我们的DXOMARK相机排名即可。对索尼A9II优异的传感器性能,实惠的价格,尼康D5的竞争者索尼a9II是原始a9的更新版本,它是a7系列以上系列中的第一款旗舰产品。与原始型号一样,新型号针对专业运动市场,并且使24。2MPExmorRS堆叠式CMOS传感器保持不变。借助
能净化空气的电脑电源,艾湃电竞AP550Ti纳米光触媒电源评测台式机用一段时间后,机箱内就会产生一些灰尘,如果不进行清洁,时间一长内部很容易滋生各种细菌。而对于电脑内部的清洁,估计很少有人会定期清理。也许正是出于此原因,现在市面上出现了一种纳对付骗子的神器骗子太多了,没证据怎么办,不如佩戴随身录像机,走到哪里录到哪里!这样就有证据了。专业录像机1080P摄像机背夹录音笔录像神器执法记录仪高清防抖摄影机骑行DV家用设备运动相机摄影头一一个大一狗的宿舍桌面放假回家了,看着大家都在分享自己桌面,我也来分享一个大一狗的桌面v1。0流汗滑稽,文笔一般笔记本拯救者r9000p放假回家了,看着大家都在分享自己桌面,我也来分享一个大一狗的桌面v手机为什么越用越卡?原因在这四点,了解之后轻松解决手机卡顿相信朋友们都很清楚,无论是安卓手机还是iPhone手机,一旦使用久了就难免会遇见手机卡顿问题,这点是智能手机都无法避免的一个问题。出现问题无非就这四点内存不足配置落伍系统问题手机故iPhone演示机除了便宜几乎全是缺点,不建议购买演示机顾名思义就是放在店里供顾客体验的手机。你在授权店直营店里面看到的iPhone都是演示机,但你如果需要购买,卖给你的则是普通的零售机。演示机最大的优点就是价格便宜,实际价格比零绿联推出便携式吸尘器,轻便小巧吸力更大,家庭清洁好帮手不知道大家有没有用过便携式的吸尘器?这种吸尘器和普通的家用吸尘器原理一致,不过构型不太一样,体积比较小巧,可以整个拿在手里,一般都用锂电池供电,不用插线,因此使用时还是很灵活的。其iOS15。2吐槽大会,网友热的拿不住手机!这些评论太有意思了不知道各位小伙伴发现没有,最近很久没有收到iOS15的更新推送了,最新的一次还是一个月之前的iOS15。2正式版,很多小伙伴也会在后台私信问我为什么最近iOS15不更新了,iOS1选机电池在大也比不过长续航,这几款手机出门不用带充电宝了随着进入到2022年,搭载骁龙8Gen1的机型逐渐发布,面对依旧火热的骁龙芯片,各家厂商除了优化这颗处理器的同时,都为手机配备了大容量电池和大面积的散热板,尽管如此,续航时间并不是旧手机你都是怎么处理的呢?看我如何旧机换新机本内容来源于什么值得买APP,观点仅代表作者本人作者薄荷有点凉创作立场声明经验分享从苹果脱粉了后就入手了小米手机,作为国内一个性价比超级高的品牌,一入坑就不能自拔,基本上是一年换一索尼手机一言难尽的高冷如果用一个词来形容今天的索尼手机,思考良久,想了一个词高冷。为何不用高端?索尼手机不是卖得挺贵而且质感与iphone不相上下吗?贵是索尼旗舰手机一直的特色,不贵就不是索尼了,近些年花粉别买错了,华为最值得买的两款5G手机,价格已创新低即便是华为去年推出了一些4G手机,销量还是要比一些厂商的5G旗舰更好。很多华为粉丝都在默默期待华为的王者归来,尽快推出新的5G旗舰。华为归来是迟早的事情,只是这个时间点,现在真不好