在上一篇文章讲述了如何使用Mybatis-plus自动生成代码,生成的代码具有单表操作数据库的能力,节约了开发时间。然后讲述了如何在Spring Boot中整合Mybatis-Plus。...Mybatis-Plus自动填充功能 在Matrix-web项目中,数据库的所有表都有四个公共字段,即create_by、create_time、update_by、update_time ,即存储了表数据的创建人...在对表插入一条数据的时候,需要自动填充四个字段,对表数据更新操作,需要更新后2个字段。但是如果在每个插入和更新业务逻辑里面, 手动的填充这四个字段,增加了工作量。..., /** * 更新填充字段 */ UPDATE, /** * 插入和更新填充字段 */ INSERT_UPDATE } 然后再表中映射的实体类...{ ... } 当调用SysUserMapper插入SysUser数据的时候,就会自动在数据库中插入create_by、create_time、update_by、update_time这四个数据。
当@Bind*系列注解用在对象上即表达一对一,当注解在List上时便表达一对多的意思,当外部对象本身就是查询集合的情况下便是多对多的场景了。...ADMIN".equals(userRule); } } BaseEntity使用 通常的表设计中,都会要求添加一些审计数据,比如创建人、创建时间、最后修改人、最后修改时间,但是这些属性又不应该属于业务的...为了简化数据审计字段的工作量,框架内部集成了BaseEntity @Getter @Setter public class BaseEntityID_TYPE extends Serializable...primary属性,在多个Entity映射一张表的情况下,确定主Entity是哪个,数据表生成的时候根据主表来生成。...,默认为id ---- 动态条件注解 @DynamicCondition 描述: 适用场景:数据筛选,比如根据不同权限获取不同数据,用户只能看到自己的数据,管理员能看到所有人的数据。
/** * 自动补充插入或更新时的值 * * @author luoYong * @date @Component public class MpMetaObjectHandler implements...,即对于sys_questions表所对应的实体我们将直接继承BaseEntity类即可,只要是insert、update等相关插入、修改方法执行时就不需要再管这些通用字段的赋值问题了,都会自动通过MpMetaObjectHandler...其次还有一点需要注意的就是,你这么设置,就要注意在你获取用户信息的时候,我是通过t登录生成token令牌从缓存中获取对于用户的userInfo;若对于开放接口(白名单)而言,它就是支持免登录通过接口调取...,那你就得注意获取用户信息是否支持了,如不支持那就你的实体最好就不要用自动填充,也就是不继承BaseEntity,自己在实体单独加上那些字段或者额外封装个通用实体类但不加mp的填充注解,这样也是可以的。...然后对于继承了BaseEntity又无法获取用户信息的,目前我也是没有办法避免它也会执行这个字段注入,发现个最笨的方法就是徒手写sql,在持久层定义mapper方法;虽然啊这方案比较low,但是能有效解决目前问题的
//生成set get 方法 需要引入lombok插件和jar @MappedSuperclass public class BaseEntity { @Id @GeneratedValue...,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。...update:加载hibernate时根据实体类model创建数据库表,这是表名的依据是@Entity注解的值或者@Table注解的值,sessionFactory关闭表不会删除,且下一次启动会根据实体...model更新结构或者有新的实体类会创建新的表。...validate:启动时验证表的结构,不会创建表 none:启动时不做任何操作 子类实体: import javax.persistence.*; @Data @Entity public class
:查询我的关注企业/收藏资讯/收藏产品列表等 然后我在service中调用如下: /** * 我的关注/收藏 * * @param page 分页参数 * @param userAttention...例如这里service的第二行是:在userAttention中调用UserAttention::getUserId,并以user_id=userId作为where条件,在对应的数据库表名为user_attention...中取出attention_id,但mybatis-plus的selectList返回的是UserAttention,所以我们再使用并行流转换为attentionId List ids = list...extends BaseEntity> typeClass; } 然后我们再配置mvc配置fastjson序列化枚举以及Mybatis-plus通用枚举之后 再到Controller中调用service...type,分页拿到不同表的数据 例如传入MEMBER 传入NEWS 传入PRODUCT 这样就能用最少的代码做最多的事,达到事半功倍的效果
开发方式,特别对单表或多表CRUD,利用继承节省了每个实体类的重复属性(创建时间、ID等字段),软件删除等功能,进行 crud 操作时不必时常考虑仓储的使用; 本文介绍 BaseEntity 一种极简约的...功能特点 自动迁移实体结构(CodeFirst),到数据库; 直接操作实体的方法,进行 CRUD 操作; 简化用户定义实体类型,省去主键、常用字段的配置(如CreateTime、UpdateTime...package FreeSql.Provider.Sqlite 1、定义一个主键 int 并且自增的实体类型,BaseEntity TKey 指定为 int/long 时,会认为主键是自增; public...{ get; set; } } 3、定义多主键的实体类型,可以在 static 构造函数中重写字段名; public class User2 : BaseEntity时,软删除条件会附加在每个表中; 有关更多查询方法,请参考资料:https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2
所以我直接将所有表中通用字段都统计了一遍,却发现有一部分字段每张表基本都涉及,比如uuid,creator、updator、create_time及update_time,总共将近20张表,其中这些字段在...14张表中是有完整出现的,所以,猜猜我接下来要干嘛? ...对的,被你们猜对了,第一步可以将这些通用字段都抽取出来,我这就直接将该通用字段抽到一个新实体中,且命名为:BaseEntity.java。...对于这部分通用字段的内容填充,在日常的增删改过程中,赋值逻辑,代码是不是大量重复了,对吧,你们仔细想想,是不是这部分字段赋值逻辑都是一模一样的,获取登录人信息设置创建人,修改人,然后new Date()...使用aop切面请求,在调用insert或update时,获取实体然后将通用字段信息赋值,这是最开始的玩法,但是现在啊,我不教学你那么复杂的实现方式,重复造轮子不好玩,我要的是你们能现学现用,而这一期的内容
部门表在设计的时候,有一个 ancestors 字段,通过这个字段可以非常方便的查询一个部门的子部门。 最后两张关联表就没啥好说了。 好了,这些都分析完了,我们就来看看具体的实现。 3....由于数据权限实现的核心思路就是在要执行的 SQL 上动态追加查询条件,那么动态追加的 SQL 必须要考虑到原本 SQL 定义时的部门表别名和用户表别名。这两个属性就是用来干这事的。...由于一个用户可能有多个角色,所以在 dataScopeFilter 方法中要先遍历角色,不同的角色有不同的数据权限,这些不同的数据权限之间通过 OR 相连,最终生成的补充 SQL 的格式类似这样 AND...那么这里还涉及到一个细节,前面 SQL 在定义时,用的表别名是什么,我们在 @DataScope 中指定的别名就要是什么。...sys_user 表中的 dept_id 字段是表示这个用户所属的部门 id,而 sys_role_dept 表中是描述某一个角色能够操作哪些部门,这是不一样的,把这个捋清楚了,上面的 SQL 就好懂了
) // 增加过滤表前缀 // .addTableSuffix("abc") // 增加过滤表后缀 //....addFieldPrefix("sys_") // 增加过滤字段前缀 // .addFieldSuffix("_flag") // 增加过滤字段后缀...is 前缀 默认值:false .enableTableFieldAnnotation() // 开启生成实体时生成字段注解 默认值:false...("deleteFlag") // 逻辑删除属性名(实体) // .naming(NamingStrategy.no_change) // 数据库表映射到实体的命名策略...NamingStrategy.underline_to_camel // .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略
不同于现有的所有其他 JavaScript ORM 框架,TypeORM 支持 Active Record 和 Data Mapper 模式(在我这次写的项目中,使用的是 Active Record...MVC 架构,实际开发过程中还会有更细分的优化,主要体现两方面: 为了方便后期扩展,还会引入 中间件(middleware) 机制,这些概念相信但凡写过 Koa/Express 的都知道 —— 不过这里还是重述一下...字段,它的类型是 Article[] ,在使用 @Field 注解时需要注意,因为我们想表示数组一定存在但有可能为空数组情况,需要使用 {nullable: "items"}(即 [Item]!)...class Article extends BaseEntity { @PrimaryGeneratedColumn() @Field(type => ID) id: number;...前端的技术发展迭代相对来说迭代比较快,这是好事,能让你用新技术做得更少、收获地更多;当然不可否认这对前端同学也是挑战,需要你都保持不断学习的心态,去及时补充这些新的知识。学无止境,与君共勉。
你可能不希望这样的事情发生:在某些情况下,当您更改数据测试时,你希望你的变化后数据库同步更新。在这种情况下,你想要做一个有条件的插入操作:只有当它不存在的时候,插入一行。...您可以在创建新的电影时指定一个电影等级。...你看到这个错误,因为更新的的Movie模型类中比现在Movie现有数据库表的schema不同。 (在数据库表中没有Rating列。) 有几个解决错误的方法: 1....下面的图片显示了 程序包管理器控制台窗口的输出 (日期戳前面添加的评级会有所不同) ? 重新运行应用程序,然后浏览 /Movies 的 URL。您可以看到新的评级字段。 ?...该项目目前正在使用的迁移 (migrations),当你添加新的字段或更新数据库Schema, 你不需要删除数据库。在下一节中,我们将让更多的架构更改,并使用迁移来更新的数据库。
在数据访问层,我们可以专门的为每个类进行封装业务处理类,但是其中类与类之间相同或类似的代码段太多,对于编码人员来说,更是浪费时间,同样的代码,要在项目的不同使用地方,进行多次的复制修改几个代码字段即可使用...基于以上考虑引出了我们的Repository设计模式。 Repository设计模式 在《企业架构模式》中,译者将Repository翻译为资源库。...给出如下说明:通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调。...类 BaseEntity类中定义了所有参加数据操作实体的公共属性,因此我们把该类定义为抽象类,作为派生类的的基类。...具有一定的灵活性 我们发现接口的泛型TEntity有一个约束需要继承BaseEntity,BaseEntity就是把实体中公共的属性抽取出来,比如:Id(主键),CreateDate(创建时间)等。
即冗余字段,不与数据库任何字段对应。...MySqlMapper中的方法如下: /** * 批量插入,支持批量插入的数据库可以使用,例如MySQL,H2等,另外该接口限制实体包含`id`属性并且必须为自增列 */ public...int insertList(List recordList); /** * 插入数据,限制为实体包含`id`属性并且必须为自增列,实体配置的主键策略无效 */ public int...为实体类中的属性名,非数据度字段名。...boolean exists, boolean notNull这两个参数的含义为: 若exists为true时,如果字段不存在就抛出异常,false时,如果不存在就不使用该字段的条件, 若notNull
@MappedSuperclass标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够隐射在其子类对用的数据库表中 @MappedSuperclass标识得嘞不能再有@Entity...(name = "id") //声明该属性与数据库字段的映射关系。...在javax.persistence.GenerationType中定义了以下几种可供选择的策略: IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式; AUTO...可以用来在使用jpa的时记录一些业务无关的字段,比如最后更新时间等等。...2)数据库插入 @PrePersist和@PostPersist事件在实体对象插入到数据库的过程中发生: @PrePersist事件在调用persist()方法后立刻发生,此时的数据还没有真正插入进数据库
大家好,又见面了,我是你们的朋友全栈君。 为了避免每次在查询的时候加上是否删除字段,做了一下封装。...deletedAt 是否删除字段 @MappedSuperclass @Data public abstract class BaseEntity { private Timestamp deletedAt...; public abstract Long getId(); } @MappedSuperclass 通过这个注解,我们可以将该实体类当成基类实体,它不会隐射到数据库表,但继承它的子类实体在隐射时会自动扫描该基类实体的隐射属性...,添加到子类实体的对应数据库表中。...但当你重写jpa默认的查询机制,还是需要手动加上deleted_at is null的过滤条件。
这里主要讲了分页的实例,框架怎么搭建就不再说明,主要是在这里的基础上来增加分页功能的。...--设置domain类和数据库中表的字段一一对应,注意数据库字段和domain类中的字段名称不致,此处一定要! ...@Param("userName") 接下来就可以在service层中添加分页查询的的接口了 5、接口类 [html] view plaincopy /** * * @author...中存放的就是数据 打个断点看下就知道了: ?...-- 以下 validator ConversionService 在使用 mvc:annotation-driven 会 自动注册--> id="validator" class=
implements Serializable{} 该类仅仅实现了Serializable接口,在创建业务实体时需要继承该类,这也是基本的设计规则,方便后期添加全局统一的字段或者配置。...注解用于配置在查询结果的字段上,如:我们查询用户头像时定义的字段为userHeadImage,我们这时仅仅需要在userHeadImage字段上添加ResourceField即可。...、多个对象进行调用不同的方法 统一资源方法自动根据@ResourceField注解配置信息以及对象类型配置@Id字段的值作为目标对象编号设置资源到返回对象内。...我们一般在开发过程中,用户表内对应的实体是不允许根据业务逻辑修改的,如果你需要变动需要继承实体后添加对应的字段即可。...在方法返回对象时就会被资源自动处理分别将查询到的资源设置到UserDetailDTO内的headImage、backImage。
model 包中建立BaseEntity @Data public abstract class BaseEntityID extends Serializable> implements Serializable...mapper 行为信息 在 model 下创建 BaseEntity @Data public abstract class BaseEntityID extends Serializable> implements..."), @Result(property = "passWord", column = "password") ) property 与 column 分别表示本地pojo和数据库表中字段的对应...的用户信息 @Delete("delete from sys_user where id = #{id}") int deleteUser(Long id); //插入用户信息...六、代码生成插件 在IDEA中安装 GenerateAllSetter 插件,在创建实体类时可以自动为我们生成对象的 setter 方法,例如 TbUser tbUser = new TbUser();
下面重点来说明一下管理后台的DynamicData的结构,先可以阅读一下Scott Guthrie 的文章 新的ASP.NET动态数据支持: ASP.NET 动态数据在进行创建和更新数据时还会对所录入的数据进行验证...比如字段是日期类型,则只允许录入日期。 ASP.NET 动态数据具有自动格式功能:比如 bit 类型的字段显示为一个多选框,而标识字段不会在插入数据时显示出来。...DynamicData/Content/FilterUserControl.ascx 在显示表中的数据时,该控件显示在表头,用以过滤表中的内容,比如可以只列表产品目录为“实用工具”的产品。...包含各种类型的字段在查看和创建、编辑时所呈现的控件。 DynamicData/PageTemplates 文件夹。包含在进行查看、编辑时的页面模板。...Dynamic Data还有一个快速开发的基础是脚手架,脚手架是一种机制,通过脚手架,我们不必再为每一个表的增加、查看、修改做不同的页面,因为脚手架会自动生成这些页面。
图2.1 bootstrap.yml内容如下,我们不需要手动创建数据库表,jpa/hiberate会自动会为我们创建的 server: port: 9092 servlet: context-path...org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy,那么当实体的属性为驼峰结构时,对应到数据库表的字段上,会用...= userRepository.save(user); log.info("返回,{}", save); return save; } } 4、验证 在浏览器地址栏中输入.../serviceB/queryUser/1 一些思考: 自动创建表结构,我们不需要手动去创建,我们修改实体的时候,系统会自动更新数据库中的表结构。...所有实体都继承BaseEntity,那么每个实体对应的数据库表,在创建日期、更新日期等共有属性都同一了,这样在一定程度上便于代码理解和系统维护。
领取专属 10元无门槛券
手把手带您无忧上云